You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:57:45