Вопрос

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

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

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

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

Решение

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

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

Другие советы

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

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

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

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

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

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

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

да.

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

да.

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

да.

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

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

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

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

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

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

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

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

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

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

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

Если вы сделаете свой Unittest Code «Data Danized», он не должен иметь значение, если код тестирует «плохой» или «хороший» вход. Что имеет значение то, что у вас достаточно большой набор данных, которые охватывают оба.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top