Size: a a a

2020 May 23

AR

Andrew Rudenko in pro.elixir
Nikita Babushkin
Я за те несколько лет, что работаю с эликсиром ни разу не ловил в проектах в которых пишутся спеки на всё публичное, чтобы диалайзер не заметил спеку, которая врёт. Потому, наверное, и не задавался вопросом.
ну а у меня вот на второй день
источник

AR

Andrew Rudenko in pro.elixir
Nikita Babushkin
И с аргументами сгенерированными из спеки?
нет
источник

AR

Andrew Rudenko in pro.elixir
Andrew Rudenko
у менять есть обычные юнит тесты
.
источник

NB

Nikita Babushkin in pro.elixir
А откуда брать аргументы?
источник

AR

Andrew Rudenko in pro.elixir
Andrew Rudenko
я хочу проверить что спека, которую я написал соответсвует действительности хотя бы в рамках тестов
.
источник

AR

Andrew Rudenko in pro.elixir
Andrew Rudenko
ну т.е. вот у меня есть функа @spec foo(arg1) :: res. в рамках прогона тестов я хочу чтобы при ее вызовах автоматически проверялись аргументы и возвращаемое значение на соответсвие спеке
.
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Так это должен быть декоратор на функцию? Или как он должен отличать функции которые ты хочешь проверять от тех, которые не хочешь?
источник

NB

Nikita Babushkin in pro.elixir
т.е.
assert {:ok, foo} = my_fun("hardcoded", 42, %{bar: 24})
### МАГИЯ:
assert is_binary(foo)
источник

NB

Nikita Babushkin in pro.elixir
оно точно того стоит?
источник

AR

Andrew Rudenko in pro.elixir
Źmićer Rubinštejn
Так это должен быть декоратор на функцию? Или как он должен отличать функции которые ты хочешь проверять от тех, которые не хочешь?
это уже вопрос как профилятор написать
источник

AR

Andrew Rudenko in pro.elixir
можно профилировать только отдельные функи, модули, только проекта, можно все
источник

AR

Andrew Rudenko in pro.elixir
Nikita Babushkin
т.е.
assert {:ok, foo} = my_fun("hardcoded", 42, %{bar: 24})
### МАГИЯ:
assert is_binary(foo)
@spec my_fun(binary, integer, %{bar: integer}) :: {:ok, binary}
источник

AR

Andrew Rudenko in pro.elixir
сгенерит такой is_binary(foo)
источник

AR

Andrew Rudenko in pro.elixir
да, стоит
источник

NB

Nikita Babushkin in pro.elixir
На мой взгляд - нет. Чтобы получить хоть какой-то минимальный уровень уверенности от таких тестов нужно возить его через генератор по диапазону из спеки аргументов и делать 100500 ассертов про то, что на всей области значений аргументов мы соответствуем типу результата. Такое наверняка можно приготовить пропером, но для тестирования в рамках 1 захардкоженного набора аргументов это не нужно, ибо вообще ничего не гарантирует
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Возможно было бы прикольно если бы так было, но такого нету, а смысла такого делать очень нету
источник

NB

Nikita Babushkin in pro.elixir
Еще спеки сами по себе не сильно полезны в этом плане. Потому что когда я пишу про инпут String.t() я все равно не имею в виду, что буду хорошо работать с бинарём на полтора гига.
источник

AR

Andrew Rudenko in pro.elixir
Nikita Babushkin
На мой взгляд - нет. Чтобы получить хоть какой-то минимальный уровень уверенности от таких тестов нужно возить его через генератор по диапазону из спеки аргументов и делать 100500 ассертов про то, что на всей области значений аргументов мы соответствуем типу результата. Такое наверняка можно приготовить пропером, но для тестирования в рамках 1 захардкоженного набора аргументов это не нужно, ибо вообще ничего не гарантирует
тайпспеки сами тоже ничего не гарантируют, и?
источник

NB

Nikita Babushkin in pro.elixir
Именно, поэтому мы не пытаемся заставить их что-то гарантировать в большей мере, чем это может диалайзер
источник

AR

Andrew Rudenko in pro.elixir
такие валидации смогут поймать то, что не смог поймать диалайзер, при том бесплатно для разработчика
источник