Чи слід перевіряти дані тесту на контроль версій?


40

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

Моє запитання: де я повинен зберігати ці великі PDF-файли? Чи слід перевірити їх на контроль версій разом із кодом? Або покласти їх десь ще? Очевидно, тестовий код марний без PDF-файлів (або навіть з різними PDF-файлами), але все ж, якщо розмістити їх у нашому сховищі, почувається неправильним.



19
@ MichaelKjörling:Tests != Test Data
Роберт Харві

4
@RobertHarvey Щоправда, але якщо дані тесту потрібні, щоб тест працював, я вважаю, що це слід вважати частиною тесту. Це також підхід, застосований усіма трьома відповідями поки що, наскільки я їх розумію.
CVn

Відповіді:


84

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

Я повинен мати можливість перевірити проект і мати повне середовище для компіляції, складання та тестування.

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

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


20
Так. Абсолютно так. Це 2014 рік, немає жодного виправдання для використання контролю версії, який не обробляє бінарні файли безперебійно.
Кіліан Фот

4
Я погоджуюся, але ви точно хочете уникнути ситуації, коли ви також перевіряєте в непотрібних предметах. Наприклад, якщо дані тесту містять папку "вихід", яка містить усі файли pdf, згенеровані тестами, ви хочете не включати їх у сховище. Але я згоден, самі тести повинні бути частиною репо, а також будь-яких пакетів, необхідних для його запуску.
Кеннет Гарза

1
@KennethGarza Насправді це не важко. Як правило, слід включати будь-який оригінальний вміст (вихідний код, тестовий вихідний код, тестові дані, медіа, [реальну] документацію, сторонні бібліотеки, сценарії побудови, сценарії інструментарію, скрипти перетворення тощо), а всі дані які можуть бути сформовані в розумний час з початкових даних, не повинно бути. Крім того, враховуючи, що це тестові результати, вони, ймовірно, мають сенс лише після запуску тестів самостійно, інакше ви не тестуєте свою програму, ви тестуєте здатність програмного забезпечення VCS зберігати цілісність ваших файлів :)
Thomas

1
@ MarnenLaibow-Koser: проект, над яким я працював з виявлення електричної несправності в імплантованих проводах кардіостимулятора, мав тестовий набір понад 40 Гб. Не існує ДКС, де справа з цим не є шкідливою. Наявність двох репостів - це клопоти адміністрації, але іноді це може бути кращим вибором.
whatsisname

1
@ MarnenLaibow-Koser ви його отримали. Інтеграційні тести проводяться в окремому репо, і якщо користувач захоче запустити його локально, управління залежностями отримає для нього zip-файл і розпакує його. Зазвичай сервер / ферма безперервної інтеграції покладають завдання провести інтеграційне тестування і запобігають об'єднанню гілки функцій, поки не пройдуть тести інтеграції.
user482745

15

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

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


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

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


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

7

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

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


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

5
@DavidWallace Отже, ви говорите, що цілі поля, такі як тестова перевірка, перевірка властивостей і тестування статистичного програмного забезпечення, є не тільки помилковими, але й шкідливими?
Варбо

5
@DavidWallace випадковий! = Невідтворюваний.
congusbongus

5
@DavidWallace ви можете називати це все, що ви хочете тоді. Випадкові дані випробувань, записуйте вхідні дані, якщо необхідно, переробляйте, відтворюючи ergo. Це не призводить до світу рани.
congusbongus

2
@DavidWallace "замість того, щоб зупинятись на думці про те, які тестові справи насправді потрібні", не означає "не випадкове тестування", це означає "не тільки випадкове тестування". Що стосується "ви не можете відтворити дані, які знайшли помилку", ви насправді прочитали відповідь, яку коментуєте? ;)
Варбо

0

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

За допомогою git ви можете налаштувати .gitignore, щоб запобігти забрудненню вашого репо будь-якого тимчасового виводу або тестового журналу.

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