ExUnit - 运行存储在自定义目录(不是测试/)中的所有测试

Str*_*s3D 5 unit-testing elixir-mix elixir

我想在我的 Elixir 项目中拥有两组独立的单元测试,我可以使用不同的 ExUnit 配置单独运行它们。我正在开发 ExUnit 格式化程序,并尝试为其编写单元测试。为了测试它,我想我会创建另一个目录 ( example_tests),其中包含test_helper.exs一个与 中的文件类似的文件test/,但 ExUnit 配置为使用我的自定义格式化程序。我将格式化程序添加为 ExUnit 格式化程序,然后创建了一个测试模块example_tests。现在的问题是我不知道如何配置 ExUnit 以example_tests/使用 中指定的配置运行所有测试example_tests/test_helper.exs。

我发现有一个test_paths配置参数无法在文件中设置mix.exs。问题是该值是在每个项目的基础上设置的,我需要它有两个不同的值(通常只是["test"]但随后用于使用格式化程序进行测试运行["example_tests"])。我假设我可以在每个任务的基础上覆盖配置值,因此我也创建了一个 example_tests 任务,但我不知道如何更改配置。

有没有办法Mix.Project.config在每个任务的基础上自定义项目配置()?或者,是否有更好的方法来创建具有不同 ExUnit 配置的两组独立的测试?

更新:

以下是 Mix 任务源代码的链接test:https://github.com/elixir-lang/elixir/blob/master/lib/mix/lib/mix/tasks/test.ex

bit*_*ker 3

你可以在 中放入多个路径test_paths,只要它们都有一个 test_helper.exs 文件,当执行给定路径中的测试时,它们将使用该路径的测试助手来执行。因此,test您下面的任何内容都可以使用默认格式化程序,但是下面的任何内容都example_test可以使用您的自定义格式化程序运行。

您还可以在给定测试模块的回调ExUnit.configure(formatters: [MyFormatter])中运行setup_all,以便该模块中的所有测试都使用您的格式化程序,并使用回调on_exit将其切换回默认值。您可能需要async: false为您的测试进行设置,因为我认为格式化程序配置对于所有测试都是全局的 - 或者使用 moduletag 属性(例如@moduletag :custom_formatter)来标记一组测试应该运行为哪个组,然后使用mix test --include custom_formatter和mix test --exclude custom_formatter仅作为一个组一起运行这些测试。然后使用混合任务别名来简化您的生活(例如,mix test使用默认格式化程序运行测试并mix test.custom使用自定义格式化程序运行测试。

希望其中之一对您来说是可行的解决方案!