Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

юнит-тест для простой валидации #32

Merged
merged 6 commits into from Feb 24, 2023

Conversation

nekr0z
Copy link
Collaborator

@nekr0z nekr0z commented Feb 18, 2023

Начинаем добавлять юнит-тесты :)))

Обрати внимание, этот тест — в пакете validation_test, а не в пакете validation; это сделано нарочно, чтобы у теста не было доступа к внутренней логике пакета, и он проверял только взаимодействие пакета с внешним миром. В данном случае это пока не имеет значения, но уже на следующей итерации — начнёт, увидишь ;)

По сути же единственного написанного теста — это тот же самый «табличный» тест, в котором поднимается сервер (пакет httptest сам разберётся, какой порт на localhost свободен, и поднимет там, а в srv.URL положит адрес того, что получилось), и об него тестируются URL с соответствующими полями.

Тесткейсов надо набросать побольше, но я остановился пока на одном, потому что первый же тесткейс, который пришёл мне в голову, нашёл баг (вот тут) ;-)

@nekr0z
Copy link
Collaborator Author

nekr0z commented Feb 18, 2023

Собственно, тесткейсы должны покрывать все случаи, описанные в спецификации как поведение сервиса простой валидации. Первая и главная задача юнит-тестов — проверять компонент в целом на соответствие спеке. Важная разница между юнит-тестами и просто тестами: просто тесты могут переписываться в процессе рефакторинга и оптимизации, когда меняется внутренняя логика; юнит-тесты должны переписываться только при изменении спецификации, а изменения внутренней логики их затрагивать не должны.

@loskutovanl
Copy link
Collaborator

Я правильно понимаю, что сейчас ошибка из-за того что нельзя привести пользовательский тип square из пакета board к типу int8?

Может всё-таки имеет смысл сделать square экспортируемым?

@nekr0z
Copy link
Collaborator Author

nekr0z commented Feb 20, 2023

Я правильно понимаю, что сейчас ошибка из-за того что нельзя привести пользовательский тип square из пакета board к типу int8?

Нет, сейчас ошибка из-за того, что from и to берутся из from, а to игнорируется :)

…ests for StatusOK, StatusForbidden & StatusBadRequest
@loskutovanl
Copy link
Collaborator

Привет!
Добавила тесты, исправила баги. Что-то упустила? Или могу мержить?

@nekr0z
Copy link
Collaborator Author

nekr0z commented Feb 21, 2023

А откуда взялся http.StatusBadRequest? По спеке, этот сервис отвечает либо 200, либо 403 :)

@loskutovanl
Copy link
Collaborator

Кажется логичным, что в случае некорректных входных данных (несуществующая фигура, клетка и т.п.) выводится более говорящее StatusBadRequest, а не информация о невалидном ходе, ведь валидировать тогда нечего

@nekr0z
Copy link
Collaborator Author

nekr0z commented Feb 21, 2023

Кажется логичным, что в случае некорректных входных данных (несуществующая фигура, клетка и т.п.) выводится более говорящее StatusBadRequest, а не информация о невалидном ходе, ведь валидировать тогда нечего

Это логично, я согласен; но тогда надо внести соответствующую правку в спецификацию ;)

@nekr0z
Copy link
Collaborator Author

nekr0z commented Feb 22, 2023

Посмотри, как я переделал тест для простой валидации, сохранив все тесткейсы ;) «Зачем делать сложным то, что проще простого?»

@loskutovanl
Copy link
Collaborator

Посмотри, как я переделал тест для простой валидации, сохранив все тесткейсы ;) «Зачем делать сложным то, что проще простого?»

Да, грешу тем что усложняю...
В следующий раз не буду пуш делать, пока на свежую голову не посмотрю сама. Не знаю как по-другому с этим бороться.

В спеку внесла изменения

@nekr0z
Copy link
Collaborator Author

nekr0z commented Feb 22, 2023

Добавил fuzz-тест.

Это устроено немножко не так, как обычный тест. По коду можно догадаться, что там заданы три строки, которые тестируются в качестве query, и при обычном запуске командой go test будет происходить тестирование именно этих трёх строк.

Зато если запустить go test -fuzz FuzzSimple ., система будет генерировать случайные строки (взяв за основу те, что есть). Если найдётся строка, на которой тест упадёт, система добавить её в директорию testdata, и в дальнейшем при запуске тестов будет проверять и её тоже.

Фактически, этим тестом мы проверяем, что в ответ на любой возможный запрос наш сервис отвечает одним из трёх возможных по спеке статусов (к сожалению, тут не получается проверить, правильный ли это будет ответ, но для того у нас есть юнит-тесты), и никакой запрос не приводит к падению, панике или чему-то подобному. Поскольку этот сервис у нас будет «торчать наружу», и запрос может послать кто угодно, нам полезно знать, что злые хакеры не смогут уронить его или добиться неожиданного поведения — для того и fuzz-тестирование.

Подробно про то, как в Go работает fuzz — в документации. ;)

@nekr0z
Copy link
Collaborator Author

nekr0z commented Feb 22, 2023

И да, я погонял на своём ноутбуке этот fuzz-тест минут десять, ничего не нашлось ;)

@loskutovanl
Copy link
Collaborator

Евгений, спасибо, вроде понятно. Есть еще какие-то тесты, которые нужно сделать? Или могу мержить?

@nekr0z
Copy link
Collaborator Author

nekr0z commented Feb 24, 2023

Ну, ещё надо сделать тестов на остальные этапы валидации :)))
Но simple можно мёржить :)

@loskutovanl
Copy link
Collaborator

Если речь про advanced, то оно в процессе :) но там работы намнооого больше чем в simple

@loskutovanl loskutovanl merged commit 8fc2888 into simplevalidation Feb 24, 2023
3 checks passed
@loskutovanl loskutovanl deleted the simplevalidation-test branch February 24, 2023 19:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants