From c4d3aeac0c649d08a012cab76aaf65e7b72b83b6 Mon Sep 17 00:00:00 2001 From: Fedor Korotkiy Date: Sat, 18 Jan 2020 21:24:16 +0300 Subject: [PATCH] Add example task. Provide documentation about testing. --- README.md | 35 ++++++++++++++++++++++++++++++++++- go.mod | 3 +++ sum/foo.go | 3 +++ sum/sum.go | 7 +++++++ sum/sum_test.go | 22 ++++++++++++++++++++++ 5 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 go.mod create mode 100644 sum/foo.go create mode 100644 sum/sum.go create mode 100644 sum/sum_test.go diff --git a/README.md b/README.md index 4f160fc..d48cfd3 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ Интеграционные тесты. Goroutine leak detector. TestingMain. Coverage. Сравнение бенчмарков. 6. Concurrency with shared memory. sync.Mutex. sync.RWMutex. sync.Cond. atomic. sync.Once. - Race detector. Async cache. + Race detector. Async cache. Работа с базой данных. database/sql. sqlx. gorm. 7. Package context. Passing request-scoped data. http middleware. chi.Router. Request cancellation. Advanced concurrency patterns. Async cache. Graceful server shutdown. context.WithTimeout. @@ -71,3 +71,36 @@ 5. Project layout. 6. Go proverbs. https://go-proverbs.github.io/ 7. All stdlib packages. + +## Тестирование задач + + - Каждая задача должна лежать в отдельном пакете или пакетах. + - Зависимостей между пакетами на верхнем уровне быть не должно. + - Автоматические тесты на задачу должны запускаться через go test. + - Авторское решение задачи должно лежать в репозитори и включаться + билд тегом solution. + - Некоторые тесты в задаче могут быть приватными. Такие тесты должны + включаться билд тегом private. Эти тесты не будут доступны + студентам, но будут запускаться в момент проверки решения в + тестирующей системе. + - При посылке решения, на сервер отправляются все файлы внутри пакета. + - При тестировании, используются изменённые файлы пакета, и + оригинальные файлы тестов. + - Файл пакета можно защитить от изменения, добавив `// +build !change` в начало файла. + В этом случае, при тестировании посылки всегда будет использоваться оригинальная версия файла. + - Тесты могут использовать файлы из директории testdata. Менять testdata нельзя. + +```sh +# Запуск тестов студентом +go test ./... + +# Запуск тестов при разработке задачи +go test -tags solution,private ./... + +# Запуск тестов на сервере +## 1. Скопировать файлы пакета из посылки. +## 2. Скопировать все файлы тестов из приватного репозитория. +## 3. Скопировать !change файлы из приватного репозитория. +## 4. Скопировать testdata из приватного репозитория. +go test -tags private ./... +``` diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..c5780b9 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module gitlab.com/slon/shad-go + +go 1.13 diff --git a/sum/foo.go b/sum/foo.go new file mode 100644 index 0000000..3b01770 --- /dev/null +++ b/sum/foo.go @@ -0,0 +1,3 @@ +// +build !change + +package sum diff --git a/sum/sum.go b/sum/sum.go new file mode 100644 index 0000000..5e2b0d8 --- /dev/null +++ b/sum/sum.go @@ -0,0 +1,7 @@ +// +build !solution + +package sum + +func Sum(a, b int) int { + return 0 +} diff --git a/sum/sum_test.go b/sum/sum_test.go new file mode 100644 index 0000000..a31200c --- /dev/null +++ b/sum/sum_test.go @@ -0,0 +1,22 @@ +package sum + +import ( + "math" + "testing" +) + +type testCase struct { + a, b, sum int +} + +func TestSum(t *testing.T) { + for _, input := range []testCase{ + {a: 2, b: 2, sum: 4}, + {a: 2, b: -2, sum: 0}, + {a: math.MaxInt64, b: 1, sum: math.MinInt64}, + } { + if out := Sum(input.a, input.b); out != input.sum { + t.Errorf("%d + %d == %d != %d", input.a, input.b, out, input.sum) + } + } +}