Дізнаймося, як тестувати свої вправи з 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 для коду перед поданням.
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 або подібну команду, зазначену в документації тестової програми.