でゲソ
Маjко
Automated Testing 101
Alex
でゲソ
локальный сервер?
Маjко
Если у тебя логика не отвязана от IO, у тебя дерьмовый код
でゲソ
прокси?
Alex
там был tcp listener который ожидал строго определенный набор байт.
Loo
Alex
Пришло? все хорошо.
Alex
хватит троллить
я на полном серьезе спрашиваю, у меня именно такой кейс.
Alex
Хочу услышать советы от гуру.
Alex
Это я без шуток, если есть годный способ это тестировать по другому то я бы посмотрел.
Маjко
Так тебе уже ответили: юнитами покрываешь логику, всё остальное — интеграционными.
Маjко
Логика не должна быть перемешана с IO в нетестируемую кашу
Alex
Loo
эм
Loo
берёшь и отделяешь
Alex
вот есть класс который держит соединение с сервером по протоколу. Ты предлагаешь мокать все подряд?
Alex
если мокать все подряд, то считай что тестов нет.
Маjко
Мне тебе тут курс по software design зачитать чтоли? О_о
Маjко
Маjко
Тестируй последние без сети сколько угодно
Маjко
И?
Loo
пусть не будут доступны
Loo
это ничего не меняет
Anonymous
зачем тебе сеть, сеть это impure
Alex
и как ты их будешь тестировать если они недоступны?
Маjко
Alex
раст конечно же.
Маjко
В расте, Java, C++ — проблем нет
Маjко
В расте единица инкапсуляции — модуль
Маjко
Юниты пишутся в том же модуле что и код
Маjко
Юниты видят всё, включая private поля и функции
Alex
хз мне кажется это хреновый подход
Маjко
Это ОФИЦИАЛЬНЫЙ подход
Маjко
Каноничный и rust-way
Маjко
То, как язык и тесты задизайнены
Loo
Alex
Каноничный и rust-way
https://github.com/rust-lang/rust/blob/master/src/libstd/net/tcp.rs#L1044
Это юнит тест?
Alex
тогда можно внутри перепилить, снаружи останется все как и было.
Маjко
Если ты откроешь rust-book на разделе про тестирование или гайд по cargo — там описано, что юниты лежат в том же модуле за директивой cfg(tests), а интеграционные — в отдельной директории.
Именно потому что интеграционные не должны быть подвержены внутренним изменениям
Alex
хорошо, выше юнит тест?
Маjко
Alex
он лежит в том же файле что и реализация. Почему он дергает низкоуровневое io?
でゲソ
Маjко
でゲソ
Маjко
Если Err — паникует
でゲソ
значит правильно подумал
Маjко
Alex
Что тебя смущает?
меня смущает что они дергают низкоуровневое io, а не как ты говоришь тестируют логику.
Alex
еще и платформозависимо
Alex
это по сути интеграционный тест.
Маjко
Маjко
Маjко
И почему ты этот вопрос задаешь мне, а не вышеперечисленным лицам?
Alex
Alex
я в сорсах оного нашел пример который в свое время мне помог написать подобные тесты под свои задачи.
Маjко
Ты тестируешь реализацию протокола, то бишь алгоритма работы с данными
Alex
Маjко
А уже потом ты можешь написать интеграционные чтобы убедиться что вся твоя система в целом работает верно
Alex
я не тролю, я серьезно не понимаю
Маjко
Это отдельная задача от работы с IO и передачей этих данных
Маjко
Я не троллю, серьезно
Alex
ну вот смотри
Alex
я при Connection::new() шлю пакет с авторизацией
Alex
пытаюсь там подключиться к tcp серверу и шлю первый пакет
Alex
как мне все это юнит тестировать?
Маjко
Ты знаешь что тебе должно прийти в ответ?
Alex
да
Маjко
Тестируй что твоя функция разбора пакета правильно разберет этот пакет
Маjко
Ты же знаешь что в нем