Каково нормальное соотношение «функциональных строк кода» к «тестовым строкам кода»?

27

Я довольно новичок в подходе TDD, и мои первые эксперименты говорят, что написание 1 строки функционального кода означает написание примерно 2-3 строк кода тестирования. Итак, на случай, если я напишу 1000 LOC, вся кодовая база, включая тесты, будет примерно 3500 LOC.

Это считается нормальным? Какое соотношение в коде вы пишете?

Андрей Агибалов
источник
8
Да, TDD поставляется с дорогой биркой!
Е.Л. Юсубов
6
ваш номер 2-3X в лучшем случае является консервативным, на самом деле он ближе к 4-5X для таких вещей, как C # / Java, Python / Ruby может быть ближе к 2-3X, а что-то лаконичное, например Erlang, ближе к 1: 1. Зависит от того, насколько вы догматичны в отношении TDD, чем догматичнее, тем больше эти коэффициенты!
6
@tomwrong: В книге Кента он цитирует Уорда, что вы должны писать тесты, пока ваш страх не превратится в скуку.
Херби
4
@ElYusubov: я не согласен, что это "дорого" вообще. Это похоже на тех, кто все еще считает количество работ в LOC. Но цена не в LOC, а в деньгах и времени выхода на рынок. И там TDD не дороже, чем любой другой разумный процесс разработки.
Херби
5
Ребята, почему вы комментируете, а не публикуете ответы? То, что ты пишешь, имеет смысл.
Андрей Агибалов

Ответы:

18

1: 3 нормально с TDD.

Из моего опыта, а также из других цитат, которые я помню.

Херби
источник
12
... какие цитаты?
TehShrike
... смутно помню ... Я уже не помню, где это было (может быть, в TDD Кента Бека, например, где-то в c2.com). Я помню значение, однако, что в три раза больше тестового кода, чем производственного кода, это нормально.
Херби
Ух, точно так же и по моему опыту. (Я смотрю на результаты от cloc прямо сейчас, и я искал в Google, чтобы найти какие-либо посты с этим соотношением)
Николай Ценков
9

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

Роберт Мартин однажды сказал:

«Поскольку тесты становятся более конкретными, код становится все более общим».

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

Но подождите, это тоже не хорошо. В некоторых особых случаях, например, когда вы определяете определенный алгоритм, у вас может быть только 6-10 строк кода, содержащих пару «если», время и, возможно, 2-3 рекурсии. Я могу сказать вам, что этот код будет иметь более 100 строк тестового кода.

В реальном проекте, который больше, чем несколько алгоритмов, соотношение тест / код должно быть где-то между 1: 1 и 2: 1. Если оно становится выше 2: 1, то пахнет тем, что у вас есть тесты, которые должны быть реорганизованы или удалены (или, возможно, код, который сложно протестировать). Вы всегда должны вкладывать в свои тесты тот же объем заботы и рефакторинга, что и в свой производственный код.

В любом случае, лучший ответ на ваш вопрос может быть "Cyclomatic Complexity" . Чем выше цикломатическая сложность вашего метода, тем больше экспоненциально вы должны написать тест, чтобы он охватил все случаи.

Паткос Чаба
источник
3

Соотношение будет варьироваться в зависимости от размера ваших методов. Размер ваших методов зависит от стиля программирования, языка и проблемной области.

Если ваши методы короткие, 3: 1 разумно. Если ваши методы длинные, то 3: 1 на высокой стороне.

Итак, чтобы ответить на ваш вопрос, это зависит. :-)

Джон Стрейер
источник
Это зависит от того, что вы подразумеваете под «методы длинные». Какой образ он создал в моей голове, так это то, что методы не нужны долго, выполняют слишком много работы и имеют слишком много обязанностей (часто имеющих слишком много параметров). В этом случае для такого метода требуется пропорционально больше комбинаций, чтобы покрыть тестами, поэтому я не думаю, что соотношение сильно изменится ...
Херби
Предположим, вы можете настроить тест на некоторое время, вызвать метод для тестирования и проверить результат в трех строках кода. Если метод, который вы тестируете, имеет длину в одну строку (как это происходит в Scala), то соотношение теста к рабочему коду составляет 3: 1. Если метод длиной шесть строк, то это 1: 2. Шесть строк не так уж и долго.
Джон Страйер
2

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

И это не считая TDD, который касается не теста, а спецификации.

mouviciel
источник
1

Размер моего тестового кода составляет примерно половину от того, что является «фактическим» кодом в целом. Если вы поступите иначе, это значит, что ваши тесты слишком сложны и / или ваш код слишком сложен для тестирования и / или ваш код слишком плотный / сложный.

Или вы просто слишком много тестируете и тратите время на уменьшение прибыли.

Также смотрите "когда юнит тестирование не подходит или не нужно?"

Telastyn
источник
-1

Мое соотношение составляет около 2-1 к 10-1 (код для тестирования). Убедитесь, что вы тестируете на предмет ценности / поведения, а не реализации.

Эрез А. Корн
источник