Тестування на треку Go

Дізнаймося, як тестувати свої вправи з Go на Exercism


Вправи з Go у каталозі проєкту exercism можна запускати, перейшовши в каталог вправи та виконавши go test.

cd exercism/project/directory/go/leap
go test

Тести з детектором гонок даних

Окрім запуску go test, деякі вправи слід запускати з прапорцем для детектора гонок даних, щоб перевірити, чи не додає рішення помилок, повʼязаних із гонками даних. У відповідних вправах буде нагадування запускати тести з прапорцем -race для детектора гонок даних. Запустіть go test -race, щоб перевірити на гонки даних. Наприклад:

cd exercism/project/directory/go/bank-account
go test -race

Запуск бенчмарків

Більшість вправ містять бенчмарки, які можна використати, щоб визначити, як зміни в рішенні впливають на його продуктивність. Щоб запустити бенчмарки для вправи, використайте команду go test -v --bench . --benchmem у каталозі вправи.

Розгляньмо ці вихідні дані.

BenchmarkReverse-16       403594              2537 ns/op             176 B/op         34 allocs/op

Це означає, що для надійного вимірювання часу бенчмарку знадобилося 403594 ітерації. Середня швидкість становила 2537 нс на цикл. На кожну операцію припадало 34 виділення памʼяті, у середньому 176 байтів.

Тестовані приклади

Приклади тестів використовуються в деяких вправах і запускаються разом зі стандартними тестами вправи. Ці приклади використовуються для документування та перевірки API вправи й можуть бути корисними для визначення очікуваного API вправи.

Go fmt

Будь ласка, запустіть go fmt для коду перед поданням.

Підказки та поради

Написання коду вправи

README.md для кожної вправи містить загальний опис, але тестова програма Go буде дуже конкретною. Відкрийте тестову програму й швидко перегляньте її. Навіть якщо це здається підгляданням, усе одно зробіть це. Шукайте корисні коментарі, тестові дані та навіть просто назви тестових функцій. Спробуйте запустити go test до того, як щось написати, і подивіться, чи повідомлення про помилки підкажуть, з чого почати.

Перша мета - домогтися, щоб щось компілювалося, навіть якщо тести не проходять. Для цього слід зробити «заглушки» функцій. Це означає залишити тіло порожнім, крім того, що функція має повернути. Напишіть return 0 або return "" або будь-що, аби воно компілювалося. Іноді, щоб зʼясувати сигнатури функцій, доведеться повернутися до тестової програми й прочитати її докладніше. Коли всі потрібні сигнатури функцій зʼясовано, тестова програма почне скаржитися, що 0 - неправильна відповідь. Тепер починайте заповнювати тіла функцій.

Виправлення

Тести часто зупиняються на першій помилці. Виправте її й повторюйте, доки помилок не залишиться. go test має корисні опції. go test -v дасть докладніші вихідні дані. go test -run <regexp> запустить лише тести, назви яких відповідають <regexp>.

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

Щоб знайти проблеми в конкурентних програмах, спробуйте go test -race.

Чистота коду

Повторімо ще раз: запустіть go fmt. Golint може повідомити про проблеми зі стилем у коді, які go fmt не виявить. Також можна поглянути на go vet, який попереджає про потенційні проблеми в коді. Прочитайте й візьміть до уваги часті коментарі з оглядів коду. Для вправи, яка передбачає конкурентність, спробуйте go test -race, навіть якщо вона проходить свої тести. Памʼятайте про читабельність, навіть коли оптимізація спрямована на продуктивність бенчмарку. Іноді оптимізація допомагає знайти рішення, які є стислими й читабельними, але може виникнути спокуса знехтувати читабельністю заради продуктивності.

Бонусні тести

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