Що таке нормальне співвідношення «функціональні лінії коду» до «тестові рядки коду»?


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: У книзі Кента він цитує Ворда, що ви повинні писати тести, поки ваш страх не перетвориться на нудьгу.
herby

4
@ElYusubov: Я не згоден, що це взагалі "дорого". Це здається тим, хто все ще нараховує кількість роботи в місцевих офісах. Але ціна не в LOC, вона в грошах і на ринку. І там TDD не дорожче, ніж будь-який інший розумний процес розробки.
herby

5
Хлопці, чому ви коментуєте замість публікації відповідей? Те, що ви пишете, має сенс.
Андрій Агібалов

Відповіді:


18

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

Зі свого досвіду, а також з інших цитат я пам’ятаю.


12
... які цитати?
TehShrike

... смутно пам'ятаю ... Я вже не пам'ятаю, де це було (можливо, в TDD Кента Бека за прикладом, можливо, десь на c2.com). Я пам’ятаю сенс, що в тому, що втричі більше тестового коду, ніж виробничий код, це нормально.
herby

Ух, точно так само і в моєму досвіді. (Я зараз дивлюся на результати Cloc зараз, і шукав google, щоб знайти будь-які повідомлення в цьому співвідношенні)
Микола Ценков

9

Існують варіанти, засновані на різних стилях та мовах кодування. Однак, незалежно від мови, якою ви користуєтесь, найбільша варіація - це ви.

Роберт Мартін одного разу сказав:

"Коли тести стають більш конкретними, код стає більш загальним".

Це змусило мене задуматися. Більш конкретні тести означають більше тестового коду. Більш загальний виробничий код означає менше коду, тому співвідношення тесту / коду повинно зростати в міру розвитку коду.

Але зачекай, це теж не добре. У деяких конкретних випадках, наприклад, коли ви визначаєте певний алгоритм, у вас може бути лише 6-10 рядків коду, що містять пару "if" s, час і, можливо, 2-3 рекурсії. Я можу вам сказати, що цей код матиме, мабуть, більше 100 рядків тестового коду.

У реальному проекті, дещо більшому, ніж лише кілька алгоритмів, співвідношення тесту / коду повинно бути десь між 1: 1 і 2: 1. Якщо вона отримує вище 2: 1, це запах, що у вас є тести, які слід переробити або видалити (а може бути, код важко перевірити). Ви завжди повинні вкладати в тести таку ж кількість догляду та рефакторингу, як у виробничий код.

У будь-якому випадку, найкраща відповідь на ваше запитання, можливо, "Цикломатична складність" . Чим вища цикломатична складність вашого методу, тим більше випробування вам доведеться написати, щоб охопити всі випадки.


3

Співвідношення буде змінюватися залежно від розміру ваших методів. Розмір ваших методів залежить від стилю програмування, мови та проблемної області.

Якщо ваших методів мало, то розумним є 3: 1. Якщо ваші методи довгі, то 3: 1 на високій стороні.

Отже, щоб відповісти на ваше запитання, це залежить. :-)


Це залежить від того, що ви маєте на увазі під «методами довгими». Який образ він створив у мене в голові, це те, що методи непотрібні довгі, роблять занадто багато роботи і мають занадто багато обов'язків (часто мають занадто багато параметрів). У такому випадку такому методу потрібно пропорційно більше комбінацій, щоб покрити тести, тому я не думаю, що співвідношення сильно зміниться ...
herby

Припустимо, на якусь мить можна встановити тест, зателефонуйте на тестуваний метод і перевірте результат у трьох рядках коду. Якщо метод, який ви тестуєте, довгий на один рядок (як це відбувається у Scala), то ваш коефіцієнт тестування виробничого коду становить 3: 1. Якщо метод довгий шість рядків, то це 1: 2. Шість рядків не все так довго.
Джон Страйер

2

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

І це не рахуючи TDD, що стосується не тесту, а специфікації.


1

Розмір мого тестового коду становить приблизно половину від загального «фактичного» коду. В іншому випадку свідчить про те, що ваші тести занадто складні та / або ваш код занадто важкий для перевірки та / або ваш код занадто щільний / складний.

Або ви просто занадто багато тестуєте і витрачаєте час на зменшення прибутку.

Також дивіться "коли тестування приладів є недоцільним чи непотрібним?"


-1

Моє співвідношення становить близько 2-1 до 10-1 (код для тестування). Переконайтеся, що тестування стосується вартості / поведінки, а не реалізації.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.