Код тестування доставки. Чому б ти не став?


17

Я хотів би поставити тестовий код поряд із продуктом. Зокрема, передбачте варіант, щоб кожен, хто має копію нашої програми, міг натиснути кнопку «самотестування» або пройти тест - себе у командному рядку та пройти через повний набір підрозділів | інтеграційні тести.

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

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

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


8
Чому тест одиниці в програмі із закритим кодом (або програмі з відкритим кодом, яка не була змінена) ніколи не виходила з ладу? Якщо для вашого продукту потрібна досить велика кількість проблем із налаштуваннями та налаштуваннями, часто є джерелом помилок, можливо, має сенс надсилати якусь програму "перевірити мою конфігурацію", яка робить такі дії, як перевірка підключення до бази даних, перевірка підключень до будь-яких інших зовнішніх служб ваш код залежить від і т. д. Не було б сенсу тест одиниці ніколи не виходити з ладу, оскільки ви вже підтвердили, що код працює.
Джастін Печера

рекомендовано прочитати: Як пояснити $ {щось} до $ {когось}?
гнат

15
Чому в полі провалився б одиничний тест? У верхній частині голови: корупційна програма. Химерне обладнання. Умови перегонів ми місцево не бачили. Пов’язано з іншою динамічною бібліотекою. Конфлікти з антивірусом або ОС. Використовується з дивною версією відповідного програмного забезпечення через неповне оновлення. Взаємодія з іншими процесами веде себе не так, як очікувалося. Існує безліч причин, чому помилки з'являються в полі, і багато з них можуть потрапити в тест одиниці (за заданим визначенням одиниці)
Джон Честерфілд

7
@JonChesterfield: створення функції самотестування у вашій програмі, мабуть, добре. І якщо ця функція самотестування може частково повторно використовувати код з ваших тестових одиниць, чому б ні? Але таку особливість, як і деталі для багаторазового використання, слід розробляти з точки зору "це виробничий код".
Док Браун

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

Відповіді:


19

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

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

З іншого боку, багато тестів просто неприємно погані, і навіть не перевіряють те, що деякі вважають тестуванням. Це інше питання ...

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


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

Так, важко це зробити після факту. Думаю, вам пощастить приділити більше зусиль для розробки тестів на доставку.
Ерік Ейдт

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

@DocBrown, я розумію. Ймовірно, це питання тлумачення, оскільки ОП згадувала десь на посаді про "відкритий код". У будь-якому випадку ваша редакція добре узагальнює питання.
Ерік Ейдт

18

Тести на доставку? Так. Тести доставки? Ні.

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

Тепер, доставка пакетів тесту інтеграції, який викликає інтерфейс, який викликає логіку, що викликає dll ..., це буде працювати набагато краще. Інтеграційні тести можуть показати інші аспекти несправних установок, які б не показали одиничні тести. (наприклад, мій поточний продукт вимагає встановлення k-lite кодеків, які нам не дозволяють комплектувати через ліцензування. Тестові одиниці можуть показувати, що наш код працює нормально, але все ще не працює для задоволення клієнтів. Аналогічно, наша конфігурація кодеків можливо, не працювали правильно, одиничні тести також не показали б це).

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


2

Я міг би зрозуміти це занепокоєння в тих областях, де ви охоплюєте кожен один дюйм апаратного забезпечення, як багатопотоковий ігровий движок наступного покоління AAA, який використовує кожне ядро ​​процесора, вбудовані SIMD, GPU, GPGPU тощо, постачаючи крос-платформу продукт.

У цих випадках найгіршим кошмаром часто будуть ті випадки, коли ваші тести (блок та інтеграція) пройдуть за перші 5000 перевірених розрізнених машин / платформ, але не вдаються до 5,001-ї через помилку драйвера для малозрозумілої моделі GPU Просто подумати з цього приводу мене тремтять - ви не можете їх перевірити або передбачити заздалегідь.

Особливо, якщо ви пишете шейдери для графічного процесора, ви можете закінчити розіграти зворотну лотерею, де половина написаного вами коду призведе до невизначеної поведінки, оскільки існує декілька портативних стандартних гарантій, які застосовуються всіма моделями / драйверами GPU. Хоча в наші дні стає все менше, як грати тральщиком, це має дати людям певне уявлення: http://theorangeduck.com/page/writing-portable-opengl . Спроба цього в кінці 90-х та на початку 2000-х була справді жахливою, і вона була тральщиком у всій мірі.

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

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

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

Але є ще одне, що я пропоную:

Ведення журналів

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

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

Я радимо заради розуму прийняти неминуче. Ви нічого не можете зробити з цими речами, ви не зможете всебічно перевірити. Не намагайтеся попередити ураган (неможливо), але забивайте ці вікна.

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

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

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

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

У будь-якому випадку, я сподіваюся, що це допомагає. У минулому я стикався з такою спокусою і мав трохи параноїї навколо кодування GPU (GPGPU і шейдери) в результаті деякого минулого досвіду між собою та моєю командою (іноді просто бачу, як інші члени команди мають справу з цим дійсно пізній і після випуску дав мені повзання, як деякі проблеми ATI на певній моделі Radeon, яка б вийшла з ладу при наданні антиаліазійних ліній, пізніше повідомляється і позначається як відома проблема з наявними лише рішенням вирішення проблеми.

Запис журналу був тим, що врятувало наші приклади там, і ми часто бачили проблему на тій 10 001-й неясній прототипі з вбудованою GPU, про яку ми ніколи не чули, і останній рядок коду одразу дозволив нам помітити, де саме збій знизився до 2 або 3 рядки коду як підозрюваного, наприклад, якщо він знаходиться у всеосяжному шейдері, ми начебто SOL, оскільки ми не можемо проводити вхід всередині шейдера графічного процесора, але ми можемо принаймні використовувати журнал, щоб побачити, який шейдер виникла проблема. почати розслідування.


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