Spec-Zone.ru › Elixir 1.12

mix test

Выполняет тесты для проекта.

Эта задача запускает текущее приложение, загружает test/test_helper.exs и затем параллельно требует все файлы, соответствующие шаблону test/**/*_test.exs.

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

mix test test/some/particular/file_test.exs
mix test test/some/particular/dir

Тесты в проектах-оболочках можно запускать из корня, указав полный путь к набору тестов, включая apps/my_app/test, в этом случае рекурсивные тесты для других дочерних приложений будут полностью пропущены:

# To run all tests for my_app from the umbrella root
mix test apps/my_app/test

# To run a given test file on my_app from the umbrella root
mix test apps/my_app/test/some/particular/file_test.exs

Понимание результатов тестов

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

$ mix test
...

  1) test greets the world (FooTest)
     test/foo_test.exs:5
     Assertion with == failed
     code:  assert Foo.hello() == :world!
     left:  :world
     right: :world!
     stacktrace:
       test/foo_test.exs:6: (test)

........

Finished in 0.05 seconds (0.00s async, 0.05s sync)
1 doctest, 11 tests, 1 failure

Randomized with seed 646219

Для каждого теста набор тестов выведет точку. Ошибочные тесты выводятся немедленно в формате, описанном в следующем разделе.

После выполнения всех тестов мы выводим сводный отчет набора. Первая строка содержит общее время, затраченное на набор, а затем время, затраченное на асинхронные тесты (определенные с помощью use ExUnit.Case, async: true) по сравнению с синхронными:

Finished in 0.05 seconds (0.00s async, 0.05s sync)

Разработчики стремятся минимизировать время, затрачиваемое на синхронные тесты, поскольку синхронные тесты выполняются последовательно, а асинхронные — параллельно.

Наконец, количество выполненных тестов, количество неудачных, невалидных и т. д.

Понимание ошибок тестов

Сначала он содержит счетчик ошибок, за которым следуют имя теста и модуль, в котором он был определен:

1) test greets the world (FooTest)

Следующая строка содержит точное местоположение теста в формате FILE:LINE:

test/foo_test.exs:5

Если вы хотите повторно запустить только этот тест, все, что вам нужно сделать, это скопировать строку выше и вставить ее перед mix test:

mix test test/foo_test.exs:5

Затем мы показываем сообщение об ошибке, фрагмент кода и общую информацию об ошибочном тесте:

Assertion with == failed
code:  assert Foo.hello() == :world!
left:  :world
right: :world!

Если ваш терминал поддерживает отображение цветов (см. раздел «Цветовое отображение» ниже), обычно отображается различие между left и right сторонами. Наконец, мы выводим стек вызовов ошибки:

stacktrace:
  test/foo_test.exs:6: (test)

Параметры командной строки

  • --color — включает цвет в выводе

  • --cover — запускает инструмент покрытия. См. раздел «Покрытие» ниже

  • --exclude — исключает тесты, соответствующие фильтру

  • --export-coverage — имя файла для экспорта результатов покрытия. Действует только при использовании с --cover

  • --failed — запускает только тесты, которые не прошли последний раз. Если нет ожидающих тестов --failed, mix test запустит все доступные тесты

  • --force — принудительно выполняет компиляцию независимо от времени модификации

  • --formatter — устанавливает модуль форматирования, который будет выводить результаты. По умолчанию используется встроенный форматировщик CLI ExUnit

  • --include — включает тесты, соответствующие фильтру

  • --listen-on-stdin — запускает тесты, а затем прослушивает стандартный ввод. Он повторно запустит тесты после получения новой строки. См. раздел «Мониторинг файловой системы» ниже

  • --max-cases — устанавливает максимальное количество тестов, выполняемых асинхронно. Только тесты из разных модулей выполняются параллельно. По умолчанию вдвое больше числа ядер

  • --max-failures — набор тестов перестаёт оценивать тесты, когда достигнуто это количество ошибок. Если опущено, запускает все тесты

  • --no-archives-check — не проверяет архивы

  • --no-color — отключает цвет в выводе

  • --no-compile — не компилирует, даже если файлы требуют компиляции

  • --no-deps-check — не проверяет зависимости

  • --no-elixir-version-check — не проверяет версию Elixir из mix.exs

  • --no-start — не запускает приложения после компиляции

  • --only — запускает только тесты, соответствующие фильтру

  • --partitions — устанавливает количество разделов для разделения тестов. Этот параметр требует, чтобы переменная среды MIX_TEST_PARTITION была задана. См. раздел «Разделение процессов операционной системы» для получения дополнительной информации

  • --preload-modules — предварительно загружает все модули, определенные в приложениях

  • --raise — вызывает исключение, если набор тестов завершился неудачно

  • --seed — инициализирует генератор случайных чисел, используемый для случайной сортировки тестов; --seed 0 отключает случайную сортировку, поэтому тесты в одном файле всегда будут выполняться в том же порядке, в котором они были определены

  • --slowest — выводит информацию о времени выполнения для N самых медленных тестов. Автоматически устанавливает --trace и --preload-modules

  • --stale — запускает только тесты, которые ссылаются на модули, изменившиеся с момента последнего запуска тестов с --stale. Подробнее об этом параметре можно узнать в разделе «Параметр --stale» ниже

  • --timeout — устанавливает таймаут для тестов

  • --trace — запускает тесты с подробным отчетом. Автоматически устанавливает --max-cases на 1. Обратите внимание, что в режиме отслеживания таймауты тестов будут игнорироваться, так как таймаут установлен на :infinity

  • --warnings-as-errors — (с версии v1.12.0) обрабатывает предупреждения как ошибки и возвращает код выхода, отличный от нуля. Этот параметр применяется только к файлам тестов. Чтобы обрабатывать предупреждения как ошибки при компиляции и во время тестов, выполните:

    MIX_ENV=test mix do compile --warnings-as-errors, test --warnings-as-errors

Настройка

Эти настройки можно задать в разделе def project вашего mix.exs:

  • :test_paths — список путей к файлам с тестами. По умолчанию ["test"] если каталог test существует; в противном случае он по умолчанию []. Ожидается, что все пути к тестам содержат файл test_helper.exs

  • :test_pattern — шаблон для загрузки файлов тестов. По умолчанию *_test.exs

  • :warn_test_pattern — шаблон для соответствия потенциально неправильно названным файлам тестов и отображения предупреждения. По умолчанию *_test.ex

  • :test_coverage — набор параметров, передаваемых механизму покрытия

Цветовое отображение

Цветовое отображение включено по умолчанию в большинстве терминалов Unix. Они также доступны в консолях Windows начиная с Windows 10, хотя для текущего пользователя в реестре необходимо явно включить его, выполнив следующую команду:

reg add HKCU\Console /v VirtualTerminalLevel /t REG_DWORD /d 1

После выполнения команды выше необходимо перезапустить текущую консоль.

Фильтры

ExUnit предоставляет теги и функциональность фильтрации, что позволяет разработчикам выбирать, какие тесты запускать. Наиболее распространенная функция — исключение определенных тестов из запуска по умолчанию в файле помощника по тестам:

# Exclude all external tests from running
ExUnit.configure(exclude: [external: true])

Затем, при необходимости, эти тесты можно включить в запуск с помощью параметра --include:

mix test --include external:true

Приведенный выше пример запустит все тесты, у которых внешний параметр установлен на true. Также можно включить все примеры с заданным тегом, независимо от его значения:

mix test --include external

Обратите внимание, что по умолчанию все тесты включены, поэтому, если их сначала не исключить (либо в файле помощника по тестам, либо с помощью параметра --exclude), параметр --include не повлияет.

По этой причине Mix также предоставляет параметр --only, который исключает все тесты и включает только указанные:

mix test --only external

Что аналогично:

mix test --include external --exclude test

Разница в том, что набор тестов завершится неудачно, если при использовании параметра --only тесты не будут выполнены.

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

mix test test/some/particular/file_test.exs:12

Что эквивалентно:

mix test --exclude test --include line:12 test/some/particular/file_test.exs

Или:

mix test test/some/particular/file_test.exs:12:24

Что эквивалентно:

mix test --exclude test --include line:12 --include line:24 test/some/particular/file_test.exs

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

Покрытие

Конфигурация :test_coverage принимает следующие параметры:

  • :output — выходной каталог для результатов покрытия. По умолчанию "cover"
  • :tool — инструмент покрытия
  • :summary — конфигурация вывода сводки; может быть булевым значением или списком ключевых слов. При передаче списка ключевых слов можно указать :threshold, которое представляет собой булевое значение или числовое значение, которое включает цвет результатов покрытия кода в красный или зелёный цвет в зависимости от того, находится ли процент ниже или выше указанного порога соответственно. По умолчанию [threshold: 90]
  • :export — имя файла для экспорта результатов вместо генерации результата в режиме реального времени. Расширение .coverdata автоматически добавляется к указанному файлу. Этот параметр автоматически устанавливается с помощью параметра --export-coverage или при использовании разделения процессов. См. mix test.coverage для компиляции отчета из нескольких экспортов.
  • :ignore_modules — модули для игнорирования при генерации отчетов и сводок

По умолчанию используется очень простой оболочечный инструмент на базе cover OTP, но его можно переопределить следующим образом:

def project() do
  [
    ...
    test_coverage: [tool: CoverModule]
    ...
  ]
end

CoverModule может быть любым модулем, экспортирующим start/2, получая путь компиляции и test_coverage параметры в качестве аргументов. Он должен вернуть либо nil или анонимную функцию без аргументов, которая будет выполнена после завершения набора тестов.

Разделение процессов операционной системы

Хотя ExUnit поддерживает возможность выполнения тестов параллельно внутри одного экземпляра Elixir, не всегда возможно выполнить все тесты параллельно. Например, некоторые тесты могут зависеть от глобальных ресурсов.

По этой причине mix test поддерживает разделение файлов тестов между разными экземплярами Elixir. Это делается путем установки параметра --partitions на целое число с количеством разделов и установки переменной среды MIX_TEST_PARTITION для управления тем, какой раздел теста выполняет данный экземпляр. Это также может быть полезно, если вы хотите распределить тестирование по нескольким машинам.

Например, чтобы разделить набор тестов на 4 раздела и запустить их, вы бы использовали следующие команды:

MIX_TEST_PARTITION=1 mix test --partitions 4
MIX_TEST_PARTITION=2 mix test --partitions 4
MIX_TEST_PARTITION=3 mix test --partitions 4
MIX_TEST_PARTITION=4 mix test --partitions 4

Тестовые файлы сортируются по круговой схеме заранее. Обратите внимание, что само разбиение предоставляется в качестве переменной среды, чтобы к нему можно было получить доступ в конфигурационных файлах и скриптах тестов. Например, это можно использовать для настройки разных экземпляров базы данных для каждого разбиения в config/test.exs.

Если разбиение включено и используется --cover, отчеты о покрытии не генерируются, так как они содержат только подмножество данных о покрытии. Вместо этого данные о покрытии экспортируются в файлы, такие как cover/MIX_TEST_PARTITION.coverdata. После получения результатов всех разбиений внутри cover/, можно запустить mix test.coverage, чтобы получить объединенный отчет.

Опция --stale

Опция командной строки --stale пытается запустить только те тестовые файлы, которые ссылаются на модули, изменившиеся с момента последнего запуска этой задачи с --stale.

При первом запуске этой задачи с --stale, выполняются все тесты и генерируется манифест. При последующих запусках тестовый файл отмечается как «устаревший», если какие-либо модули, на которые он ссылается (и любые модули, на которые эти модули ссылаются рекурсивно), были изменены с момента последнего запуска с --stale. Тестовый файл также отмечается как «устаревший», если он был изменен с момента последнего запуска с --stale.

Опция --stale чрезвычайно полезна для итераций разработки программного обеспечения, позволяя запускать только соответствующие тесты при внесении изменений в базу кода.

Мониторы файловой системы

Вы можете интегрировать mix test с мониторами файловой системы через командную строку с помощью опции --listen-on-stdin. Например, вы можете использовать fswatch или аналогичный инструмент, чтобы генерировать новые строки всякий раз, когда происходит изменение, что вызовет повторный запуск вашего набора тестов:

fswatch lib test | mix test --listen-on-stdin

Это можно комбинировать с опцией --stale для повторного запуска только тех тестовых файлов, которые были изменены, а также тестов, которые стали устаревшими из-за изменений в lib.

Прерывание выполнения набора тестов

Прервать выполнение набора тестов можно с помощью Ctrl+\, что отправляет сигнал SIGQUIT в Erlang VM. ExUnit перехватит этот сигнал, чтобы показать все прерванные тесты и напечатать собранные до этого результаты.

Это может быть полезно в том случае, если набор тестов зависнет, и вы не хотите ждать, пока истечёт время ожидания (по умолчанию 30 секунд).

© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/mix/1.12.0/Mix.Tasks.Test.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API