sadmadrus / chessBox

chessBox
Apache License 2.0
0 stars 0 forks source link

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

Closed nekr0z closed 1 year ago

nekr0z commented 1 year ago

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

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

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

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

nekr0z commented 1 year ago

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

loskutovanl commented 1 year ago

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

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

nekr0z commented 1 year ago

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

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

loskutovanl commented 1 year ago

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

nekr0z commented 1 year ago

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

loskutovanl commented 1 year ago

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

nekr0z commented 1 year ago

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

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

nekr0z commented 1 year ago

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

loskutovanl commented 1 year ago

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

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

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

nekr0z commented 1 year ago

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

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

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

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

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

nekr0z commented 1 year ago

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

loskutovanl commented 1 year ago

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

nekr0z commented 1 year ago

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

loskutovanl commented 1 year ago

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