@proelixir

Страница 760 из 1045
Dmitry
16.10.2017
14:38:47
А если есть коллбэк, который нельзя вызвать через АПИ - то и в своей бизнеслогике ты до него никак не доберёшься

И потому его не надо тестить

Alex
16.10.2017
14:39:13
если хочешь тестить коллбек то тесть коллбек

специально

Google
Nikolay
16.10.2017
14:57:22
И потому его не надо тестить
именно он и развалится в проде))

Dmitry
16.10.2017
14:58:28
именно он и развалится в проде))
Если ты заместишь Апи - то будет полное покрытие

Ну на самом деле

Nikolay
16.10.2017
14:59:39
мб наоборот - если замещу колбеки?

на стабовые

Dmitry
16.10.2017
15:01:41
Ну это как если тебе тачку пригонят на сервис, и чтобы понять как она едет ты каждую деталь по одной достанешь, засунешь в стенд для тестирования именно этой конкретной детали и протестишь её

Понятно, что можно двигатель затащить на стенд

Но снять с поршня кольцо, нацепить его на мок поршня и тестить - это брэд

Alex
16.10.2017
15:03:37
Т.е. defmodule MyServerApi do def start_link(...) GenServer.start_link(MyServerCallbacks, ...) end def foo(pid), do: GenServer.call(pid, :foo) end defmodule MyServerCallbacks do use GenServer def handle_call(:foo, from, state), ... end
в общем генсервера так и надо писать. тестить MyServerCallbacks надо отдельно и асинхронно каждый метод. и еще надо делать один специальный тест на вызов коллбеков MyServerApi

Dmitry
16.10.2017
15:05:26
Крче я сторонник интеграционных тестов

Особенно в тех местах, где интеграция обеспечивает полное покрытие

Кстати coveralls показывает, сколько раз строчка кода вызывается в твоих тестах

Так вот если делать и юнит и интеграцю таким методом - будет двойное покрытие

Google
Dmitry
16.10.2017
15:07:58
А если делать в одном случае мок коллбэков, а в другом случае мок АПИ - то считай что ты две проги написал по цене одной

И твои моки никто не тестировал Ж)

Alex
16.10.2017
15:10:32
Надо сделать только один мок - мок коллбеков, чтобы протестить вызов их из апи - это один тест. а другие тесты - тесты боевого модуля MyServerCallbacks , причем асинхронные. и тест всей этой фигни пройдет быстрее.

Nikolay
16.10.2017
15:12:30
> другие тесты - тесты боевого модуля MyServerCallbacks , причем асинхронные. но тогда можно сразу API тестить, не? оО если уж ты всё равно остался в асинхронности

Dmitry
16.10.2017
15:13:08
Я тоже думаю

Alex
16.10.2017
15:13:09
потом если писать сервер таким образом то у меня есть выбор - тестить апи в лоб или потом прикрутить дополнительные тесты MyServerCallbacks . а может я обойдусь только ими без теста API

Dmitry
16.10.2017
15:13:14
Что если ты не смотришь на стейт

Можно параллельно запустиь генсерверов по количеству тестов)

Alex
16.10.2017
15:13:58
неее это не то

Dmitry
16.10.2017
15:15:13
Крче тестите как хотите)

Alex
16.10.2017
15:15:26
в общем код надо писать так чтобы к нему можно было подлезсть с разных сторон... а то вот в некоторых тачках чтобы сменить аккумулятор надо пол машины разобрать

Dmitry
16.10.2017
15:15:43
Читаю и согласен с @Virviil

Практически никогда не нужно тестировать внутренности.

Alex
16.10.2017
15:17:09
может их тестировать не нужно но черным ящиком их не стоит делать если есть такая возможность

Alexander
16.10.2017
16:50:28
И тестить надо только MyServerApi
задолбаешься тестить асинхронщину, handle_cast/handle_info. Их проще тестить как чистые функции

иначе вылезают разные проблемы в тестах, недетерменированность появляется и ложные фэйлы

Dmitry
16.10.2017
16:53:23
Да, но так же может и в проде вылезти. Получается что ты тестишь сферического коня в вакууме

Типа "если придёт такой месседж в месседжбокс, то мы вернём такую структуру из функции"

А если не придёт?

Ну и тыды

Google
Alexander
16.10.2017
17:20:55
тут скорее если тебе нужно, что пришедший эвент поменял стейт процесса нужным образом, то это проще всего протестировать напрямую, не вызывая cast

Dmitry
16.10.2017
20:28:00
Если проще, то может всю state машину вынести в отдельную структуру, независимую от GenServer? И тогда тестировать так MyFSM.apply(fsm, event)

И gen_server тогда лишь оболочка.

Для сложных fsm я давно думаю о таком чистом дата-подходе.

Dmitry
16.10.2017
20:55:31
Для сложных fsm я давно думаю о таком чистом дата-подходе.
Я так делаю в текущем проекте, но пока не решил, правильно это или нет. Просто там вдруг начали образовываться сайд эффекты, и вызывать стороннее апи из ФСМ выглядит неканонично

Dmitry
16.10.2017
20:56:07
@Virviil Я сохраняю их в специальное поле after_effects

Dmitry
16.10.2017
20:56:30
Как-то тогда слишком накручено

Ну либо надо какую-то либу с макросами

Dmitry
16.10.2017
20:56:43
У меня был проект, в котором была распределённая fsm на паксосе сделанная, все эффекты там можно было только так и вызывать.

Dmitry
16.10.2017
20:56:45
В кекс

Чтобы всё само делало

Dmitry
16.10.2017
20:57:13
Потому что все изменения в fsm вызывались на всех ноудах, а сторонние эффекты нужно было вызывать только один раз.

Dmitry
16.10.2017
20:59:02
Крче сегодня разбирался с 1.5 супервизором

Прикольная штука

Но сильно не каноничная Ж)

Хорошо бы примерчиков побольше

Но походу никто ешё не придумал

Dmitry
17.10.2017
08:47:47
Я вообщето не о том

Google
Dmitry
17.10.2017
08:51:28
Я не про тесты

Vladimir
17.10.2017
08:51:31
А о каких сайдфэффектах может идти речь? FSM она и в африке фсм. Стейты переключаются предсказуемо, в зависимости от внутренних и внешних факторов. Внешние факторы мокаем. Внутренние нам и так известны

А, ок. Если не про тесты, то ладно

Dmitry
17.10.2017
08:52:06
К примеру ФСМ - автомат с кока-колой

И вот команда чтобы открыть заглушку с банкой, чтобы она выпала - это сайд эффект

Admin


Dmitry
17.10.2017
08:52:58
Вопрос в том, где эту команду вызывать

Т.е. у тебя стейт getting_money, если монетку кинешь - опять в него попадёшь, а если нажмёшь на кнопку - должна выпасть банка с кока колой

Так вот в функции нажатия на кнопку

Открывать заглушку

Либо в нажатии на кнопку посылать ивент в фсм, а он уже сам открывает заглушку

Alexander
17.10.2017
09:21:02
Стороннее апи надо мокать.
я крайне проникся VCR

или записываю с прода или сам кассеты делаю

затрахало мокать, мок на моке моком погоняет

Vladimir
17.10.2017
09:22:38
:) у нас моки были просто адовые по объёму. мокались прямо целые модули

ничо, стерпелись. но да, это сильно напрягает

Alexander
17.10.2017
09:22:53
я даже уже несколько раз писал такие тесты, которые моки тестят. Т.е сам тест тестит тест

Dmitry
17.10.2017
09:22:55
Мы, meck - теперь нигде не используем.

Alexander
17.10.2017
09:23:04
апп можно гранатой взоравать, тесты даже не почешутся

Dmitry
17.10.2017
09:23:21
Делаем так архитектуру, что можно было бы везде абсолютно без всяких внешних мок библиотек.

Google
Dmitry
17.10.2017
09:23:41
*архитектуру приложения

Alexander
17.10.2017
09:24:15
как пару раз заебешься мокать так, чтобы генсервер никуда не стучал в ненужные апи внешние, сразу полюбишь vcr ?

Nikolay
17.10.2017
09:24:54
я крайне проникся VCR
жди когда это пройдет…когда что бы воспроизвести свой зелёный тест надо собрать стейт под касету или что бы новую касету записать надо вспомнить чо ваще зачем идёт

Dmitry
17.10.2017
09:25:42
@noma4i что такое vcr?

Maxim
17.10.2017
09:26:36
@noma4i что такое vcr?
если я правильно понимаю о чем ты, то это записи ответов на http-зарпосы в файлах

Nikolay
17.10.2017
09:26:42
ну трейдофы во всем есть
я прост тоже одно время был блаженен…касетил soap ответы…а потом хлебнул говнеца(

Maxim
17.10.2017
09:26:43
чтоб в сеть не ходить

Dmitry
17.10.2017
09:26:50
@noma4i У нас, что у старых проектов перенесли на безмоковое, что новое. Как бы следим, чтобы в ад не превращалось. Я за своим кодом слежу и поддерживаю всегда, даже если нужно что-то сделать быстро, обычно меня стороной обходят ?

Dmitry
17.10.2017
09:27:54
Ну, кстати, нетипично, но я во всех проектах имею самое минимальное дело с http и вэбом вообще ?

Когда нужно да, на основе конфигурации.

Alex
17.10.2017
09:29:16
а внешние - это моки сторонних апи или это какие то либы

ну в качестве альтернативного подхода к тестам, можно все логировать, так чтобы по логам можно было быстро выяснить в чем дело и пофиксить

логов конечно будет дохрена, ну а как иначе?

Страница 760 из 1045