internal static void WriteSummaryReport(XmlTableWriter tableWriter, TestRecords tests) { // Dictionary <string, MachineSummaryEntry> SummaryTable = ProduceMachineSummaries(tests); tableWriter.WriteStartElement("Summary"); foreach (MachineSummaryEntry entry in SummaryTable.Values) { tableWriter.WriteStartElement("MachineSummary"); tableWriter.WriteAttributeString("MachineName", entry.Name); tableWriter.WriteAttributeString("FailingVariations", entry.FailedVariations.ToString(CultureInfo.InvariantCulture)); tableWriter.WriteAttributeString("TotalVariations", (entry.TotalVariations).ToString(CultureInfo.InvariantCulture)); tableWriter.WriteAttributeString("TestsWithoutVariation", (entry.TestsWithoutVariation).ToString(CultureInfo.InvariantCulture)); float passRate = 0; float adjustedPassRate = 0; if (entry.TotalVariations > 0) { passRate = (((entry.TotalVariations - entry.FailedVariations) / (float)entry.TotalVariations) * 100); //Failures on tests with known bugs can be treated as passing, but we make clear this is not the actual pass rate. adjustedPassRate = (((entry.TotalVariations - entry.FailedVariations + entry.FailedVariationsWithBugs) / (float)entry.TotalVariations) * 100); } tableWriter.WriteAttributeString("PassRate", passRate.ToString("0.00", CultureInfo.InvariantCulture)); tableWriter.WriteAttributeString("AdjustedPassRate", adjustedPassRate.ToString("0.00", CultureInfo.InvariantCulture)); tableWriter.WriteAttributeString("TestExecutionTime", ReportingUtilities.FormatTimeSpanAsHms(entry.TestExecutionTime)); tableWriter.WriteEndElement(); } tableWriter.WriteEndElement(); }