Чи слід включати тести на зображення Докера?


19

Що стосується тестів, я можу придумати два варіанти:

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

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

При другому варіанті зображення, що надсилається, не зовсім те саме, що тестоване.

Обидва виглядають як погані стратегії. Чи є третя, краща стратегія?


1
Ви в основному відповіли самі. І те й інше - погана ідея. Ви будете відправляти вже перевірені запущені процеси в контейнер розміром і підганяти до потреб. Ви не хочете розробити залежності, ані src-код. У виробництві його вважали ризиком.
Лаїв

1
Тестування перед контейнерацією означає, що навколишнє середовище не перевіряється, лише код є. Ви протестували лише частину вашої доставки, а не всю.
lfk

Відповіді:


10

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

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


1
Отож, це дуже великий варіант 2 - я запускаю тести в середовищі / контейнері, що дуже схоже на виробництво, але не зовсім те саме. Це так?
lfk

9

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

TL; DR;

Словом, вам потрібно розділити:

  • ваш код, від
  • конфігурація програми від
  • конфігурація системного середовища.

Кожен повинен бути незалежним один від одного та належним чином:

  • керована версія
  • перевірений
  • розгортається

Більш довга версія

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

Далі, як тільки ви будете задоволені функціональністю та правильністю вашої програми, база коду повинна бути відповідним тегом для конкретного випуску. Потім ця збірка повинна бути розгорнена до тестового середовища. Зауважте, що код буде таким самим, як перевірений у вашій ІП (доказово, якщо ви це зробили правильно), але ваша конфігурація може відрізнятися. Знову деякі постачальники CI можуть запропонувати цей крок, щоб ви могли протестувати розгортання пакувальної програми та дискретної конфігурації. Цей етап зазвичай буде включати функціональне тестування користувача (на нову функціональність), а також автоматизоване тестування (для відомих функціональних можливостей). Якщо випуск проходить цей етап, у вас є кандидат на випуск для інтеграційного тестування. Ви можете запустити тести автоматизації з іншого контейнера Docker,деякі показники, що зумовлюють тестування зусиль, - це 1: 1 для кодування зусиль (хоча я сам у цьому не впевнений).

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

Нарешті, у вас є випуск, який повинен бути готовий до виробництва лише з невеликим набором дельти конфігурації, ніж тестування ваших інтеграційних тестувань (IP-адреси, URI-адреси бази даних, паролі тощо). Ваша база коду була протестована щонайменше у трьох різних середовищах. точка та більшість конфігурацій системи принаймні один раз.


Це означає, що ваш ІС взагалі не тестує ваші Dockerfiles? Наприклад, якщо у вашому Dockerfile не вистачало залежності, тести все одно пройдуть?
lfk

1
Зовсім ні. Спочатку протестуйте код, потім протестуйте конфігурацію програми, а потім протестуйте систему. Я говорю, що це дискретні дії. Чудова річ у контейнерізації полягає в тому, що мрія про розвиток в середовищі, яке є тим же, що і прода, дуже близька. Але загартовування зробило б розвиток занадто важким.
avastmick

0

Я думаю, ви змішуєте різні види тестів. В основному вам потрібно запитати себе: що тут тестується пристрій?

Найпоширеніший сценарій, коли ви працюєте розробником, - це написати тестові одиниці / інтеграції для якогось коду, над яким ви працюєте, де цей фрагмент коду - це тестова одиниця. Ви проводите тести локально та / або в ІС.

Коли ви створили новий образ докера, він стає новим блоком, який ви можете протестувати. Які речі ви хотіли б перевірити на цей образ? Що таке API, який він надає? Як ви це тестуєте?

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

Тому я думаю, що третій варіант, який ви шукаєте, це:

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

Отже, кроки CI / CD були б такими:

Середовище розробки налаштувань -> Запуск тестів на код -> Побудова остаточного зображення -> Запуск тестів на зображенні -> Розгортання зображення.

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