in src/Agent.Worker/TestResults/Legacy/NunitResultReader.cs [21:135]
public TestRunData GetTestRunData(string filePath, XmlDocument doc, XmlNode testResultsNode, TestRunContext runContext, bool addResultsAsAttachments)
{
var results = new List<TestCaseResultData>();
//read test run summary information - run name, start time
string runName = "NUnit Test Run";
DateTime runStartTime = DateTime.MinValue; //Use local time instead of UTC as TestRunData uses local time for defaults. Also assuming timestamp is local is more accurate in cases where tests were run on build machine
TimeSpan totalRunDuration = TimeSpan.Zero;
TimeSpan totalTestCaseDuration = TimeSpan.Zero;
if (testResultsNode != null)
{
//get test run summary information
if (testResultsNode.Attributes["name"] != null)
{
runName = testResultsNode.Attributes["name"].Value;
}
//run times
DateTime dateFromXml = DateTime.MinValue.Date; //Use local time instead of UTC as TestRunData uses local time for defaults.
if (testResultsNode.Attributes["date"] != null)
{
DateTime.TryParse(testResultsNode.Attributes["date"].Value, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.None, out dateFromXml);
}
TimeSpan timeFromXml = TimeSpan.Zero;
if (testResultsNode.Attributes["time"] != null)
{
TimeSpan.TryParse(testResultsNode.Attributes["time"].Value, CultureInfo.InvariantCulture, out timeFromXml);
}
//assume runtimes from xml are current local time since timezone information is not in the xml, if xml datetime > current local time, fallback to local start time
DateTime runStartDateTimeFromXml = new DateTime(dateFromXml.Ticks).AddTicks(timeFromXml.Ticks);
if (runStartTime == DateTime.MinValue)
{
runStartTime = runStartDateTimeFromXml;
}
}
//run environment - platform, config and hostname
string platform = runContext != null ? runContext.Platform : string.Empty;
string config = runContext != null ? runContext.Configuration : string.Empty;
string runUser = runContext != null ? runContext.Owner : string.Empty;
string hostName = string.Empty;
XmlNode envNode = doc.SelectSingleNode(RootNodeName + "/environment");
if (envNode != null)
{
if (envNode.Attributes["machine-name"] != null && envNode.Attributes["machine-name"].Value != null)
{
hostName = envNode.Attributes["machine-name"].Value;
}
if (envNode.Attributes["platform"] != null && envNode.Attributes["platform"].Value != null && runContext != null && runContext.BuildId > 0)
{
//We cannot publish platform information without a valid build id.
platform = envNode.Attributes["platform"].Value;
}
}
//run owner
IdentityRef runUserIdRef = null;
if (!string.IsNullOrEmpty(runUser))
{
runUserIdRef = new IdentityRef() { DisplayName = runUser };
}
//get all test assemblies
if (testResultsNode != null)
{
XmlNodeList testAssemblyNodes = testResultsNode.SelectNodes("test-suite");
if (testAssemblyNodes != null)
{
foreach (XmlNode testAssemblyNode in testAssemblyNodes)
{
var assemblyStartTime = (runStartTime == DateTime.MinValue) ? DateTime.MinValue : runStartTime + totalTestCaseDuration;
List<TestCaseResultData> testCases = FindTestCaseNodes(testAssemblyNode, hostName, runUserIdRef, assemblyStartTime);
if (testCases != null)
{
results.AddRange(testCases);
testCases.ForEach(x => totalTestCaseDuration += TimeSpan.FromMilliseconds(x.DurationInMs));
}
}
}
}
if (TimeSpan.Compare(totalRunDuration, totalTestCaseDuration) < 0)
{
totalRunDuration = totalTestCaseDuration; //run duration may not be set in the xml, so use total test case duration
}
if (runContext != null && !string.IsNullOrWhiteSpace(runContext.RunName))
{
runName = runContext.RunName;
}
//create test run data
TestRunData testRunData = new TestRunData(
name: runName,
startedDate: (runStartTime == DateTime.MinValue) ? string.Empty : runStartTime.ToString("o"),
completedDate: (runStartTime == DateTime.MinValue) ? string.Empty : runStartTime.Add(totalRunDuration).ToString("o"),
state: TestRunState.InProgress.ToString(),
isAutomated: true,
buildId: runContext != null ? runContext.BuildId : 0,
buildFlavor: config,
buildPlatform: platform,
releaseUri: runContext != null ? runContext.ReleaseUri : null,
releaseEnvironmentUri: runContext != null ? runContext.ReleaseEnvironmentUri : null
);
testRunData.Results = results.ToArray();
testRunData.Attachments = addResultsAsAttachments ? new string[] { filePath } : new string[0];
return testRunData;
}