В идеале вы должны со временем реорганизовать свой код, чтобы сделать его более тестируемым. В идеале любое поэтапное улучшение в этой области позволит вам писать больше модульных тестов, что должно значительно повысить вашу уверенность в существующем коде и способность писать новый код без нарушения существующего протестированного кода.
Я считаю, что такой рефакторинг часто дает и другие преимущества, такие как более гибкий и обслуживаемый дизайн. Об этих преимуществах следует помнить, пытаясь оправдать работу.
Является ли тестирование такого приложения безнадежным делом?
Я проводил автоматическое интеграционное тестирование годами и нашел его очень полезным, как для себя, так и для компаний, на которые я работал :) Я только недавно начал понимать, как сделать приложение полностью тестируемым на модуле. в течение последних 3 лет или около того, и до этого я проводил полные интеграционные тесты (с пользовательскими внедренными / хакерскими тестами).
Итак, нет, это не безнадежное дело, даже если приложение спроектировано так, как оно есть. Но если вы знаете, как выполнять модульное тестирование, вы можете получить множество преимуществ от рефакторинга приложения: стабильность и удобство сопровождения тестов, простота их написания и изоляция отказов в конкретной области кода, которая вызвала сбой.
Можно ли это сделать, используя что-то вроде nUnit или MS Test?
Да. Существуют платформы тестирования веб-страниц / пользовательского интерфейса, которые можно использовать из библиотек модульного тестирования .Net, включая встроенную в Visual Studio.
Вы также можете получить большую выгоду, позвонив на сервер напрямую, а не через пользовательский интерфейс (схожие с теми, которые вы получаете, если вы реорганизуете приложение). Вы также можете попробовать издеваться над сервером и протестировать графический интерфейс и бизнес-логику клиентского приложения изолированно.
Будет ли "настройка" этого теста просто принудительно запускать полное приложение и входить в систему?
На стороне клиента, да. Если вы не хотите проверить логин, конечно:)
На стороне сервера вы можете оставить сервер включенным или выполнить какое-либо восстановление БД между тестами. Восстановление БД является болезненным (и если вы напишите его неправильно, будет нестабильным) и замедлит тесты, но это очень поможет с изоляцией теста.
Могу ли я просто перечитать item1 и item2 из базы данных, чтобы проверить, правильно ли они написаны?
Типичные интеграционные тесты основаны на концепции Finite State Machine . Такие тесты обрабатывают тестируемый код, как если бы он был набором переходов между состояниями, и делают утверждения о конечном состоянии системы.
Таким образом, вы предварительно установите БД в известное состояние, вызовите метод на сервере, а затем проверите БД.
Вы всегда должны делать основанные на состоянии утверждения на уровне ниже уровня кода, который вы используете. Поэтому, если вы используете код веб-службы, проверьте БД. Если вы используете клиент и работаете с реальной версией сервиса, проверьте его на уровне сервиса или на уровне БД. Вы никогда не должны использовать веб-сервис и выполнять утверждения на том же веб-сервисе (например). Это маскирует ошибки и не дает вам полной уверенности в том, что вы действительно тестируете полную интеграцию всех компонентов.
Ребята, есть ли у вас какие-нибудь советы, как начать этот пугающий процесс?
Разбей свою работу. Определите все компоненты системы (каждая сборка, каждая работающая служба и т. Д.). Попробуйте разделить их на естественные категории. Потратьте некоторое время на разработку контрольных примеров для каждой категории.
Создайте свои тесты с учетом приоритета. Изучите каждый контрольный пример. Подумайте о гипотетическом сценарии, который может привести к его сбою, и постарайтесь предвидеть, будет ли это ошибкой остановки показа, если ошибка может задержаться на некоторое время или она может быть исправлена до другого выпуска. Присвойте приоритет вашим тестам на основе этих догадок.
Определите часть вашего приложения (возможно, особую функцию), которая имеет как можно меньше зависимостей, и напишите для нее только тесты с наивысшим приоритетом (в идеале, это должны быть самые простые / самые основные тесты). Как только вы закончите, перейдите к следующему фрагменту приложения.
Как только у вас будут все логические части вашего приложения (все сборки, все функции), охватываемые вашими тестами с наивысшим приоритетом, делайте все возможное, чтобы эти тесты запускались каждый день. Исправьте сбои теста в этих случаях, прежде чем приступить к реализации дополнительного теста.
Затем включите покрытие кода в тестируемом приложении. Посмотрите, какие части приложения вы пропустили.
Повторяйте с каждым последующим набором тестов с более высоким приоритетом, пока все приложение не будет протестировано на каком-либо уровне, и вы отправите:)