2010-08-13 7 views
3

Два вопроса об модульных тестах.Несколько вопросов об модульных тестах

  1. Я пишу тесты для некоторого времени, однако они, как правило, чтобы классов тестов я уже написал. Недавно я прочитал an article (вспомните старую статью), в которой говорится, что вы должны написать модульные тесты до , вы начинаете писать свой код.

    Кто-нибудь действительно следует этому методу ? Кажется хорошей идеей на бумаге, но на практике это ?

  2. Должны ли вы писать модульные тесты, чтобы увидеть, как ваш метод обрабатывает плохой/вредоносный ввод? Очевидно, вы хотели бы написать тесты против функций, которые специально предназначены для обработки «пользовательского» ввода, чтобы увидеть, как он обрабатывает плохие/вредоносные данные, но как насчет функций, которые никогда не должны были передавать этот тип данных? В какой момент вы рисуете линию?

ответ

8

Методология написания модульных тестов перед классами называется Test-Driven Development (TDD) и была популяризирована Кентом Бек в начале 2000-х годов. Идея заключается в том, что вы пишете тест, который описывает необходимые вам функциональные возможности. Первоначально этот тест не удастся. Когда вы пишете свой класс, тест проходит. Вы реорганизуете свой тест, чтобы добавить более желаемые функции, а затем переформатируйте класс, чтобы выполнить этот новый тест. Ваш класс выполнил свои задачи, как только пройдут тесты. Разумеется, это распространяется и на классы.

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

+1

На самом деле, чтобы уточнить, вы не пишите ВСЕ ваши тесты раньше времени. Вы пишете ОДИН тест. Это не удается. Вы пишете код, чтобы он прошел. Затем вы изменяете свой тест или пишете другое. Опять же, это не удается. Напишите код. Это процесс, получивший название «Красный, Зеленый, Рефактор». – CaffGeek

+0

Спасибо за это. Я брошу это в свой ответ, просто для ясности. –

2

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

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

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

Это также имеет значение, откуда поступает вход. Общественность должна считаться положительно злонамеренной (т. Е. Паутиной), сотрудников следует считать некомпетентной, и даже коллеги-кодеры (и сами!) Следует считать по меньшей мере неосторожными. Но опасность падает, когда вы приближаетесь к своему внутреннему кругу.

+0

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

2

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

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

2

Кто-нибудь действительно придерживается этой методологии?

Да.

Кажется, что на бумаге хорошая идея, но на практике это так?

Да.

Должны ли вы писать модульные тесты, чтобы узнать, как ваш метод обрабатывает плохой/вредоносный ввод?

Да.

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

Когда он переходит от программного обеспечения к психозу.

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

Вы пишете тесты на использование . Вот и все.

Вы не составляете случайные тестовые примеры, основанные на вашем воображении.

Что делать? Что делать, если определены прецеденты неполные? Облом. Вы пишете тесты для официального, контрактного, открытого интерфейса - и ничего более.

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

Что делать, если какой-то вредоносный социопат принимает ваш код и использует его таким образом, который превышает (или иным образом не отвечает) определенным спецификациям? Облом. Социопат побеждает. Они смогли поставить ваш код в невозможную ситуацию, в которой вы не тестировали. Купите им пиво для того, чтобы быть таким умным.

+0

И после этих «невозможных» ситуаций, вы добавляете тест, чтобы воссоздать его, он не удастся. Затем вы исправляете свой код. И в будущем вы теперь протестировали невозможное и проведете тест, чтобы невозможное снова не повторилось. – CaffGeek

+0

Я не согласен с вашим подходом «только то, что спецификация говорит». Это может быть уместно для контрактного программирования, но я думаю, что разработка продукта требует более активного подхода, поскольку часто нет официального разграничения между дизайном и разработкой. В большинстве моих работ, если дизайн плох, я не виноват, кроме меня и моих коллег. – ChrisH

+0

@ChrisH: «никакого формального разграничения между дизайном и развитием». Ложь. Ваши тестовые примеры ** - это ваш дизайн. Вот почему TDD настолько эффективен. –

0

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

Если вы сделаете свой UnitTest код «управляемых данными», это не должно важно, если код тестирует «плохой» или «хороший» ввод. Важно то, что у вас достаточно большой набор данных, который охватывает оба.

1

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

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

+0

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

+0

@kubi Действительно. Это то, что я понял, когда я начал делать TDD. –

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