/// <summary> /// Iterate the test method the desired number of times and with the specified options. /// The call must be made after preparing the target process(es) for iteration. /// </summary> /// <param name="test">pass the test itself</param> /// <param name="stressUtilOptions">If passed, includes all options: all other optional parameters are ignored</param> /// <param name="numIterations">The number of iterations (defaults to 71)</param> public static void DoIterations(object test, StressUtilOptions stressUtilOptions = null, int numIterations = 71) { AsyncPump.Run(async() => { await DoIterationsAsync(test, stressUtilOptions, numIterations); }); }
/// <summary> /// /// </summary> /// <param name="TestNameOrTestContext">When running from MSTest, the TestContext can be used to get TestName as well as various other properties. When run from VSix, the compiled code test name /// When run from command line there will be no TestContext</param> ///<param name="stressUtilOptions">Set of options to use</param> /// <param name="sampleType"></param> public MeasurementHolder(object TestNameOrTestContext, StressUtilOptions stressUtilOptions, SampleType sampleType) { if (TestNameOrTestContext is TestContextWrapper) { this.testContext = TestNameOrTestContext as TestContextWrapper; this.TestName = testContext.TestName; this.testContext.Properties[StressUtil.PropNameListFileResults] = lstFileResults; } else { this.TestName = TestNameOrTestContext as string; } this.stressUtilOptions = stressUtilOptions; this.sampleType = sampleType; foreach (var entry in stressUtilOptions.lstPerfCountersToUse) { measurements[entry.perfCounterType] = new List <uint>(); } IsMeasuringCurrentProcess = LstPerfCounterData[0].ProcToMonitor.Id == Process.GetCurrentProcess().Id; }
/// <summary> /// Iterate the test method the desired number of times /// The call can be made from the TestInitialize or the beginning of the TestMethod /// </summary> /// <param name="test">pass the test itself</param> /// <param name="stressUtilOptions">If passed, includes all options: all other optional parameters are ignored</param> /// <param name="NumIterations">The number of iterations (defaults to 71)</param> public static async Task DoIterationsAsync( object test, StressUtilOptions stressUtilOptions = null, int NumIterations = 71) { MeasurementHolder measurementHolder = null; try { if (stressUtilOptions == null) { stressUtilOptions = new StressUtilOptions() { NumIterations = NumIterations }; } if (!await stressUtilOptions.SetTest(test)) // are we recurring? { return; } measurementHolder = new MeasurementHolder( stressUtilOptions.testContext, stressUtilOptions, SampleType.SampleTypeIteration); var baseDumpFileName = string.Empty; stressUtilOptions.testContext.Properties[PropNameCurrentIteration] = 0; stressUtilOptions.testContext.Properties[PropNameMeasurementHolder] = measurementHolder; var utilFileName = typeof(StressUtil).Assembly.Location; var verInfo = FileVersionInfo.GetVersionInfo(utilFileName); /* * InternalName: Microsoft.Test.Stress.dll * OriginalFilename: Microsoft.Test.Stress.dll * FileVersion: 1.1.29.55167 * FileDescription: Microsoft.Test.Stress * Product: Microsoft.Test.Stress * ProductVersion: 1.1.29+g7fd76485e3 * Debug: False * Patched: False * PreRelease: False * PrivateBuild: False * SpecialBuild: False * Language: Language Neutral */ stressUtilOptions.logger.LogMessage($"{utilFileName} {verInfo.OriginalFilename} FileVersion:{verInfo.FileVersion} ProductVesion:{verInfo.ProductVersion}"); measurementHolder.dictTelemetryProperties["StressLibVersion"] = verInfo.FileVersion; for (int iteration = 0; iteration < stressUtilOptions.NumIterations; iteration++) { if (stressUtilOptions.actExecuteBeforeEveryIterationAsync != null) { await stressUtilOptions.actExecuteBeforeEveryIterationAsync(iteration + 1, measurementHolder); } var result = stressUtilOptions._theTestMethod.Invoke(test, parameters: null); if (stressUtilOptions._theTestMethod.ReturnType.Name == "Task") { var resultTask = (Task)result; await resultTask; } var res = await measurementHolder.TakeMeasurementAsync($"Iter {iteration + 1,3}/{stressUtilOptions.NumIterations}", DoForceGC : true); stressUtilOptions.logger.LogMessage(res); stressUtilOptions.testContext.Properties[PropNameCurrentIteration] = (int)(stressUtilOptions.testContext.Properties[PropNameCurrentIteration]) + 1; } // note: if a leak is found an exception will be throw and this will not get called // increment one last time, so test methods can check for final execution after measurements taken stressUtilOptions.testContext.Properties[PropNameCurrentIteration] = (int)(stressUtilOptions.testContext.Properties[PropNameCurrentIteration]) + 1; DoIterationsFinished(measurementHolder, exception: null); } catch (Exception ex) { DoIterationsFinished(measurementHolder, ex); throw; } }