Изменения и обновления в последней версии эликсира.
Эта статья включает в себя два самых больших изменения ExUnit.
- Аргументы в отчете об отказе
- Выполнение смешанного теста с флагом ошибки
1. Аргументы в отчете об отказе
В основном мы делаем такие утверждения, как
assert is_valid_card(card_type, card_number)
без использования каких-либо операторов сравнения, таких как < > <= == >=
, внутри модульных тестов. Всем нравится быть умным. Конечно, я тоже так делаю.
Личный опыт или впечатление от написания этой статьи:
У меня был опыт работы с картами с двумя типами ключей, позволяющими писать карту в эликсире.
Я использовал map
с binary
ключами и пытался протестировать их по map
с ключами типа atom
. Каждый раз, когда я это делаю, тест не проходит. Хотя я отправляю правильный map
, поскольку это ключи другого типа, он не работает.
У меня ушел целый день, чтобы понять это. 🌞
Я всегда пытаюсь отладить код логику вместо переданных аргументов. Если бы в отчете об ошибках была эта функция раньше, я мог бы спасти день в своей жизни.
К счастью, у нас есть последний выпуск.
Версии Elixir 1.7 достаточно умны, чтобы сообщать об аргументах, переданных функции, здесь is_valid_card(card_type, card_number)
Как программист, мне не нравятся документальные доказательства. Я всегда предпочитаю test_cases
. Что ж, давайте протестируем эту функцию.
Прежде чем продолжить, я хотел бы, чтобы вы знали, какие версии я использую на момент написания статьи.
Чтобы протестировать эту возможность, мы создадим проект basic_math
и простую функцию is_valid_card/2
, которая совершенно идиотская. Это используется для проверки того, является ли данный card_number
of card_type
действительным или нет.
Мы не особо беспокоимся о том, чтобы реализовать здесь полную логику. Эта функция is_valid_card/2
не делает ничего полезного, она просто оценивает длину card_number
на основе card_type
.
$ mix new basic_math && cd basic_math
Приведенная выше команда shell
создает новый проект Elixir и перемещает ваш рабочий каталог в basic_math
.
Надеюсь, вы все знали структуру проекта. Если нет, загляните в Мой первый проект в Эликсире.
Откройте файл lib/basic_math.ex
и вставьте следующие строки кода.
#lib/basic_math.ex defmodule BasicMath do def is_valid_card(card_type, card_number) do case card_type do :debit -> card_number |> Integer.to_charlist() |> length |> Kernel.==(12) :credit -> card_number |> Integer.to_charlist() |> length |> Kernel.==(10) _ -> {:error, :invalid_card_type} end end end
После добавления кода файл выглядит как на следующем снимке экрана…
Краткая документация по коду в basic_math.ex
файле.
Определение is_valid_card/2
принимает два параметра card_type
и card_number
. Мы ищем регистр на card_type
. Он соответствует двум значениям регистра :credit & :debit
, и я надеюсь, что вы поняли остальную часть кода. Нет ничего сложнее, чем поднять 1 грамм камня.
Примеры модульных тестов
Теперь мы напишем несколько модульных тестов для тестирования нашего кода.
Перед использованием протестируйте код.
Откройте файл test/basic_math_test.exs
и добавьте следующие строки кода
Базовая настройка
Добавьте следующий код
defmodule BasicMathTest do use ExUnit.Case import BasicMath doctest BasicMath end
Тестовые примеры для дебетовой карты
describe "debit_card" do setup do {:ok, type: :debit, valid_card: 123456789012, invalid_card: 1234567890} end test "valid debit card", %{type: type, valid_card: valid_card} do assert is_valid_card(type, valid_card) end test "in-valid debit card", %{type: type, invalid_card: invalid_card} do refute is_valid_card(type, invalid_card) end end
Тестовые примеры для кредитной карты
describe "credit_card" do setup do {:ok, type: :credit, valid_card: 123456789012, invalid_card: 1234567890} end test "valid credit card", %{type: type, valid_card: valid_card} do assert is_valid_card(type, valid_card) end test "in-valid credit card", %{type: type, invalid_card: invalid_card} do refute is_valid_card(type, invalid_card) end end
В демонстрационных целях я написал несколько тестовых примеров, которые намеренно проваливались.
Общий файл выглядит как на следующем снимке экрана.
В разделе credit_card
мы используем те же данные настройки, которые использовались для debit_card
модульных тестовых примеров, что в конечном итоге приводит к сбою тестовых примеров.
Итак, теперь он будет включать значение каждого аргумента в отчете о сбоях: давайте проверим это.
mix test
Запустите свои тестовые случаи, используя указанную выше команду. Вы увидите результат, аналогичный показанному на следующем снимке экрана.
Если вы посмотрите на приведенный выше снимок экрана, из четырех (4), двух (2) тестовых случаев не удалось, и вы можете увидеть аргументы, переданные в тестовый пример в случае сбоя. отчет.
arguments: #1 :credit #2 123467890
Этот своего рода отчет о сбоях очень полезен, когда наша функция связана со слишком большим количеством функций. Трудно отладить причину сбоя в случае модульного теста, когда функция зависит от многих других функций. Здесь аргументы играют жизненно важную роль в отладке сбоев кода.
Это отличное полезное свойство. 💚
2. Запуск смешанного теста с флагом «Неудача» 🚩
Когда вы запускаете команду mix test
вместе с flag--failed
, она запускает только те тестовые случаи, которые не удались при вашей предыдущей попытке mix test
.
Это означает, что на этот раз задача mix test --failed
больше не выполняет успешные тестовые случаи. Так что здесь мы можем сэкономить время.
Неудачные модульные тесты отслеживаются и кэшируются в самом первом mix test
У нас в файле всего 4 тестовых примера. Но когда вы добавили неудачный вариант, он выдает только 2 неудачных тестовых случая.
Вы можете увидеть это на следующем снимке экрана.
Надеюсь, вам понравилось.
Некоторые другие изделия могут вас заинтересовать.
- Тестирование эликсира - запуск только определенных тестов
- Elixir Mastering - Живой пример тестирования GenServer и GenServer
Спасибо за чтение.
Присоединяйтесь к нашему каналу Telegram и поддержите нас.
«Blackoders
EAT 🍕 - CODE🐞 - SLEEP😴 Ресурсы по кодированию, советы, видео, статьи и новости - сокровище кодирования, за которым мы следим и… t. меня"
Удачной долгой жизни в программировании… :)