Стресс-тестирование

  • Метод поиска багов, заключающийся в генерации случайных тестов и сравнивании результатов двух решений
  • Очень полезен на школьных олимпиадах, когда есть много времени, или когда уже написанно решение на маленькие подгруппы

Суть такая:

  • Есть решение smart — быстрое, но в котором есть баг, который хотим найти
  • Пишем решение stupid — медленное, но точно корректное
  • Пишем генератор gen — печатает какой-то корректный тест, сгенерированный случайно
  • Кормим всё в скрипт checker, который n раз генерирует тест, даёт его на ввод stupid-у и smart-у, сравнивает выводы и останавливается, когда они отличаются

Примерный код скрипта:

In [ ]:
import os, sys

f1, f2, gen, iters = sys.argv

for i in range(int(iters)):
    print('Test', i+1)
    os.popen('python3 %s > test.txt' % gen)
    v1 = os.popen('./%s < test.txt' % f1).read()
    v2 = os.popen('./%s < test.txt' % f2).read()
    if v1 != v2:
        print test
        print("Correct:")
        print v1
        print("Wrong:")
        print v2
        break

Автор обычно запускает его командой python3 checker.py stupid smart gen.py 100, предварительно скомпилировав stupid и smart в ту же директорию, что и сам checker.py.

Скрипт написан под Linux. Для Windows нужно убрать «./» во всех системных вызовах.

gen.py автор тоже обычно пишет на питоне, но вообще его тоже можно писать на чём угодно, сделать исполняемым и вызывать через ./gen. Пример gen-а, генерирующего случайную строку из символов "a", "b" и "c" длины от 1 до 10:

In [ ]:
from random import randint, choice

n = randint(1, 10)

print(n)

for _ in range(n):
    print(choice('abc'), end='')