ASP.NET Boilerplate项目Xunit测试参数与执行顺序配置问询
嘿,我来帮你搞定这两个Xunit测试的问题!在ASP.NET Boilerplate(ABP)项目里做测试,这两个需求其实都能实现,咱们一步步说:
一、解决测试方法参数传递问题
你提到常规Xunit里用[InlineData]给测试方法传参没问题,但在ABP里失效,大概率是这两个细节没做好:
必须用
[Theory]替代[Fact][InlineData]是和[Theory]特性绑定使用的,如果你给测试方法标记的是[Fact],参数肯定传不进去。ABP的测试基类(不管是集成测试的AbpIntegratedTestBase还是单元测试的AbpTestBase)都兼容这个规则。异步测试方法返回类型要用
async Task,别用async void
Xunit对async void的支持很差,ABP的测试框架也更适配async Task的返回类型,用async void不仅可能导致参数传递失效,还会引发测试执行的其他异常问题。
给你举个完整的示例:
// 继承ABP的测试基类,替换成你的项目模块 public class UserTests : AbpIntegratedTestBase<MyProjectModule> { // 标记为[Theory],搭配[InlineData]传参 [Theory] [InlineData("TestUser", 3)] [InlineData("Admin", 5)] // 可以添加多组测试数据 public async Task AllInOne_Test(string userName, int count) { // 从ABP的依赖注入容器获取服务 var userManager = GetRequiredService<IUserManager>(); // 这里写你的测试逻辑,比如验证用户数量、用户名匹配等 var users = await userManager.GetUsersByNameAsync(userName); Assert.Equal(count, users.Count); } }
只要做好这两点,参数就能正常传递到ABP的测试方法里了。
二、配置测试执行顺序
你说希望TestB在TestA之后执行(应该是笔误啦),Xunit本身默认不保证测试顺序,但咱们可以通过自定义测试顺序器来实现,ABP项目里完全适用,和普通Xunit项目配置一样:
方法一:自定义优先级属性和顺序器(无需额外NuGet包)
- 先定义一个标记优先级的特性:
public class TestPriorityAttribute : Attribute { public int Priority { get; } public TestPriorityAttribute(int priority) { Priority = priority; } }
- 实现Xunit的
ITestCaseOrderer接口,按优先级排序:
public class PriorityOrderer : ITestCaseOrderer { public IEnumerable<TTestCase> OrderTestCases<TTestCase>(IEnumerable<TTestCase> testCases) where TTestCase : ITestCase { var sortedDict = new SortedDictionary<int, List<TTestCase>>(); foreach (var testCase in testCases) { // 获取方法上的优先级,没标记的话默认最后执行 var priorityAttr = testCase.TestMethod.Method .GetCustomAttributes(typeof(TestPriorityAttribute)) .FirstOrDefault() as TestPriorityAttribute; var priority = priorityAttr?.Priority ?? int.MaxValue; if (!sortedDict.ContainsKey(priority)) { sortedDict[priority] = new List<TTestCase>(); } sortedDict[priority].Add(testCase); } // 按优先级从小到大返回测试用例 return sortedDict.SelectMany(kv => kv.Value); } }
- 在测试类上指定用这个顺序器,然后给测试方法标记优先级:
// 替换成你的命名空间和程序集名称 [TestCaseOrderer("YourTestProjectNamespace.PriorityOrderer", "YourTestProjectAssembly")] public class MyTestClass : AbpIntegratedTestBase<MyProjectModule> { [Fact, TestPriority(1)] // 优先级1,先执行 public async Task TestA() { // TestA的逻辑 } [Fact, TestPriority(2)] // 优先级2,在TestA之后执行 public async Task TestB() { // TestB的逻辑 } }
方法二:用现成的NuGet包(更简单)
如果你不想自己写代码,可以安装Xunit.Priority这个NuGet包,然后直接用:
// 指定用包自带的顺序器 [TestCaseOrderer("Xunit.PriorityOrderer", "Xunit.Priority")] public class MyTestClass : AbpIntegratedTestBase<MyProjectModule> { [Fact, Priority(1)] public async Task TestA() { /* ... */ } [Fact, Priority(2)] public async Task TestB() { /* ... */ } }
注意:Xunit官方其实不推荐依赖测试顺序,因为好的测试应该是独立的,不依赖其他测试的执行结果。但如果你的场景确实需要顺序执行,上面两种方法都能满足需求。
内容的提问来源于stack exchange,提问作者Edward
相关产品推荐
相关产品推荐

