2009-06-18 2 views
12

За последний год или около того я разрабатывал свои отбивные TDD, так что теперь я довольно хорошо разбираюсь в основных вопросах - сначала пишу тесты, фальшивые фреймворки, тестирование как можно более мелких вещей, DI и т. Д. .Выполнение модульного тестирования на следующий уровень

Однако я чувствую, что все еще есть много вещей, которые я не получаю от модульного тестирования.

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

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

Когда я впервые начал модульное тестирование, как и большинство людей, я обнаружил, что то, что я писал, было действительно интеграционными тестами. Однако было много преимуществ для этих тестов - они были много легче читать и действовали как достойная документация по API моих программ. Они также, как правило, улавливают проблему реального мира гораздо быстрее, чем единичные тесты, которые, как я считаю, тратят много времени на таргетинг на крайние случаи, которые возникают только при неправильном использовании API (например, нулевые ссылки, деления на 0 и т. Д.).

Что вы думаете? Можете ли вы рекомендовать хорошие книги, статьи или практики, которые занимаются более продвинутым модульным тестированием и поддержанием производительности и эффективности?

РЕДАКТИРОВАТЬ: Немножко следуйте вопросам, учитывая ответы: Так что в основном вы говорите, что, несмотря на то, что все это тестирование «я не тестирую код», на что я отвечаю: «Но Я хочу проверить код dang! " На самом деле, когда я написал много «тяжелых» тестов интеграции, я обнаружил, что мой код, как правило, достигает состояния правильности намного быстрее, и ошибки были идентифицированы намного раньше. Можно ли достичь этого без проблем ремонтопригодности интеграционных тестов?

+0

@cbp: это _unit_ тестирование. Он не предназначен для тестирования интеграции или большой картины. –

ответ

8

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

Я ожидал бы, что ваше чувство раздражения с BDD возникает из-за того, что вы пишете инструменты, чтобы просто «устранить ошибки» или «заменить свой процесс QA», обе из которых не предназначены ни BDD, ни TDD. Test Driven Development означает «развитие, основанное на тестах», а не «тесты, обусловленные разработкой». Мне кажется, что вы хотите последнего.

Интеграционные испытания и обеспечение качества программного обеспечения - это совершенно разные темы, но я понимаю причины огромной путаницы между ними и ассоциирования TDD с ними.

Test Driven Development означает «разработка, управляемая испытаниями», а не «тесты, основанные на разработке». Мне кажется, что вы хотите последнего.

Update Просто хочу поделиться своим запись в блоге по этому вопросу: Repeat after me: Test Driven Development is about design, NOT testing!

+0

Модульные тесты предназначены для предоставления набора регрессионных тестов, чтобы вы знали, когда рефакторинг прерывает ваше приложение. –

+1

Модульные испытания предназначены для их предоставления, да. TDD - нет. –

+0

Вы пишете отдельные тесты отдельно от TDD? –

2

модульное тестирование только один тип тестирования, это не единственный тип тестирования.

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

После того, как вы наберете приличное количество своих небольших единиц, вы затем сделаете так, как называется Функциональный тест, который выглядит как Unit Test, однако он не издевается над тем, что вы издеваетесь над модульным тестом, в общем случае ваша система, созданная разными командами, Functional Tests издевается только на зависимости, введенные другими командами, но командный код не издевается.

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

Учитывая, что все три типа тестов построены с использованием mstest или NUnit, это еще тест кода.

1

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

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

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

+0

Роб Конэри провел интересную беседу со Скоттом Гензельмом на одном из своих подкастов во время обсуждения своего инструмента ORM, Subsonic. Subsonic должен иметь возможность взаимодействовать с базами данных от многих разных поставщиков. Некоторые из пользователей Subsonic жаловались, что единичные тесты Роба слишком сильно ударяли по базе данных (это означало, что пользователи чувствовали, что тесты следует издеваться). Ответ Роба заключался в том, что издевательство над базой данных, по сути, недействило тесты, поскольку все дело в том, чтобы убедиться, что база данных каждого поставщика по-прежнему работает правильно с инструментом. –

1

Отметьте «Объектно-ориентированное программное обеспечение» Бертран Майер.

Концепция называется «Контрактная разработка». Это линейный тип тестирования на уровне функции, он меняет способ программирования.

Если вы используете CDD в Eiffel, язык, также написанный Bertrand, они автоматически проверяются временем выполнения во время фазы тестирования и отладки.

http://www.amazon.com/Object-Oriented-Software-Construction-Prentice-Hall-International/dp/0136291554

http://dev.eiffel.com

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