diff --git a/TUnit.Engine.Tests/TransitiveDependenciesTests.cs b/TUnit.Engine.Tests/TransitiveDependenciesTests.cs new file mode 100644 index 0000000000..b0e10353f2 --- /dev/null +++ b/TUnit.Engine.Tests/TransitiveDependenciesTests.cs @@ -0,0 +1,25 @@ +using Shouldly; +using TUnit.Engine.Tests.Enums; + +namespace TUnit.Engine.Tests; + +/// +/// Verifies that tests are correctly skipped when transitive dependencies fail. +/// Tests the fix for GitHub issue #4643. +/// +public class TransitiveDependenciesTests(TestMode testMode) : InvokableTestBase(testMode) +{ + [Test] + public async Task Test() + { + await RunTestsWithFilter( + "/*/*/TransitiveDependenciesTests/*", + [ + result => result.ResultSummary.Outcome.ShouldBe("Failed"), + result => result.ResultSummary.Counters.Total.ShouldBe(3), + result => result.ResultSummary.Counters.Passed.ShouldBe(0), + result => result.ResultSummary.Counters.Failed.ShouldBe(1), // Only Test1 should fail + result => result.ResultSummary.Counters.NotExecuted.ShouldBe(2) // Test2 and Test3 should be skipped + ]); + } +} diff --git a/TUnit.Engine/Scheduling/TestRunner.cs b/TUnit.Engine/Scheduling/TestRunner.cs index 1ee459b7e1..c47a89e936 100644 --- a/TUnit.Engine/Scheduling/TestRunner.cs +++ b/TUnit.Engine/Scheduling/TestRunner.cs @@ -78,7 +78,7 @@ private async ValueTask ExecuteTestInternalAsync(AbstractExecutableTest test, Ca { await ExecuteTestAsync(dependency.Test, cancellationToken).ConfigureAwait(false); - if (dependency.Test.State == TestState.Failed && !dependency.ProceedOnFailure) + if (dependency.Test.State != TestState.Passed && !dependency.ProceedOnFailure) { _testStateManager.MarkSkipped(test, "Skipped due to failed dependencies"); await _tunitMessageBus.Skipped(test.Context, "Skipped due to failed dependencies").ConfigureAwait(false); diff --git a/TUnit.TestProject/TransitiveDependenciesTests.cs b/TUnit.TestProject/TransitiveDependenciesTests.cs new file mode 100644 index 0000000000..16fd914bd2 --- /dev/null +++ b/TUnit.TestProject/TransitiveDependenciesTests.cs @@ -0,0 +1,35 @@ +using TUnit.TestProject.Attributes; + +namespace TUnit.TestProject; + +/// +/// Tests for transitive dependency handling when dependencies fail. +/// Reproduces GitHub issue #4643: Tests not skipped when transitive dependencies fail +/// +[EngineTest(ExpectedResult.Failure)] +public class TransitiveDependenciesTests +{ + [Test] + public async Task Test1() + { + // This test fails intentionally + await Assert.That(true).IsEqualTo(false); + } + + [Test, DependsOn(nameof(Test1))] + public async Task Test2() + { + // Test2 depends on Test1, which fails + // Test2 should be skipped + await Assert.That(true).IsEqualTo(false); + } + + [Test, DependsOn(nameof(Test2))] + public async Task Test3() + { + // Test3 depends on Test2, which depends on Test1 + // When Test1 fails, Test2 is skipped + // Therefore Test3 should also be skipped (transitive dependency) + await Assert.That(true).IsEqualTo(false); + } +}