2011-01-11 2 views
3

EDIT: Благодаря ncie комментаторов, я получить разницу между единицей и автоматизированным тестированием, поэтому я переименовал темуКак начать автоматическое тестирование большого приложения?

Environement: .NET 2.0, SQL Server 2005, Windows Server 2003

Я прочитал эту статью :

http://www.codeproject.com/KB/tips/convince.aspx

Этот парень говорит о том, как вы можете добавить автоматизированного тестирования в существующее приложение без changng все.

И я должен сказать, что эта статья действительно удивительна и заставляет меня попробовать!

Итак, наша система почти такая же: все данные доступны через веб-службы, поэтому мы можем легко (например, с помощью soapui) провести автоматическое тестирование этих веб-сервисов.

НО: как насчет базы данных? Чтобы провести некоторое автоматическое тестирование, нам нужно иметь правильные данные в базе данных, соответствующие автоматическому тесту.

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

вот как я думаю, что я могу это сделать:

  • создать сервер с всем необходимым (МИС, SQL Server ...)
  • добавить что-то, так что дата этого сервера никогда не меняются так Я не должен изменить время в моем автоматизированном тесте
  • добавить в свою базу данных записей, которые я должен сделать мой автоматизированный тест

ПРОБЛЕМА: база данных будет большой беспорядок после 10 автоматизированный тест, и я буду ver знать, какая запись предназначена для автоматического теста. Идея заключалась бы в том, чтобы добавить столбец «TEST_NAME» к каждой таблице, но это немного грязно в моем сознании.

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

Благодаря

EDIT: Я получил 2 -1 для этой темы, я хотел бы знать, почему так я не буду делать ту же ошибку дважды.

+2

Вы хотите сделать больше модульного тестирования (используйте Mocks и подделки вместо реальной базы данных) и меньше тестирования уровня системы, которые будут часто ломаться, потому что эти тесты в значительной степени зависят от среды и реальной базы данных с конкретными записями. Это будет для вас более сложной задачей, так как вы еще не разработали свои тесты перед разработкой. Книга Michael Feathers, работающая эффективно с устаревшим кодом, может помочь в вашем сценарии. –

+5

@remi - вы можете подумать об изменении «модульного теста» на «автоматический тест». Единичные тесты изолированы от внешних ресурсов, таких как базы данных, файловые системы и сети. –

+0

@Jeff: здесь я хочу проверить только свой бизнес-уровень (= веб-сервис), а не мою базу данных, но мне нужно добавить тестовые данные в свою базу данных, чтобы они работали. @Chris O: Как говорит Омар в этой статье, здесь цель состоит в том, чтобы написать только единичный тест, наш код не готов к насмешкам (и разработчикам тоже), поэтому я думаю, что мы должны использовать нашу базу данных. –

ответ

0

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

+0

Вот о чем я думаю: проблема в том, как управлять этой базой данных, и как я могу определить, с каким модульным тестом связана запись. –

+0

Различные файловые наборы данных для каждого * автоматизированного * теста. В прошлом я dbUnit. В начале каждого теста уничтожайте мир, а затем создавайте только необходимый набор данных. http://www.dbunit.org/bestpractices.html#nocleanup * edit: * Изменено "unit" на "automatic". Лично я не думаю, что вы являетесь «модульным тестированием», а скорее «функциональным» или «интеграционным» тестированием (их тоже нужно делать, чтобы не было плохо об этом). –

+0

тесты с другой базой данных по-прежнему являются интеграционными тестами. Окупаемость модульных тестов происходит, когда ваши тесты нарушают зависимость от базы данных. – MatthewMartin

1

Если ваши юнит-тесты поражают ваш уровень персистентности, вы действительно можете сделать что-то похожее на интеграционное тестирование. Что вы должны сделать, чтобы абстрагировать свою базу данных во время модульного теста, чтобы вы только проверяли логику, а не то, что на самом деле носило постоянство. Это позволяет сосредоточиться на логике бизнес-уровня. Это проще сказать, чем сделать, поскольку это зависит от архитектуры вашего уровня данных.

слои данных часто просто вопрос толчка в и вытащить так что позволяет сказать, что вы можете Abtract ваш слой данных в интерфейсе, например:

interface IRepository 
{ 
    GetModel(id); 
    SaveModel(model); 
} 

Тогда в тестовом модуле, чтобы можно незавершенная/макет из вашего слоя данных с этим интерфейсом. Таким образом вы сообщаете заглушке своей базы данных о возврате любого значения, которое вы хотите, и вы можете написать тест, который будет определять ожидаемое поведение, когда это произойдет.

+0

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

0

Если вы можете сгенерировать свои тестовые данные перед каждой партией тестов, то ваши записи начинаются с идентификатора, равного следующему числу, равному 100. Поэтому, если самая большая запись - 350, сгенерируйте запуск 400 и выполните тест с 400 и выше. Когда ваша БД становится действительно большой, удалите все.

Смежные вопросы