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