Архив рубрики: erlang

eunit + proper

Я бы хотел хранить тесты каждого модуля в отдельном файле и запускать юнит-тесты одной командой одновременно выполняя как eunit так и proper. При этом мне было не понятно как запускать proper выполняя eunit. Идея писать тест оканчивающийся на _test и в нем выполнять что-то вроде proper:quickcheck мне совсем не нравилась, типа один фреймворк вместо того чтобы гонять тесты дергает другой фреймворк, некрасиво выглядит. Что если создать, например, hrl хелпер содержащий код вроде

-include_lib("eunit/include/eunit.hrl").

run_proper_test_() ->
EunitLeader = erlang:group_leader(),
erlang:group_leader(whereis(user), self()),
Res = proper:module(?MODULE),
erlang:group_leader(EunitLeader, self()),
?_assertEqual([], Res).

Код переопределения group leader взят отсюда

В результате получается что в модуле с eunit достаточно подключить наш hrl и все функции начинающиеся с prop_ будут найдены proper’ом и протестированы, eunit же возьмет свои функции и пройдется по ним.

sentry и erlang

Существует удобнейшая штука для просмотра и агрегирования логов https://getsentry.com — sentry
Кроме этого в интернете существуют обсуждения того как и куда лучше писать логи приложений, я говорю про эрланг. Я считаю что не удобно смотреть логи в файлах, не удобно и разработчику и руководителю и тестировщику, а удобно смотреть их в браузере. К тому же сентри может «схлопывать» повторяющиеся ошибки, отправлять их на почту, строить графики, осуществлять поиск.
В итоге для работы с этим замечательным инструментом я попытался написать драйвер для эрланга — https://github.com/Sepuka/esentry
В составе продукта есть хендлер для lager (lager_esentry_backend) который подлючается в конфигурации самого лагера, например так:

{handlers,
{
lager_esentry_backend, [
{level, notice}
]
}
}

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