/// <summary> /// Encapsulates logic for reporting results for non-interactive analysis. /// </summary> public override void Execute() { TestRecords tests = TestRecords.Load(RunDirectory); RunInfo runInfo = RunInfo.Load(RunDirectory); tests.GenerateXmlReport(tests, runInfo, ReportDirectory, TestBinariesDirectory); }
/// <summary> /// Encapsulates logic for executing. /// </summary> public override void Execute() { DirectoryInfo distributedExecutionDirectory = TestRecords.GetDistributedDirectory(DistributionKey, RunDirectory); TestRecords tests = TestRecords.Load(distributedExecutionDirectory); ExecutionSettings settings = new ExecutionSettings(); settings.Tests = tests; settings.TestBinariesDirectory = TestBinariesDirectory; settings.DebugTests = DebugTests; settings.DebugSti = DebugSti; settings.WaitForDebugger = WaitForDebugger; settings.LogFilesPath = distributedExecutionDirectory; settings.JitDebuggerCommand = JitDebuggerCommand; settings.TimeoutMultiplier = TimeoutMultiplier; settings.ContinueExecution = ContinueExecution; settings.CodeCoverageEnabled = CodeCoverage; settings.CodeCoverageImport = CodeCoverageImport; settings.RerunFailures = RerunFailures; settings.SkipDxDiag = SkipDxDiag; CodeCoverageUtilities.ValidateForCodeCoverage(CodeCoverage, CodeCoverageImport); tests.Execute(settings); tests.Save(distributedExecutionDirectory); ExecutionBackupStore.ClearAllIntermediateTestResults(settings.LogFilesPath); tests.DisplayConsoleSummary(); }
/// <summary> /// Merges the results of distributed execution back together. /// </summary> /// <param name="distributionDirectory">Root distribution directory for the full set of tests.</param> /// /// <param name="useCodeCoverage">Specifies if distribution should account for code coverage data</param> /// <param name="codeCoverageConnection">Connection string for Code Coverage Database</param> public static void Merge(DirectoryInfo distributionDirectory, bool useCodeCoverage, string codeCoverageConnection) { DirectoryInfo[] subdirectories = distributionDirectory.GetDirectories(); TestRecords mergedTestResults = new TestRecords(); for (int i = 0; i < subdirectories.Length; i++) { TestRecords deserializedTestResults = TestRecords.Load(subdirectories[i]); // If for a testcollection it looks like nothing was run, this // suggests badness and we want to halt the merge. If we proceed // along with a merge, we end up deleted the TestCollection // subsets, making the run unsalvagable. By failing hard here, // the culprit set of tests can be rerun, and then merge // attempted again. if (!ValidateTestsWereExecuted(deserializedTestResults)) { throw new ApplicationException("TestCollection located in the " + subdirectories[i].FullName + " directory did not have any results. It is highly likely that execution on the associated machine failed. Aborting merge."); } foreach (TestRecord test in deserializedTestResults.TestCollection) { mergedTestResults.TestCollection.Add(test); } foreach (ExecutionGroupRecord group in deserializedTestResults.ExecutionGroupRecords) { mergedTestResults.ExecutionGroupRecords.Add(group); } } mergedTestResults.Save(distributionDirectory); if (useCodeCoverage) { CodeCoverageUtilities.MergeCodeCoverage(subdirectories, distributionDirectory); Console.WriteLine("Attempting to Upload Results."); CodeCoverageUtilities.UploadCodeCoverage(distributionDirectory, codeCoverageConnection); CodeCoverageUtilities.DeleteCodeCoverageMergeInputs(subdirectories); } // Once we have safely merged the test collections and saved the merged // TestCollection to disk, delete those distributed subsets. for (int i = 0; i < subdirectories.Length; i++) { TestRecords.Delete(subdirectories[i]); } }
/// <summary> /// Encapsulates logic for running tests. /// </summary> public override void Execute() { if (!ContinueExecution) { // If the run directory already exists, we need to get rid of it for // now. In the future we may add a directory versioning scheme so // that the results of multiple runs can be retained. if (RunDirectory.Exists) { RunDirectory.Delete(true); } RunDirectory.Create(); } else { if (!RunDirectory.Exists) { throw new InvalidOperationException("No run directory exists - the ContinueExecution mode is only intended for finishing an incomplete run."); } } // TestRecords.RegisterKey(Environment.MachineName, RunDirectory); FilteringSettings filteringSettings = FilteringSettings; TestRecords tests = TestRecords.Discover(DiscoveryInfoPath, filteringSettings); tests.Filter(filteringSettings, DiscoveryInfoPath.Directory); tests.Distribute(RunDirectory, null, DiscoveryInfoPath.Directory); DirectoryInfo distributedExecutionDirectory = TestRecords.GetDistributedDirectory(Environment.MachineName, RunDirectory); tests = TestRecords.Load(distributedExecutionDirectory); ExecutionSettings settings = new ExecutionSettings(); settings.Tests = tests; settings.TestBinariesDirectory = DiscoveryInfoPath.Directory; settings.DebugTests = DebugTests; settings.DebugSti = DebugSti; settings.WaitForDebugger = WaitForDebugger; settings.LogFilesPath = distributedExecutionDirectory; settings.FixedTestExecutionDirectory = FixedTestExecutionDirectory; settings.JitDebuggerCommand = JitDebuggerCommand; settings.TimeoutMultiplier = TimeoutMultiplier; settings.ContinueExecution = ContinueExecution; settings.CodeCoverageEnabled = CodeCoverage; settings.CodeCoverageImport = CodeCoverageImport; settings.RerunFailures = RerunFailures; settings.SkipDxDiag = SkipDxDiag; CodeCoverageUtilities.ValidateForCodeCoverage(CodeCoverage, CodeCoverageImport); tests.Execute(settings); tests.Save(distributedExecutionDirectory); ExecutionBackupStore.ClearAllIntermediateTestResults(settings.LogFilesPath); TestRecords.Merge(RunDirectory, CodeCoverage, CodeCoverageImport); // RunCommand's report policy will be to publish reports to a // Report subdirectory of the RunDirectory. tests = TestRecords.Load(RunDirectory); string reportDirectoryPath = Path.Combine(RunDirectory.FullName, "Report"); RunInfo runInfo = RunInfo.FromOS(); runInfo.Save(RunDirectory); Console.WriteLine("Saving Report to: {0}\\LabReport.xml", reportDirectoryPath); tests.GenerateXmlReport(tests, runInfo, new DirectoryInfo(reportDirectoryPath), DiscoveryInfoPath.Directory); tests.DisplayConsoleSummary(); }