Конкурс тестування одиниць


12

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

Ми присвоювали бали для кожного тестового випадку. Тож якщо ви написали одиничний тест так ...

for (int i = 0; i < 100; i++) {
  assertTrue(i*i, square(i));
}

вам дадуть 100 балів. Очевидно, що це спрощений приклад, але він демонструє проблеми з присвоєнням "балів" кожному тестовому випадку.

Ми насамперед магазин Java та Javascript. Тому я запропонував підрахувати кількість гілок коду, перевірених як метрику. Ми можемо легко підрахувати випробувані гілки за допомогою інструменту покриття коду (наприклад, EclEmma). Однак не впевнений, як би ми це зробили за допомогою наших тестів Selenium та отримання кодового покриття на джерелах Javascript (будь-які ідеї?)

Хтось має пропозиції щодо того, як ми могли б краще визначити переможця цього конкурсу?

Редагувати

Я знаю, як писати одиничні тести, я вмію писати ефективні одиничні тести, мені не потрібна допомога у визначенні того, що перевірити. Я не маю контролю над цим змаганням - змагання триватимуть далі. Тож я або додаю певний внесок, щоб покращити його, або продовжую проводити ігрові тести (так, я в них граю. Звичайно, я в них граю. Виграти потрібно призи)

Редагувати

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


Не зовсім. Я зрозумів , що це з самого початку
Shaun

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

Знову ні. Я зрозумів, що їх можна грати. Я не маю контролю над цим змаганням, але мене запитали "як нам це зробити краще"
Shaun

13
Чи вважатиметься вдосконаленням, щоб не зробити його конкуренцією? Чому все має бути конкуренцією? Чому ви не можете співпрацювати? Можливо, допоможе позбутися деяких ваших безглуздіших одиничних тестів та створити гарний набір корисних тестів на дим та регресію.
Томас Оуенс

1
Я з Томасом ... переможцем має стати база коду / клієнт, оскільки якість коду покращилася. Поставте загальну / групову ціль на основі покриття кодом тестів одиниці ... + 5% над поточним чи будь-яким іншим. ... і не грайте в систему призів ... все, що сталося з добре виконаною роботою - це її власна винагорода?
JeffC

Відповіді:


15

Хтось має пропозиції щодо того, як ми могли б краще визначити переможця цього конкурсу?

Єдине, що має сенс для мене, це голосування - кожен дев може присвоїти деякі бали кожному тесту чергового (крім свого). Можливо, 3 бали за тест він вважає "найефективнішим", 2 бали за другий і один на третій. Виграє тест з найбільшою кількістю очок. Це може дати кращі результати, коли бальне завдання буде виконано, не знаючи попередньо, хто написав тест.

Як бонус, ви отримаєте перевірку всіх своїх тестів.


2
Це теж була моя думка. Немає іншого способу вимірювати значення тестів.
Ерік Кінг

2
Так, "хороше тестування" - це така суб'єктивна річ, яку потрібно розглянути, судячи з боку однолітків чи поважних органів. Переслідування показників просто призведе до багато витрачених зусиль і мало реального значення. Можливо, буде цікаво мати кілька призів: найвибагливіший тест, нагорода "тестування чогось, що раніше вважалося нездійсненним", найкращий тест на ефективність, найефективніший тест, самий незрозумілий тест, найрозумніший тест, найцінніший тест, тест, який, швидше за все, оцінять кінцеві користувачі ...
тайм

6

Тож якщо ви написали одиничний тест так ...

for (int i = 0; i < 100; i++) {
 assertTrue(i*i, square(i));
}

вам дадуть 100 балів.

Я б дав цій людині 0 балів (навіть якщо тест перевіряв щось фактично актуальне), тому що твердження в циклі мало сенсу, а з тестами з декількома твердженнями (особливо у формі циклу чи карти) важко працювати.

По суті, проблема полягає в тому, щоб мати метрику, яку [легко] неможливо обдурити. Показник, який ґрунтується виключно на кількості тверджень, точно такий же, як оплата розробникам за записану LOC. Як і у випадку оплати за LOC, що призводить до величезного та неможливого підтримання коду, ваша фактична політика компанії призводить до марних і, можливо, погано написаних тестів.

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

В ідеалі, ви б застосували системний підхід. На практиці це навряд чи може працювати в більшості компаній з розробки програмного забезпечення. Тож я можу запропонувати ще кілька речей:

  1. Використовуйте парні огляди для тестів і мають щось подібне до показника кількості WTF за хвилину .

  2. Виміряйте вплив цих тестів у часі на кількість помилок . Це має ряд переваг:

    • Здається, справедливо,
    • Дійсно можна виміряти, якщо ви збираєте достатньо даних про звіти про помилки та їх долю,
    • Насправді варто!
  3. Використовуйте покриття відділення , але комбінуйте його з іншими показниками (а також оглядом). Покриття відділенням має свої переваги, але тестування коду CRUD лише для отримання кращої оцінки - це не найкращий спосіб витратити час розробників.

  4. Вирішіть усі разом, які показники ви хочете застосувати на даний момент (такі рішення можуть бути не вітаються або навіть можливі в деяких компаніях та командах). Часто переглядайте та змінюйте показники, вибираючи ті, які стають більш релевантними, і переконайтеся, що всі чітко розуміють, що вимірюється та як.


1
+1 за нульові бали. Інші заперечення будуть AAA - Упорядкувати, діяти, затверджувати; Параметризовані тести; Немає копіювання коду реалізації ...
thepacker

5

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

Отже, я думаю, було б сенсом, що переможцем повинен бути той розробник, який знайде найбільше помилок, або розробник, чиї тести досягають найбільшого збільшення покриття коду.

Тест заробив би вам бал, якщо він спричинить відкриття нового запису у вашій системі відстеження проблем / помилок / дефектів. Якщо запис для цього питання вже відкритий, він не враховується. Крім того, як запропоновано в коментарях, помилки у власному коді не враховуються; слід вважати лише помилки в коді інших людей. На жаль, цей підхід не дає миттєвого задоволення, оскільки може пройти декілька днів, поки всі провалені тести не будуть пропущені і відповідні питання не будуть відкриті. Також це може не завжди працювати; По мірі дорослішання вашої системи, через додавання тестів може виявлятися помилок надзвичайно рідко.

Збільшення охоплення кодом може забезпечити більш об'єктивне вимірювання покращення, представленого новими тестами. По-перше, загальне покриття коду повинно бути зафіксовано за день до змагань. Тоді кожному розробникові потрібно буде якось показати збільшення покриття кодом, яке є результатом лише їх тестів, не враховуючи збільшення покриття кодом, отримане в результаті тестів, написаних іншими розробниками. Це означає, що вам, напевно, знадобиться арбітр, який перейде до машини кожного розробника і запише нове покриття коду до того, як чиїсь тести будуть здійснені.

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


2
Звучить багатообіцяюче, але потім поведінка в "іграх в систему" перетворюється на гарну колекцію відомих вами помилок, які будуть "відкриті" в наступному конкурсі тестування ... dilbert.com/strip/1995-11 -13
тайм

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


@ col6y ви праві, це теж досить важливо. На жаль, все ще є способи встановити систему. Наприклад, якщо ваш код викликає мій код, щоб виконати його роботу, мій код міг би переконатися, що ваш код зазнає "аварії".
Майк Накіс

3
Я не погоджуюсь. Одиничні тести, коли вони нещодавно написані, в першу чергу не для пошуку помилок , це помилка. Вони можуть знайти регресії через кілька тижнів чи місяців після їх написання, але це, ймовірно, вже пізно, щоб надати корисні показники для змагань. Зазвичай ви пишете одиничний тест після того, як виникла певна помилка, щоб переконатися, що пізніше в майбутньому ви не отримаєте одного типу помилки.
Док Браун
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.