2011-01-23 6 views
2

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

Assert.IsNotNull(personObject.Name); 

Должен всегда быть правдой, но как я могу проверить его без иметь «поддельные» данные? Не хочу ли я проверить этот тип требований?

+2

Вы * должны * тестировать базу данных, а не только в своих модульных тестах. – coreyward

+0

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

ответ

4

Давайте возьмем ваше требование «у человека всегда должно быть имя». Где мы можем начать?

Во-первых, нам нужна определенная ясность. Я считаю, что когда вы говорите «всегда должно иметь имя», вы имеете в виду «никогда не должны иметь пустую или пустую строку» в качестве имени.

Возможно, мы действительно имеем в виду, что «когда человек хранится в нашей базе данных, его имя не может быть пустым или пустым». Первой линией атаки будет принудительное выполнение этого ограничения с вашей базой данных; однако ничто не защищает вас от изгоев DBA, устраняющих это ограничение, поэтому вы можете проверить, что то, что вы считаете истинным в отношении системы, будет помечено неудачным тестом, если он изменится. Для этого вы должны написать тест типа «когда мое приложение отправляет Лицу с именем Null, которое будет сохранено в БД, оно должно потерпеть неудачу». Это не единичный тест, это скорее интеграционный тест - и сложнее писать, чем старый старый тест.

Однако это все еще не охватывает сценарий взломанного DBA, устраняющего ограничение и непосредственно создающего записи, имеющие нулевые имена. Другими словами, ваше приложение не может доверять данным, которые оно возвращает, чтобы быть правильным, поэтому возникает вопрос: как вы хотите, чтобы ваш домен имел дело с возможностью людей с нулевыми именами?

Весьма буквальный подход может заключаться в том, чтобы обеспечить, чтобы это лицо могло быть построено только с ненулевым именем и выбрасывалось иначе. Это было бы легко объединить тесты и обеспечить их соблюдение, но, вероятно, будет болезненным. Более приятным подходом было бы отсутствие ограничений на Личность, но класс Validator, который может проверять Person для нарушенных правил. Это более приемлемо, потому что теперь вы можете делать все, что пожелаете человеку (образно), а затем проверить, находится ли этот человек в состоянии Valid.

Это имеет преимущество

1) быть очень легко проверяемым: создание юнит-тестов для такого валидатора кусок пирога,

2) решение вопроса изгоев DBA: теперь вы можете Validate все, что приходит или выходит за пределы приложения, путем применения Validator.

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

0

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

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

Если вы все еще ищете руководство по другим аспектам TDD, попробуйте Dan North's post on BDD, который начинается:

«У меня была проблема ... программисты хотели бы знать, с чего начать, что проверить, а что нет тестировать, сколько тестировать за один раз, что назвать их тесты, и как понять, почему тест не удается ».

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