Closed nekr0z closed 1 year ago
Собственно, тесткейсы должны покрывать все случаи, описанные в спецификации как поведение сервиса простой валидации. Первая и главная задача юнит-тестов — проверять компонент в целом на соответствие спеке. Важная разница между юнит-тестами и просто тестами: просто тесты могут переписываться в процессе рефакторинга и оптимизации, когда меняется внутренняя логика; юнит-тесты должны переписываться только при изменении спецификации, а изменения внутренней логики их затрагивать не должны.
Я правильно понимаю, что сейчас ошибка из-за того что нельзя привести пользовательский тип square из пакета board к типу int8?
Может всё-таки имеет смысл сделать square экспортируемым?
Я правильно понимаю, что сейчас ошибка из-за того что нельзя привести пользовательский тип square из пакета board к типу int8?
Нет, сейчас ошибка из-за того, что from
и to
берутся из from
, а to
игнорируется :)
Привет! Добавила тесты, исправила баги. Что-то упустила? Или могу мержить?
А откуда взялся http.StatusBadRequest
? По спеке, этот сервис отвечает либо 200, либо 403 :)
Кажется логичным, что в случае некорректных входных данных (несуществующая фигура, клетка и т.п.) выводится более говорящее StatusBadRequest, а не информация о невалидном ходе, ведь валидировать тогда нечего
Кажется логичным, что в случае некорректных входных данных (несуществующая фигура, клетка и т.п.) выводится более говорящее StatusBadRequest, а не информация о невалидном ходе, ведь валидировать тогда нечего
Это логично, я согласен; но тогда надо внести соответствующую правку в спецификацию ;)
Посмотри, как я переделал тест для простой валидации, сохранив все тесткейсы ;) «Зачем делать сложным то, что проще простого?»
Посмотри, как я переделал тест для простой валидации, сохранив все тесткейсы ;) «Зачем делать сложным то, что проще простого?»
Да, грешу тем что усложняю... В следующий раз не буду пуш делать, пока на свежую голову не посмотрю сама. Не знаю как по-другому с этим бороться.
В спеку внесла изменения
Добавил fuzz-тест.
Это устроено немножко не так, как обычный тест. По коду можно догадаться, что там заданы три строки, которые тестируются в качестве query, и при обычном запуске командой go test
будет происходить тестирование именно этих трёх строк.
Зато если запустить go test -fuzz FuzzSimple .
, система будет генерировать случайные строки (взяв за основу те, что есть). Если найдётся строка, на которой тест упадёт, система добавить её в директорию testdata
, и в дальнейшем при запуске тестов будет проверять и её тоже.
Фактически, этим тестом мы проверяем, что в ответ на любой возможный запрос наш сервис отвечает одним из трёх возможных по спеке статусов (к сожалению, тут не получается проверить, правильный ли это будет ответ, но для того у нас есть юнит-тесты), и никакой запрос не приводит к падению, панике или чему-то подобному. Поскольку этот сервис у нас будет «торчать наружу», и запрос может послать кто угодно, нам полезно знать, что злые хакеры не смогут уронить его или добиться неожиданного поведения — для того и fuzz-тестирование.
Подробно про то, как в Go работает fuzz — в документации. ;)
И да, я погонял на своём ноутбуке этот fuzz-тест минут десять, ничего не нашлось ;)
Евгений, спасибо, вроде понятно. Есть еще какие-то тесты, которые нужно сделать? Или могу мержить?
Ну, ещё надо сделать тестов на остальные этапы валидации :))) Но simple можно мёржить :)
Если речь про advanced, то оно в процессе :) но там работы намнооого больше чем в simple
Начинаем добавлять юнит-тесты :)))
Обрати внимание, этот тест — в пакете
validation_test
, а не в пакетеvalidation
; это сделано нарочно, чтобы у теста не было доступа к внутренней логике пакета, и он проверял только взаимодействие пакета с внешним миром. В данном случае это пока не имеет значения, но уже на следующей итерации — начнёт, увидишь ;)По сути же единственного написанного теста — это тот же самый «табличный» тест, в котором поднимается сервер (пакет
httptest
сам разберётся, какой порт наlocalhost
свободен, и поднимет там, а вsrv.URL
положит адрес того, что получилось), и об него тестируются URL с соответствующими полями.Тесткейсов надо набросать побольше, но я остановился пока на одном, потому что первый же тесткейс, который пришёл мне в голову, нашёл баг (вот тут) ;-)