Изменения и обновления в последней версии эликсира.

Эта статья включает в себя два самых больших изменения 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 неудачных тестовых случая.

Вы можете увидеть это на следующем снимке экрана.

Надеюсь, вам понравилось.

Некоторые другие изделия могут вас заинтересовать.

Спасибо за чтение.

Присоединяйтесь к нашему каналу Telegram и поддержите нас.



«Blackoders
EAT 🍕 - CODE🐞 - SLEEP😴 Ресурсы по кодированию, советы, видео, статьи и новости - сокровище кодирования, за которым мы следим и… t. меня"



Https://t.me/blackoders

Удачной долгой жизни в программировании… :)