NUnit 3.13.2版本Retry属性测试失败后不执行重试问题求助
NUnit测试失败未触发自动重试问题排查方案
1. 优先确认特性适配问题
- NUnit 3.x原生
RetryAttribute仅对测试方法执行过程中产生的失败生效,以下场景不会触发重试:- 测试用例初始化阶段报错:比如你代码中
TestCaseSource配置的Excel路径TestData\SampleTests2.xlsx未正确转义、文件不存在、Excel数据读取失败,这类发生在测试方法执行前的错误,不属于运行时失败,不会触发重试 - 测试方法被全局异常拦截器/自定义ActionAttribute捕获了异常,没有将异常抛出给NUnit测试框架,导致框架判定为没有失败
- 测试用例初始化阶段报错:比如你代码中
- 额外注意:
Retry(2)的参数为「最大运行总次数」,即配置为2时仅会在首次失败后重试1次,并非重试2次
2. 断言逻辑适配排查
你当前遇到的Expected: No Exception to be thrown But was ERROR报错是Assert.That(..., Throws.Nothing)抛出的断言失败,该写法会捕获lambda内部抛出的所有异常,并转换为NUnit的AssertionException抛出,原生RetryAttribute默认是支持断言失败重试的,但如果你的项目内有自定义的断言扩展、或者异常过滤逻辑排除了AssertionException,就会导致重试不生效。可以先替换成直接运行方法不加断言的写法,验证重试是否能触发:
public void Test2_URL( string url, string application) { // 去掉断言包装,直接调用方法,如果方法抛异常会直接被NUnit捕获 UtilitiesPage.URL(driver, appUrl); }
3. 特性搭配冲突排查
[TestCaseSource]本身已经标记方法为参数化测试,无需额外添加[Test]属性,两者同时存在部分版本的运行器会判定为特性冲突,导致Retry不生效,可以删除冗余的[Test]属性后重试- 确认你的测试运行器兼容NUnit 3.13.2:比如升级
NUnit3TestAdapter到最新稳定版,避免运行器不识别Retry特性的问题
4. 兜底解决方案:自定义重试特性
如果原生Retry特性不符合你的需求,可以自己实现支持断言失败、参数化测试的重试Attribute,示例核心逻辑如下:
using NUnit.Framework; using NUnit.Framework.Interfaces; using System; [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] public class CustomRetryAttribute : Attribute, ITestAction { private readonly int _retryCount; public CustomRetryAttribute(int retryCount) => _retryCount = retryCount; public ActionTargets Targets => ActionTargets.Test; public void BeforeTest(ITest test) { } public void AfterTest(ITest test) { if (test.Result.ResultState == ResultState.Failure && _retryCount > 0) { _retryCount--; TestExecutionContext.CurrentContext.CurrentResult = test.RunTest(TestExecutionContext.CurrentContext).Result; } } }
内容的提问来源于stack exchange,提问作者Gnaneswar Reddy Sodini
相关产品推荐
相关产品推荐

