XUnit的Theory测试在Test Explorer显示多结果无法展开单例如何解决?
问题根因
xUnit 生成独立测试用例时,依赖参数序列化后生成的唯一ID区分不同的参数组。System.Drawing.Color 属于xUnit默认无法直接生成唯一序列化ID的类型,会导致所有参数组被判定为同一个测试用例,因此Test Explorer不会展开,只会显示合并后的测试结果。
解决方案
以下方案按实现成本从低到高排序:
- 方案1:使用xUnit内置的
TheoryData强类型类实现测试数据源
直接替换原有测试数据类的基类即可,无需修改测试方法逻辑:
using System.Drawing; using Xunit; public class MyTestData1 : TheoryData<Color, int, int, int> { public MyTestData1() { Add(Color.FromArgb(255, 0, 0), 255, 0, 0); Add(Color.FromArgb(0, 255, 0), 0, 255, 0); Add(Color.FromArgb(0, 0, 255), 0, 0, 255); } }
修改后重新生成项目,Test Explorer即可正常展开所有测试用例,支持单独运行、调试单组参数。
- 方案2:新增测试用例标识参数
如果不想修改测试数据类的继承结构,可以给每组参数新增一个唯一的字符串标识字段,强制xUnit生成唯一的测试用例ID:
// 测试方法新增用例名称参数 [Theory] [ClassData(typeof(MyTestData1))] public void MyTestMethod1(string caseName, Color col, int red, int green, int blue) { Assert.Equal(red, col.R); Assert.Equal(green, col.G); Assert.Equal(blue, col.B); } // 测试数据构造时新增第一个字符串参数 public MyTestData1() { this.Data = new List<object[]>(); this.Data.Add(new object[] { "Red case", Color.FromArgb(255, 0, 0), 255, 0, 0 }); this.Data.Add(new object[] { "Green case", Color.FromArgb(0, 255, 0), 0, 255, 0 }); this.Data.Add(new object[] { "Blue case", Color.FromArgb(0, 0, 255), 0, 0, 255 }); }
- 方案3:全局启用测试用例序列化配置
在测试项目根目录新建xunit.runner.json文件,添加以下配置:
{ "serializeTestCases": true }
右键选中该文件,在属性面板中将「复制到输出目录」选项设置为「如果较新则复制」。该配置会强制xUnit对所有测试用例参数做序列化生成唯一ID,可解决绝大多数复杂类型参数导致的用例合并问题。
内容的提问来源于stack exchange,提问作者sbridewell
相关产品推荐
相关产品推荐

