我希望在我的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创建两组独立的测试配置?
更新
以下是指向test
Mix任务的源代码的链接:https://github.com/elixir-lang/elixir/blob/master/lib/mix/lib/mix/tasks/test.ex
答案 0 :(得分: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
使用自定义格式化程序运行测试。
希望其中一个对你来说是可行的解决方案!