From 1d877d086fb7bed19611e42040aca1964a0c0738 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Fri, 3 Oct 2025 18:53:15 +0100 Subject: [PATCH 1/2] Expose CurrentRetryAttempt on TestContext --- TUnit.Core/TestContext.cs | 2 ++ TUnit.Engine/Services/TestExecution/RetryHelper.cs | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/TUnit.Core/TestContext.cs b/TUnit.Core/TestContext.cs index 62bc086615..eb99818239 100644 --- a/TUnit.Core/TestContext.cs +++ b/TUnit.Core/TestContext.cs @@ -320,6 +320,8 @@ public async Task ReregisterTestWithArguments(object?[]? methodArguments = null, public DateTimeOffset? TestEnd { get; set; } + public int CurrentRetryAttempt { get; internal set; } + public IEnumerable GetTests(Func predicate) { diff --git a/TUnit.Engine/Services/TestExecution/RetryHelper.cs b/TUnit.Engine/Services/TestExecution/RetryHelper.cs index fa98a417ee..d9f7cb8919 100644 --- a/TUnit.Engine/Services/TestExecution/RetryHelper.cs +++ b/TUnit.Engine/Services/TestExecution/RetryHelper.cs @@ -10,6 +10,8 @@ public static async Task ExecuteWithRetry(TestContext testContext, Func ac for (var attempt = 0; attempt < maxRetries + 1; attempt++) { + testContext.CurrentRetryAttempt = attempt; + try { await action(); @@ -42,13 +44,13 @@ private static async Task ShouldRetry(TestContext testContext, Exception e { return false; } - + if (testContext.RetryFunc == null) { // Default behavior: retry on any exception if within retry limit return true; } - + return await testContext.RetryFunc(testContext, ex, attempt + 1).ConfigureAwait(false); } } From ad8228e5d5d1c115bf364f326106793d4b7f3ef5 Mon Sep 17 00:00:00 2001 From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com> Date: Fri, 3 Oct 2025 18:55:05 +0100 Subject: [PATCH 2/2] feat: add CurrentRetryAttempt property to TestContext for enhanced retry tracking --- .../Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt | 1 + .../Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt | 1 + .../Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt | 1 + 3 files changed, 3 insertions(+) diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt index 207dfba759..3bb6cb75a7 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet8_0.verified.txt @@ -1269,6 +1269,7 @@ namespace public .<.Artifact> Artifacts { get; } public .CancellationToken CancellationToken { get; set; } public .ClassHookContext ClassContext { get; } + public int CurrentRetryAttempt { get; } public .<.TestDetails> Dependencies { get; } public ? DisplayNameFormatter { get; set; } public .TestContextEvents Events { get; } diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt index 058df04e64..d37a28ce07 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.DotNet9_0.verified.txt @@ -1269,6 +1269,7 @@ namespace public .<.Artifact> Artifacts { get; } public .CancellationToken CancellationToken { get; set; } public .ClassHookContext ClassContext { get; } + public int CurrentRetryAttempt { get; } public .<.TestDetails> Dependencies { get; } public ? DisplayNameFormatter { get; set; } public .TestContextEvents Events { get; } diff --git a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt index 0541337705..099ef5697e 100644 --- a/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt +++ b/TUnit.PublicAPI/Tests.Core_Library_Has_No_API_Changes.Net4_7.verified.txt @@ -1170,6 +1170,7 @@ namespace public .<.Artifact> Artifacts { get; } public .CancellationToken CancellationToken { get; set; } public .ClassHookContext ClassContext { get; } + public int CurrentRetryAttempt { get; } public .<.TestDetails> Dependencies { get; } public ? DisplayNameFormatter { get; set; } public .TestContextEvents Events { get; }