如何在ExUnit中标记测试为pending状态?
在ExUnit中标记待实现的测试为Pending状态
好问题!ExUnit本身确实没有像RSpec或ESpec那样原生提供专门的黄色高亮「pending(待实现)」状态,但我们有几种实用的方法来模拟这个效果,既能清晰区分待实现的测试,甚至还能实现类似的高亮显示。
方法1:自定义:pending标签(最清晰的区分方式)
这是最推荐的方式,通过自定义标签明确标记哪些测试是待实现的,还能灵活过滤运行这些测试。
首先给目标测试加上@tag :pending:
defmodule MyApp.UserTest do use ExUnit.Case, async: true @tag :pending test "用户注册时应该验证邮箱格式" do # 这里留空或者写个占位断言,比如 assert false(运行时会被跳过) assert false end end
配套使用技巧:
- 只想运行所有pending测试:执行
mix test --only pending - 想排除pending测试,只运行已完成的测试:执行
mix test --exclude pending - 查看所有测试的状态时,默认报告器会显示标签,让你一眼识别出待实现的测试。
方法2:带明确理由的skip标签(快速上手)
如果你不想额外配置,直接用ExUnit原生的skip标签,并加上「待实现」的明确说明,也能清晰区分:
# 方式1:直接在test定义里加标签 test "用户注册时应该验证邮箱格式", tags: [skip: "pending implementation"] do # 测试代码占位 end # 方式2:用@tag标注 @tag skip: "pending implementation" test "用户注册时应该验证邮箱格式" do # 测试代码占位 end
运行测试时,默认输出会显示这个skip的理由,让你清楚知道这个测试是因为待实现而被跳过,不是其他原因。
方法3:自定义报告器实现黄色高亮(进阶效果)
如果你想要和RSpec一样的黄色高亮效果,可以自己写一个简单的ExUnit报告器,监听测试事件并给带:pending标签的测试加上颜色。
在你的test_helper.exs文件中添加以下代码:
defmodule PendingTestReporter do use GenServer def start_link(opts) do GenServer.start_link(__MODULE__, opts, name: __MODULE__) end @impl true def init(_opts) do # 订阅ExUnit的测试事件 ExUnit.subscribe() {:ok, []} end @impl true def handle_info({:test_finished, test}, state) do # 检测测试是否带有:pending标签 if :pending in test.tags do # 用ANSI黄色输出pending测试的信息 IO.puts(IO.ANSI.yellow() <> "[PENDING] #{test.module} - #{test.name}" <> IO.ANSI.reset()) end {:noreply, state} end # 忽略其他无关事件 def handle_info(_msg, state) do {:noreply, state} end end # 启动ExUnit时注册自定义报告器 ExUnit.start(reporters: [ExUnit.CLIFormatter, PendingTestReporter])
这样运行测试时,所有带:pending标签的测试都会以黄色字体显示,和你熟悉的RSpec效果完全一致。
内容的提问来源于stack exchange,提问作者aef
相关产品推荐
相关产品推荐

