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);
+ }
+}