/// <summary> /// Process the loaded XML for a test assembly. /// </summary> /// <param name="graphRoot">The root assemblies.</param> /// <param name="xml">The loaded test results XML.</param> private void ProcessXml(List <TestAssembly> graphRoot, string xml) { var doc = new XmlDocument(); doc.LoadXml(xml); var tests = doc.DocumentElement.ChildNodes[2]; foreach (XmlNode child in tests.ChildNodes) { if (child.Name == "UnitTestResult") { var testName = child.Attributes.GetNamedItem("testName").InnerText; var duration = TimeSpan.Parse(child.Attributes.GetNamedItem("duration").InnerText); var parts = TestNameParser(testName); var assembly = parts[0]; parts.RemoveAt(0); var group = parts[0]; string iteration = null; parts.RemoveAt(0); if (parts[parts.Count - 1].StartsWith("(")) { iteration = parts[parts.Count - 1]; parts.RemoveAt(parts.Count - 1); } var test = string.Join(" ", parts); TestIterationResult iterationResult = null; if (!string.IsNullOrWhiteSpace(iteration)) { iterationResult = new TestIterationResult { Iteration = iteration, DurationTicks = duration.Ticks, }; } // test? var testResult = graphRoot.SelectMany(r => r.TestGroups) .SelectMany(g => g.TestResults) .SingleOrDefault(t => t.TestName == test); if (testResult == null) { testResult = new TestResult { TestName = test, DurationTicks = iterationResult == null ? duration.Ticks : 0, }; if (iterationResult != null) { testResult.AddIteration(iterationResult); } // group? var groupResult = graphRoot.SelectMany(r => r.TestGroups) .SingleOrDefault(g => g.GroupName == group); if (groupResult == null) { groupResult = new TestGroup { GroupName = group, DurationTicks = 0, }; groupResult.AddTestResult(testResult); // assembly? var testAssembly = graphRoot.SingleOrDefault( a => a.AssemblyName == assembly); if (testAssembly == null) { testAssembly = new TestAssembly { AssemblyName = assembly, DurationTicks = 0, }; testAssembly.AddGroup(groupResult); graphRoot.Add(testAssembly); } else { testAssembly.AddGroup(groupResult); } } else { groupResult.AddTestResult(testResult); } } if (iterationResult != null) { testResult.AddIteration(iterationResult); } } } }
private static IEnumerable<TestIterationResult> ParseOneXmlFile(XDocument doc) { foreach (var testElem in doc.Descendants("test")) { var testName = testElem.Attribute("name").Value; var perfElem = testElem.Element("performance"); var runId = perfElem.Attribute("runid").Value; var etlPath = perfElem.Attribute("etl").Value; foreach (var metrics in perfElem.Descendants("metrics")) { foreach (var metric in metrics.Elements()) { var metricName = metric.Name.LocalName; var unit = metric.Attribute("unit").Value; // // Populate the set of all collected metrics // if (!Properties.AllMetrics.ContainsKey(metricName)) { Properties.AllMetrics.Add(metricName, unit); } } } foreach (var iteration in perfElem.Descendants("iteration")) { var index = int.Parse(iteration.Attribute("index").Value); if (index == 0) { continue; } var result = new TestIterationResult(); result.TestName = testName; result.TestIteration = index; result.RunId = runId; result.EtlPath = etlPath; foreach (var metricAttr in iteration.Attributes().Where(a => a.Name != "index")) { var metricName = metricAttr.Name.LocalName; var metricVal = double.Parse(metricAttr.Value); result.MetricValues.Add(metricName, metricVal); } yield return result; } } }
private static IEnumerable<TestIterationResult> ParseOneXmlFile(string path) { Console.WriteLine($"Parsing {path}"); var doc = XDocument.Load(path); foreach (var testElem in doc.Descendants("test")) { var testName = testElem.Attribute("name").Value; var perfElem = testElem.Element("performance"); var runId = perfElem.Attribute("runid").Value; var etlPath = perfElem.Attribute("etl").Value; foreach (var iteration in perfElem.Descendants("iteration")) { var index = int.Parse(iteration.Attribute("index").Value); var result = new TestIterationResult(); result.TestName = testName; result.TestIteration = index; result.RunId = runId; result.EtlPath = etlPath; foreach (var metricAttr in iteration.Attributes().Where(a => a.Name != "index")) { var metricName = metricAttr.Name.LocalName; var metricVal = double.Parse(metricAttr.Value); result.MetricValues.Add(metricName, metricVal); } yield return result; } } }
private static IEnumerable<TestIterationResult> ParseOneXmlFile(string path, string baseline) { Console.WriteLine($"Parsing {path}"); var doc = XDocument.Load(path); foreach (var testElem in doc.Descendants("test")) { var testName = testElem.Attribute("name").Value; var perfElem = testElem.Element("performance"); var runId = perfElem.Attribute("runid").Value; var etlPath = perfElem.Attribute("etl").Value; var degradeBars = new Dictionary<string, MetricDegradeBar>(); foreach (var xmlDegradeBars in doc.Descendants("MetricDegradeBars")) { foreach (var degradeBar in xmlDegradeBars.Descendants()) { degradeBars[degradeBar.Name.ToString()] = new MetricDegradeBar(degradeBar.Name.ToString(), degradeBar.Attribute("degradeBar").Value.ToString()); } } foreach (var iteration in perfElem.Descendants("iteration")) { var index = int.Parse(iteration.Attribute("index").Value); if (index == 0) continue; // ignore iteration 0 var result = new TestIterationResult(); result.TestName = testName; result.TestIteration = index; result.RunId = runId; result.EtlPath = etlPath; if (path == baseline) result.isBaseline = true; foreach (var metricAttr in iteration.Attributes().Where(a => a.Name != "index")) { var metricName = metricAttr.Name.LocalName; var metricVal = double.Parse(metricAttr.Value); result.MetricValues.Add(metricName, metricVal); } foreach (var metric in perfElem.Descendants("metrics").Descendants()) { var metricName = metric.Name.LocalName; var metricUnits = metric.Attribute("unit").Value; result.MetricUnits.Add(metricName, metricUnits); } result.DegradeBars = degradeBars; yield return result; } } }