Недавно я начал настаивать на TDD, где я работаю. Пока все идет хорошо. Мы пишем тесты, мы запускаем их автоматически при фиксации, и мы всегда стремимся улучшить наш процесс и инструменты.
Одна вещь, которую я определил, которая может быть улучшена, - это то, как мы настраиваем наши тестовые данные. В строго модульных тестах мы часто находим создание и заполнение сложных объектов CLR. Это боль, и, как правило, тест затем выполняется только в нескольких случаях.
То, что я хотел бы нажать, - это тесты Data Driven. Я думаю, что мы должны иметь возможность загружать наши тестовые данные из файлов или, возможно, даже генерировать их "на лету" из схемы (хотя я бы рассматривал это только на лету, если бы я мог генерировать любую возможную конфигурацию объекта, и это число конфигурации были небольшими). И есть моя проблема.
Мне еще предстоит найти хорошую стратегию для генерации тестовых данных для объектов CL # CLR.
Я просмотрел данные XML из XSD и затем загрузил их в свои тесты с помощью DataSourceAttribute
. Казалось, что это хороший подход, но я столкнулся с проблемами, генерирующими файлы XSD. xsd.exe
падает, потому что наши классы имеют члены интерфейса. Я также попытался использовать svcutil.exe
на нашей сборке, но поскольку наш код является монолитным, вывод является огромным и сложным (многие взаимозависимые файлы .xsd).
Каковы другие методы генерации тестовых данных? В идеале генератор должен следовать схеме (возможно, xsd, но предпочтительно самому классу) и может быть сценарием. Технические примечания (не уверен, что это даже актуально, но это не может повредить):
- Мы используем инфраструктуру модульного тестирования Visual Studio (определенную в
Microsoft.VisualStudio.TestTools.UnitTesting
). - Мы используем RhinoMocks
Спасибо
Дополнительные сведения
Одна из причин, почему я заинтересован в этом, - проверить класс адаптера, который у нас есть. Он принимает сложную и запутанную устаревшую Entity и преобразует ее в DTO. Унаследованный Entity - это полный беспорядок спагетти и не может быть легко разделен на логические подразделы, определенные интерфейсами (как это было предложено). Это был бы хороший подход, но у нас нет такой роскоши.
Я хотел бы иметь возможность генерировать большое количество конфигураций этого унаследованного Entity и запускать их через адаптер. Чем больше количество конфигураций, тем более вероятным будет мой тест, когда следующий разработчик (не обращая внимания на 90% приложения) изменит схему устаревшего объекта.
ОБНОВЛЕНИЕ
Просто чтобы уточнить, я не собираюсь генерировать случайные данные для каждого выполнения моих тестов. Я хочу иметь возможность генерировать данные для покрытия нескольких конфигураций сложных объектов. Я хочу сгенерировать эти данные в автономном режиме и сохранить их как статические данные для моих тестов.
Я просто перечитал свой вопрос и заметил, что на самом деле я изначально прошу о случайном рождении. Я удивлен, что я прошу об этом! Я обновил вопрос, чтобы исправить это. Извините за путаницу.