Несколько вопросов о юнит-тестах - PullRequest
3 голосов
/ 13 августа 2010

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

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

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

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

Ответы [ 6 ]

8 голосов
/ 13 августа 2010

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

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

2 голосов
/ 13 августа 2010

Кто-нибудь на самом деле следует этой методологии?

Да.

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

Да.

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

Да.

А как насчет функций, которым никогда не следует передавать ввод такого типа? В какой момент вы рисуете линию?

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

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

Вы пишете тесты для определенных вариантов использования. И это все.

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

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

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

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

2 голосов
/ 13 августа 2010

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

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

2 голосов
/ 13 августа 2010

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

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

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

Также имеет значение, откуда поступает информация.Широкая общественность должна считаться злонамеренно положительной (например, в Интернете), сотрудники должны считаться некомпетентными, и даже коллеги-программисты (и вы сами!) Должны считаться по крайней мере небрежными.Но опасность падает, когда вы приближаетесь к своему внутреннему кругу.

1 голос
/ 13 августа 2010

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

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

0 голосов
/ 13 августа 2010

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

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

...