diff --git a/TUnit.Core/TestContext.cs b/TUnit.Core/TestContext.cs
index 61ce4b2571..af1b1710d9 100644
--- a/TUnit.Core/TestContext.cs
+++ b/TUnit.Core/TestContext.cs
@@ -138,6 +138,12 @@ internal override void SetAsyncLocalContext()
internal bool RunOnTestDiscovery { get; set; }
+ ///
+ /// Indicates whether this test is reusing the discovery-time instance instead of creating a new instance.
+ /// When true, property resolution and initialization should be skipped since the instance is already prepared.
+ ///
+ internal bool IsDiscoveryInstanceReused { get; set; }
+
public object Lock { get; } = new();
diff --git a/TUnit.Engine/Building/Interfaces/ITestBuilder.cs b/TUnit.Engine/Building/Interfaces/ITestBuilder.cs
index c50bda428e..8f75be2a0e 100644
--- a/TUnit.Engine/Building/Interfaces/ITestBuilder.cs
+++ b/TUnit.Engine/Building/Interfaces/ITestBuilder.cs
@@ -14,8 +14,9 @@ internal interface ITestBuilder
/// The test metadata
/// The test data
///
+ /// Whether this test is reusing the discovery instance
/// An executable test ready for execution
- Task BuildTestAsync(TestMetadata metadata, TestBuilder.TestData testData, TestBuilderContext testBuilderContext);
+ Task BuildTestAsync(TestMetadata metadata, TestBuilder.TestData testData, TestBuilderContext testBuilderContext, bool isReusingDiscoveryInstance = false);
///
/// Builds all executable tests from a single TestMetadata using its DataCombinationGenerator delegate.
diff --git a/TUnit.Engine/Building/TestBuilder.cs b/TUnit.Engine/Building/TestBuilder.cs
index 628c8e6449..b3ef936b88 100644
--- a/TUnit.Engine/Building/TestBuilder.cs
+++ b/TUnit.Engine/Building/TestBuilder.cs
@@ -209,6 +209,7 @@ public async Task> BuildTestsFromMetadataAsy
var needsInstanceForMethodDataSources = metadata.DataSources.Any(ds => ds is IAccessesInstanceData);
object? instanceForMethodDataSources = null;
+ var discoveryInstanceUsed = false;
if (needsInstanceForMethodDataSources)
{
@@ -382,10 +383,21 @@ await _objectLifecycleService.RegisterObjectAsync(
var basicSkipReason = GetBasicSkipReason(metadata, attributes);
Func> instanceFactory;
+ bool isReusingDiscoveryInstance = false;
+
if (basicSkipReason is { Length: > 0 })
{
instanceFactory = () => Task.FromResult