Тестирование DUnit на основе данных

Обычно DUnit работает так: вы пишете несколько опубликованных методов, а DUnit запускает их как тесты. Я хочу немного по-другому. Я хочу создавать тесты во время выполнения на основе данных. Я пытаюсь протестировать конкретный модуль, который обрабатывает входные файлы для создания выходных файлов. У меня есть набор тестовых входных файлов с соответствующими заведомо исправными выходными файлами. Идея состоит в том, чтобы динамически создавать тесты, по одному для каждого входного файла, которые обрабатывают входные данные и сравнивают выходные данные с заведомо исправными.

Однако фактический источник данных здесь не важен. Сложность состоит в том, чтобы заставить DUnit работать в соответствии с данными. Ради этой проблемы предположим, что источником данных был просто генератор случайных чисел. Вот пример конкретной проблемы, которая раскрывает суть проблемы:

Создайте несколько тестовых объектов (TTestCase или что-то еще) во время выполнения, скажем, 10 из них, где каждый

  1. Именуется во время выполнения из случайно сгенерированного целого числа. (Под «именем» я подразумеваю имя теста, которое появляется в дереве запуска тестов.)
  2. Проходит или не проходит на основе случайного целого числа. Считайте четным, а не нечетным.

С точки зрения дизайна DUnit выглядит так, как будто он был разработан с учетом достаточной гибкости, чтобы сделать такие вещи возможными. Я не уверен, что это так. Я попытался создать свой собственный тестовый класс, унаследовав его от TAbstractTest и ITest, но некоторые важные методы были недоступны. Я также пробовал унаследовать от TTestCase, но этот класс тесно связан с идеей запуска опубликованных методов (а тесты названы в честь методов, поэтому я не мог просто иметь один, скажем, 'go', потому что тогда все мои тесты будут называться "go", и я хочу, чтобы все мои тесты были названы индивидуально).

Или, альтернативно, есть ли альтернатива DUnit, которая могла бы делать то, что я хочу?


person dan-gph    schedule 01.04.2009    source источник


Ответы (2)


Я бы сказал, что вы в основном хотите иметь одну функцию «супертест», которая затем вызывает другие тесты, по одному для каждого файла данных. Это то, что мы делаем с одним из наших тестов DUnit. Вы просто загружаете каждый доступный файл по очереди в цикле и запускаете тест с проверками в зависимости от ситуации.

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

person mj2008    schedule 01.04.2009
comment
Идея супертеста в этом случае не сработает, потому что выполнение каждого теста занимает некоторое время, и обычно только несколько из них не работают одновременно. Нам нужно изолировать только эти тесты, чтобы исправить код. К сожалению, каждый раз запускать весь супертест будет очень медленно. - person dan-gph; 01.04.2009
comment
@dangph: Вот тут-то и пригодится тест FinalBuilder. Отдельный тест может завершиться неудачно, но я использую в нем средство try / catch для записи единственного отказа, но продолжаю с остальным, а затем завершаю сборку сразу после последнего. - person mj2008; 01.04.2009
comment
@ mj2008, мы занимаемся рефакторингом этого довольно грубого модуля. По мере рефакторинга тесты ломаются. Мы хотим запускать только неработающие тесты (с помощью флажков DUnit), пока мы исправляем код, потому что тесты довольно медленные, и нам обычно приходится повторять цикл несколько раз. - person dan-gph; 01.04.2009

person    schedule
comment
Это замечательно. Спасибо. Я пробовал что-то подобное, но из-за некоторых ошибок это не сработало. Спасибо еще раз. - person dan-gph; 01.04.2009
comment
Что вы предлагаете, чтобы в одном тестовом классе были и кейсы, и кейсы, основанные на данных? - person Thijs van Dien; 24.02.2016
comment
@Thijs van Dien Просто добавьте функцию класса Suite: ITestSuite; переопределить; в ваш обычный класс TTestCase, содержащий обычные (опубликованные) тесты, который имеет в качестве результата первой строки: = унаследованный Suite; Затем после этой строки запустите свой тестовый регистрационный код, который использует набор результатов для регистрации динамических тестов, как показано в сообщении OK, например. suite.AddTest (TIntTestCase.Create (...)) и т. д. - person W.Prins; 07.08.2017