Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni

18.11.2022

🐹🗄️😭 Поскаржуся на складнощі з тестуванням БД на Go.

Попередження: мені ще не доводилося використати жодну з повноцінних ORM для Go. Причина в тому, що в мене завжди десь поруч Rails, а у Rails чудовий інструментарій для міграцій і такого іншого. Тож на долю Go залишається тільки обмежена кількість запитів. Тож записуємо їх явно, у вигляді SQL, а запускаємо за допомогою database/sql. Але ж їх теж треба тестувати.

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

Спочатку треба відтворити структуру бази для тестів. Якщо є Rails, то це просто — беремо базу від Rails. Також для CI копіюємо database_structure.sql з Rails в репозиторій з Go, і завантажуємо перед тестами. Теж нескладно (тільки доводиться вручну підтримувати в актуальному стані.)

А далі — складна частина. Як наповнити тестову базу даними? В Go немає загально прийнятного аналогу factory_bot - принаймні, такого, що можна вжити без ORM.

Раніше я наповнював базу довжелезними SQL-скриптами - на кшталт TRUNCATE ...; INSERT .... Їх жахливо читати та змінювати. До того ж в скрипті незрозуміло, де важливі значення, а де — необхідне наповнення обовʼязкових стовпчиків. Втім, саме такий підхід я вживав багато років на декількох проєктах — бо принаймні він технічно простий.

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

Бібліотека testfixtures дозволяє описати таблиці у вигляді YAML. В цих файлах YAML можна навіть використати шаблони, та передавати значення з коду Go. Тобто замість непрозорих, магічних значень тепер в тестах можна посилатись на ті ж самі змінні, що будуть записані в базу. Чого не вистачає — автоматичного наповнювання обовʼязкових стовпчиків.

Так поки й живемо. А ще налаштування бази зручно робити з testify/suite.