Модульные тесты для автоматически сгенерированного кода: автоматический или ручной? - PullRequest
3 голосов
/ 10 мая 2009

Я знаю аналогичные вопросы задавались ранее, но на самом деле они не располагают информацией, которую я ищу - я не спрашиваю о механике создания модульных тестов, но о том, хорошая идея.

Я написал модуль на Python, который содержит объекты, представляющие физические константы и единицы измерения. Многие единицы формируются путем добавления префиксов к базовым единицам - например, из m я получаю cm, dm, mm, hm, um, nm, pm и т. д. И то же самое для s, g, C и т. д. Конечно, я написал функцию для этого, поскольку конечный результат составляет более 1000 отдельных единиц, и было бы очень сложно выписать их все вручную ;-) Это работает примерно так (не фактически). код):

def add_unit(name, value):
    globals()[name] = value
    for pfx, multiplier in prefixes:
        globals()[pfx + name] = multiplier * value

add_unit('m', <definition of a meter>)
add_unit('g', <definition of a gram>)
add_unit('s', <definition of a second>)
# etc.

Проблема возникает, когда я хочу написать модульные тесты для этих модулей (без каламбура), чтобы убедиться, что все они имеют правильные значения. Если я напишу код, который автоматически генерирует контрольный пример для каждого модуля в отдельности, любые проблемы, связанные с функцией генерации модуля, вероятно, также обнаружатся в функции генерации теста. Но, учитывая альтернативу (выписывая все 1000+ тестов вручную), должен ли я в любом случае просто написать функцию генерации тестов, проверить ее действительно тщательно и надеяться, что она работает правильно? Или я должен протестировать, скажем, только одну серию единиц (m, cm, dm, km, nm, um и все другие кратные значения счетчика), достаточно, чтобы Вы уверены, что функция генерации устройства работает? Или что-то еще?

Ответы [ 4 ]

1 голос
/ 11 мая 2009

Пишите только достаточное количество тестов, чтобы убедиться, что генерация вашего кода работает правильно (достаточно, чтобы управлять дизайном императивного кода). Декларативный код редко ломается. Вы должны только проверять вещи, которые могут сломаться. Ошибки в декларативном коде (например, в вашем случае и, например, в макетах пользовательского интерфейса) лучше обнаруживать при пробном тестировании, поэтому написание обширных автоматизированных тестов для них - пустая трата времени.

1 голос
/ 10 мая 2009

Вы правы, чтобы выявить слабость автоматической генерации тестовых случаев. Полезность теста заключается в том, что он выбирает два разных пути (ваш код и ваше собственное умственное мышление), чтобы найти ответ, который должен быть одинаковым - если вы используете один и тот же путь оба раза, ничего не тестируется.

В итоге: Никогда не пишите автоматически сгенерированные тесты , если только алгоритм генерации результатов теста не будет значительно проще, чем алгоритм, который вы тестируете. (Тестирование алгоритма сортировки является примером того, когда автоматически сгенерированные тесты были бы хорошей идеей, поскольку легко проверить, что список чисел находится в отсортированном порядке. Другим хорошим примером была бы программа решения головоломок , как было предложено Автор: ChrisW в комментарии. В обоих случаях автоматическая генерация имеет смысл, поскольку гораздо проще проверить правильность заданного решения, чем сгенерировать правильное решение.)

Мое предложение для вашего случая: Вручную протестируйте небольшое репрезентативное подмножество возможностей.

[Пояснение: некоторые типы автоматических тестов являются подходящими и очень полезными, например, Fuzzing . Я имею в виду, что автоматическое создание модульных тестов для сгенерированного кода бесполезно.]

1 голос
/ 10 мая 2009

Я бы сказал, что лучший подход - это модульное тестирование генерации, и в рамках модульного теста вы можете взять образец сгенерированного результата (только в том случае, если тестирование тестирует что-то, что вы считаете значительно отличающимся от других сценариев). ) и поместите его в модульный тест, чтобы убедиться, что генерация работает правильно. Помимо этого, существует небольшая ценность модульного теста при определении каждого сценария в автоматическом режиме. Функциональное тестирование может иметь значение при составлении некоторого функционального теста, который использует сгенерированный код для выполнения любых целей, которые вы имеете в виду, чтобы обеспечить более широкий охват различных потенциальных единиц.

1 голос
/ 10 мая 2009

Если вы автоматически генерируете тесты:

  • Вы можете быстрее прочитать все тесты (чтобы проверить их на правильность), как если бы они были написаны вручную.

  • Они также могут быть более удобными в обслуживании (их легче редактировать, если вы хотите отредактировать их позже).

...