diff --git a/src/Adapter/MSTest.TestAdapter/Execution/TestClassInfo.cs b/src/Adapter/MSTest.TestAdapter/Execution/TestClassInfo.cs index fe29c5998e..77023f6088 100644 --- a/src/Adapter/MSTest.TestAdapter/Execution/TestClassInfo.cs +++ b/src/Adapter/MSTest.TestAdapter/Execution/TestClassInfo.cs @@ -346,6 +346,11 @@ public void RunClassInitialize(TestContext testContext) internal UnitTestResult GetResultOrRunClassInitialize(ITestContext testContext, string initializationLogs, string initializationErrorLogs, string initializationTrace, string initializationTestContextMessages) { + if (IsClassInitializeExecuted) + { + return new UnitTestResult(ObjectModelUnitTestOutcome.Passed, null); + } + bool isSTATestClass = AttributeComparer.IsDerived<STATestClassAttribute>(ClassAttribute); bool isWindowsOS = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); if (isSTATestClass diff --git a/src/Adapter/MSTest.TestAdapter/Execution/UnitTestRunner.cs b/src/Adapter/MSTest.TestAdapter/Execution/UnitTestRunner.cs index 6d6e854add..0e7b634464 100644 --- a/src/Adapter/MSTest.TestAdapter/Execution/UnitTestRunner.cs +++ b/src/Adapter/MSTest.TestAdapter/Execution/UnitTestRunner.cs @@ -160,15 +160,25 @@ internal UnitTestResult[] RunSingleTest(TestMethod testMethod, IDictionary<strin _fixtureTests.TryAdd(testMethod.AssemblyName, testMethodInfo); _fixtureTests.TryAdd(testMethod.AssemblyName + testMethod.FullClassName, testMethodInfo); - UnitTestResult assemblyInitializeResult = RunAssemblyInitializeIfNeeded(testMethodInfo, testContext); + UnitTestResult? assemblyInitializeResult = null; - if (assemblyInitializeResult.Outcome != UnitTestOutcome.Passed) + if (!testMethodInfo.Parent.Parent.IsAssemblyInitializeExecuted) + { + assemblyInitializeResult = RunAssemblyInitializeIfNeeded(testMethodInfo, testContext); + } + + if (assemblyInitializeResult != null && assemblyInitializeResult.Outcome != UnitTestOutcome.Passed) { result = [assemblyInitializeResult]; } else { - UnitTestResult classInitializeResult = testMethodInfo.Parent.GetResultOrRunClassInitialize(testContext, assemblyInitializeResult.StandardOut!, assemblyInitializeResult.StandardError!, assemblyInitializeResult.DebugTrace!, assemblyInitializeResult.TestContextMessages!); + UnitTestResult classInitializeResult = testMethodInfo.Parent.GetResultOrRunClassInitialize( + testContext, + assemblyInitializeResult?.StandardOut ?? string.Empty, + assemblyInitializeResult?.StandardError ?? string.Empty, + assemblyInitializeResult?.DebugTrace ?? string.Empty, + assemblyInitializeResult?.TestContextMessages ?? string.Empty); DebugEx.Assert(testMethodInfo.Parent.IsClassInitializeExecuted, "IsClassInitializeExecuted should be true after attempting to run it."); if (classInitializeResult.Outcome != UnitTestOutcome.Passed) {