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

时间:2016-03-26 01:57:08

标签: unit-testing elixir mix

我希望在我的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

1 个答案:

答案 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_formattermix test --exclude custom_formatter仅将这些测试作为一个组一起运行。然后使用混合任务别名来简化您的生活(例如mix test使用默认格式化程序运行测试,mix test.custom使用自定义格式化程序运行测试。

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