2020-03-19 21:57:07 +00:00
|
|
|
|
## coverme
|
|
|
|
|
|
|
|
|
|
В этой задаче нужно покрыть простой todo-app http сервис unit тестами.
|
|
|
|
|
|
2020-03-19 22:30:21 +00:00
|
|
|
|
Необходимо покрыть все sub-package'и.
|
2020-03-19 21:57:07 +00:00
|
|
|
|
Package main можно не тестировать.
|
|
|
|
|
|
2020-03-19 22:30:21 +00:00
|
|
|
|
Существующие файлы менять не нужно.
|
|
|
|
|
Нужно создавать новые файлы с тестами.
|
|
|
|
|
|
|
|
|
|
Тестирующая система будет проверять code coverage.
|
2020-03-19 21:57:07 +00:00
|
|
|
|
Порог задан в [coverage_test.go](./app/coverage_test.go)
|
|
|
|
|
|
2020-03-19 22:38:59 +00:00
|
|
|
|
Важно понимать, что coverage 100% - не решение всех проблем.
|
|
|
|
|
В коде по-прежнему могут быть ошибки.
|
|
|
|
|
Coverage 100% говорит ровно о том, что все строки кода выполнялись.
|
2021-04-02 20:20:26 +00:00
|
|
|
|
Хорошие тесты, в первую очередь, тестируют функциональность.
|
2020-03-19 22:38:59 +00:00
|
|
|
|
|
2022-03-24 15:49:56 +00:00
|
|
|
|
Как посмотреть общий coverage:
|
2020-03-19 21:57:07 +00:00
|
|
|
|
```
|
|
|
|
|
go test -v -cover ./coverme/...
|
|
|
|
|
```
|
|
|
|
|
|
2022-03-24 15:49:56 +00:00
|
|
|
|
Как посмотреть coverage пакета в html:
|
|
|
|
|
```
|
|
|
|
|
go test -v -coverprofile=/tmp/coverage.out ./coverme/models/...
|
|
|
|
|
go tool cover -html=/tmp/coverage.out
|
|
|
|
|
```
|
|
|
|
|
Аналогичная функциональность поддерживается в Goland.
|
|
|
|
|
Также рекомендуем ознакомиться с рассказом о cover в блоге (см. ссылки).
|
2020-03-19 22:30:21 +00:00
|
|
|
|
|
2020-03-19 21:57:07 +00:00
|
|
|
|
## Ссылки
|
|
|
|
|
|
2020-03-19 23:14:23 +00:00
|
|
|
|
1. слайды: https://p.go.manytask.org/04-testing/lecture.slide
|
|
|
|
|
2. cover: https://blog.golang.org/cover
|
|
|
|
|
3. assertions: https://github.com/stretchr/testify
|
2021-04-02 20:20:26 +00:00
|
|
|
|
4. [gomock](https://github.com/golang/mock) для создания мока базы данных при тестировании сервера
|
2020-03-19 23:14:23 +00:00
|
|
|
|
5. [httptest.ResponseRecorder](https://golang.org/pkg/net/http/httptest/#ResponseRecorder) для тестирования handler'ов сервера
|
2021-04-02 20:20:26 +00:00
|
|
|
|
6. [httptest.Server](https://golang.org/pkg/net/http/httptest/#Server) для тестирования клиента
|
2020-03-19 23:14:23 +00:00
|
|
|
|
7. Если вы ждёте, когда же выложат лекцию: https://www.youtube.com/watch?v=ndmB0bj7eyw
|
2020-03-19 21:57:07 +00:00
|
|
|
|
|
|
|
|
|
## O сервисе
|
|
|
|
|
|
|
|
|
|
Todo-app с минимальной функциональностью + client.
|
|
|
|
|
|
|
|
|
|
Запуск:
|
|
|
|
|
```
|
|
|
|
|
✗ go run ./coverme/main.go -port 6029
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Health check:
|
|
|
|
|
```
|
2022-03-24 15:48:48 +00:00
|
|
|
|
✗ curl -i -X GET localhost:6029/
|
2020-03-19 21:57:07 +00:00
|
|
|
|
HTTP/1.1 200 OK
|
|
|
|
|
Content-Type: application/json
|
|
|
|
|
Date: Thu, 19 Mar 2020 21:46:02 GMT
|
|
|
|
|
Content-Length: 24
|
|
|
|
|
|
|
|
|
|
"API is up and working!"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Создать новое todo:
|
|
|
|
|
```
|
|
|
|
|
✗ curl -i localhost:6029/todo/create -d '{"title":"A","content":"a"}'
|
|
|
|
|
HTTP/1.1 201 Created
|
|
|
|
|
Content-Type: application/json
|
|
|
|
|
Date: Thu, 19 Mar 2020 21:41:31 GMT
|
|
|
|
|
Content-Length: 51
|
|
|
|
|
|
|
|
|
|
{"id":0,"title":"A","content":"a","finished":false}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Получить todo по id:
|
|
|
|
|
```
|
2022-03-24 15:48:48 +00:00
|
|
|
|
✗ curl -i localhost:6029/todo/0
|
2020-03-19 21:57:07 +00:00
|
|
|
|
HTTP/1.1 200 OK
|
|
|
|
|
Content-Type: application/json
|
|
|
|
|
Date: Thu, 19 Mar 2020 21:44:17 GMT
|
|
|
|
|
Content-Length: 51
|
|
|
|
|
|
|
|
|
|
{"id":0,"title":"A","content":"a","finished":false}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Получить все todo:
|
|
|
|
|
```
|
2022-03-24 15:48:48 +00:00
|
|
|
|
✗ curl -i -X GET localhost:6029/todo
|
2020-03-19 21:57:07 +00:00
|
|
|
|
HTTP/1.1 200 OK
|
|
|
|
|
Content-Type: application/json
|
|
|
|
|
Date: Thu, 19 Mar 2020 21:44:37 GMT
|
|
|
|
|
Content-Length: 53
|
|
|
|
|
|
|
|
|
|
[{"id":0,"title":"A","content":"a","finished":false}]
|
2021-04-02 20:20:26 +00:00
|
|
|
|
```
|
2022-03-24 15:48:48 +00:00
|
|
|
|
|
|
|
|
|
Завершить todo:
|
|
|
|
|
```
|
|
|
|
|
✗ curl -i -X POST localhost:6029/todo/0/finish
|
|
|
|
|
HTTP/1.1 200 OK
|
|
|
|
|
Date: Thu, 24 Mar 2022 15:40:49 GMT
|
|
|
|
|
Content-Length: 0
|
|
|
|
|
|
|
|
|
|
✗ curl -i -X GET localhost:6029/todo
|
|
|
|
|
HTTP/1.1 200 OK
|
|
|
|
|
Content-Type: application/json
|
|
|
|
|
Date: Thu, 24 Mar 2022 15:41:04 GMT
|
|
|
|
|
Content-Length: 52
|
|
|
|
|
|
|
|
|
|
[{"id":0,"title":"A","content":"a","finished":true}]%
|
|
|
|
|
```
|