From 03d6a6df2a6e5e38cca3fb95eb2fb182a00fd1f6 Mon Sep 17 00:00:00 2001 From: Chaz Beck Date: Fri, 3 Nov 2017 11:24:10 -0700 Subject: [PATCH] Fix dictionary key collision of test run parameters. When 'Keep Test Execution Engine Running' in VS, the TestExecutionManager is reused and tests that contain TestRunSettings will encounter key collision when being added between runs and bleedover of properties will occur. --- .../Execution/TestExecutionManager.cs | 32 +++++-------------- 1 file changed, 8 insertions(+), 24 deletions(-) diff --git a/src/Adapter/MSTest.CoreAdapter/Execution/TestExecutionManager.cs b/src/Adapter/MSTest.CoreAdapter/Execution/TestExecutionManager.cs index 74db14ba75..5faa69b361 100644 --- a/src/Adapter/MSTest.CoreAdapter/Execution/TestExecutionManager.cs +++ b/src/Adapter/MSTest.CoreAdapter/Execution/TestExecutionManager.cs @@ -27,16 +27,9 @@ public class TestExecutionManager /// private TestRunCancellationToken cancellationToken; - /// - /// Dictionary for test run parameters - /// - private IDictionary sessionParameters; - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1810:InitializeReferenceTypeStaticFieldsInline", Justification = "Need to over-write the keys in dictionary.")] public TestExecutionManager() { this.TestMethodFilter = new TestMethodFilter(); - this.sessionParameters = new Dictionary(); } /// @@ -67,9 +60,6 @@ public void RunTests(IEnumerable tests, IRunContext runContext, IFrame var isDeploymentDone = PlatformServiceProvider.Instance.TestDeployment.Deploy(tests, runContext, frameworkHandle); - // Placing this after deployment since we need information post deployment that we pass in as properties. - this.CacheSessionParameters(runContext, frameworkHandle); - // Execute the tests this.ExecuteTests(tests, runContext, frameworkHandle, isDeploymentDone); @@ -107,9 +97,6 @@ public void RunTests(IEnumerable sources, IRunContext runContext, IFrame bool isDeploymentDone = PlatformServiceProvider.Instance.TestDeployment.Deploy(tests, runContext, frameworkHandle); - // Placing this after deployment since we need information post deployment that we pass in as properties. - this.CacheSessionParameters(runContext, frameworkHandle); - // Run tests. this.ExecuteTests(tests, runContext, frameworkHandle, isDeploymentDone); @@ -236,6 +223,8 @@ private void ExecuteTestsWithTestRunner( if (!filterHasError) { + var sessionParameters = this.GetSessionParameters(runContext, testExecutionRecorder); + foreach (var currentTest in tests) { // Skip test if not fitting filter criteria. @@ -267,9 +256,9 @@ private void ExecuteTestsWithTestRunner( // and are merged with session level parameters var sourceLevelParameters = PlatformServiceProvider.Instance.SettingsProvider.GetProperties(source); - if (this.sessionParameters != null && this.sessionParameters.Count > 0) + if (sessionParameters != null && sessionParameters.Count > 0) { - sourceLevelParameters = sourceLevelParameters.Concat(this.sessionParameters).ToDictionary(x => x.Key, x => x.Value); + sourceLevelParameters = sourceLevelParameters.Concat(sessionParameters).ToDictionary(x => x.Key, x => x.Value); } unitTestResult = testRunner.RunSingleTest(unitTestElement.TestMethod, sourceLevelParameters); @@ -313,26 +302,21 @@ private void ExecuteTestsWithTestRunner( } [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Requirement is to handle errors in user specified run parameters")] - private void CacheSessionParameters(IRunContext runContext, ITestExecutionRecorder testExecutionRecorder) + private IDictionary GetSessionParameters(IRunContext runContext, ITestExecutionRecorder testExecutionRecorder) { if (!string.IsNullOrEmpty(runContext?.RunSettings?.SettingsXml)) { try { - var testRunParameters = RunSettingsUtilities.GetTestRunParameters(runContext.RunSettings.SettingsXml); - if (testRunParameters != null) - { - foreach (var kvp in testRunParameters) - { - this.sessionParameters.Add(kvp); - } - } + return RunSettingsUtilities.GetTestRunParameters(runContext.RunSettings.SettingsXml); } catch (Exception ex) { testExecutionRecorder.SendMessage(TestMessageLevel.Error, ex.Message); } } + + return new Dictionary(); } ///