Як ви зробили тестування приладів більш приємним? [зачинено]


18

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

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


1
Я люблю писати одиничні тести та інші тести, почасти тому, що майже всі інші їх смокчуть (іноді вони також смокчуть виготовлення інструментів, які я тестую). Ні, я не смоктав як розробник. Мені просто подобається зручність, солодощі для очей та автоматизація. MbUnitБібліотека змінила моє життя. Автоматичне тестування є важливим. Автоматичне тестування економить час. Автоматичне тестування економить гроші. Автоматичне тестування може врятувати життя. Автоматичне тестування - єдиний спосіб. Автотестування є ще однією мережею безпеки. Коли я один із 50 людей, які працюють над величезною архітектурою, я відчуваю себе ще однією цеглою в стіні. З одиничними тестами я контролюю.
Робота

Лінь і розчарування при одиничному тестуванні - це нормальна реакція на роботу, яку наш мозок сприймає як марну. Я ненавиджу писати та підтримувати одиничні тести, які мають низьку або негативну рентабельність інвестицій. Однак написання корисних тестів - це приємне завдання, але це вміння самостійно розпізнавати, що корисно, а що - сміття. Є хлопець, який пише книгу на цю тему на основі свого блогу, ви можете зірка читати тут: enterprisecraftsmanship.com/2016/06/01/…
KolA

Відповіді:


22

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

Я вважаю, що для мене є два способи одиничного тестування, які дійсно роблять його приємним:

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

12

Вищі переваги.

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

* - Ні, не буду.

Я вважаю, що це як працювати або їсти здорово; до тих пір, поки відчутні переваги насправді не почнеться ("Святі кулі, я дійсно АМ вловлюю безглузді помилки регресії, які могли б урізатись у виробництво!"), моральна гордість того, що ти знаєш, що ти робиш правильну річ, може допомогти тобі перенести тебе наскрізь.


7

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

Наприклад, деякі люди напишуть функцію, а потім відкриють інтерактивну сесію, щоб перевірити її на кілька значень і переконатися, що вона працює:

def fact x
  if x == 0
    1
  else 
    x * fact(x-1)
  end
end

>> fact 10
=> 3628800
>> fact 7
=> 5040

Але тепер ви виявите помилку:

>> fact -1
SystemStackError: stack level too deep
    from (irb):2:in `fact'
    from (irb):5:in `fact'
    from (irb):10

Отже, ви виправите це:

def fact x
  if x < 0
    raise "Can't take the factorial of a negative number"
  elsif x == 0
    1
  else 
    x * fact(x-1)
  end
end

>> fact -1
RuntimeError: Can't take the factorial of a negative number
    from (irb):3:in `fact'
    from (irb):10

Але тепер вам дійсно слід протестувати, щоб переконатися, що він все ще працює:

>> fact 10
=> 3628800
>> fact 7
=> 5040

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

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

І одиничні тести не слід писати після факту, як додаткова робота, коли у вас є код, який ви "знаєте", вже працює. Експертні тести повинні бути складені спочатку або принаймні (оскільки іноді ви забудете їх написати) відразу після написання коду, про який йдеться. Це називається тестовою розробкою, і це може допомогти зробити ваші API краще; якщо ви спершу пишете тести, які виконують API, ви дізнаєтесь, де саме API застосовувати, перш ніж навіть написати код, і зможете переробити дизайн набагато простіше, ніж якщо ви лише потім додасте тести.


@Biran, я згоден. Але все це робить це "правильною" справою. Але як зробити це приємним? Навіть трохи?
Преєт

@Preets Це приємно, тому що ви уникаєте повторного ручного тестування. Приємніше, коли ти робиш це спочатку , на відміну від після факту, тому що це стає частиною процесу проектування, а не справою за кодом, який вже "працює".
Брайан Кемпбелл

Отже, витрачайте час, роблячи це погано, так що робити це ПРАВО почуває себе весело порівняно? ... Це може спрацювати насправді ....
BlairHippo

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

@Biran, Дякую! Нещодавно я використовував TDD для свого хобі-проекту, і це змінило те, як я думаю про тестування одиниць.
Преєт

5

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


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

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

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

3

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


3

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


Оскільки застарілий код, як правило, не легко перевірити, я намагаюся написати хороші одиничні тести - тому процес не тільки болючий, але і результат (одиничні тести) теж не особливо корисні: - / я вважаю, що це найбільше засмучує .. Гра на висвітлення дуже хороша :)
Преець

1

Спробуйте потрапити в Потік . Поставте собі жорсткі, але досяжні цілі. Що може бути метою в одиничному тестуванні? Наприклад, спробуйте писати швидше, зберігаючи якість. Експерименти не вимагають занадто багато думок, тому помилка малоймовірна. Концентруйтеся на своїй цілі і часто перевіряйте, чи не наближаєтесь ви до неї.


Так, чому ти кажеш, що тест на одиницю не вимагає занадто багато думок? Якщо ви працюєте з TDD, це вимагає багато думок. Це неправда?
Преєт

Ви праві, я не врахував TDD.
Tamás Szelei

0

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


0

Не намагаючись обманути себе, що я можу обдурити свою думку, що тестування одиниць може бути приємним протягом будь-якого стійкого періоду часу.

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

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

Незмінно відповідь - це гучне "ні".

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


Не кожен тест є добрим чи корисним. Це те, про що TDD'ers та інші тестуючі євангелісти зазвичай не згадують. Б'юсь об заклад, у деяких рідкісних моментах вам подобається тестування одиниць, коли ви знаєте, що це тестування складної логіки, тест елегантний і не пов'язаний з реалізацією, і я ненавиджу, коли вас змушують тестувати тривіальне лайно лише для досягнення певної мети охоплення коду, яка вимагається керівні принципи проекту.
KolA

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