Подтвердить что ты не робот

Принятие модульного тестирования на следующий уровень

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Обновить Просто хочу поделиться записью моего блога относительно этой проблемы: Повторить после меня: Test Driven Development - это дизайн, а не тестирование!

Ответ 3

Unit Testing - это всего лишь один тип тестирования, это не единственный тип тестирования.

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

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

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

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

Ответ 4

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

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

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

Ответ 5

Ознакомьтесь с "Конструкцией объектно-ориентированного программного обеспечения" Бертран Майер.

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

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

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

http://dev.eiffel.com