ResultsWriter.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. using System;
  2. using System.IO;
  3. using System.Xml;
  4. using NUnit.Framework.Interfaces;
  5. using UnityEditor.TestTools.TestRunner.Api;
  6. using UnityEngine;
  7. namespace UnityEditor.TestTools.TestRunner.CommandLineTest
  8. {
  9. internal class ResultsWriter
  10. {
  11. private const string k_nUnitVersion = "3.5.0.0";
  12. private const string k_TestRunNode = "test-run";
  13. private const string k_Id = "id";
  14. private const string k_Testcasecount = "testcasecount";
  15. private const string k_Result = "result";
  16. private const string k_Total = "total";
  17. private const string k_Passed = "passed";
  18. private const string k_Failed = "failed";
  19. private const string k_Inconclusive = "inconclusive";
  20. private const string k_Skipped = "skipped";
  21. private const string k_Asserts = "asserts";
  22. private const string k_EngineVersion = "engine-version";
  23. private const string k_ClrVersion = "clr-version";
  24. private const string k_StartTime = "start-time";
  25. private const string k_EndTime = "end-time";
  26. private const string k_Duration = "duration";
  27. private const string k_TimeFormat = "u";
  28. public void WriteResultToFile(ITestResultAdaptor result, string filePath)
  29. {
  30. Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, "Saving results to: {0}", filePath);
  31. try
  32. {
  33. if (!Directory.Exists(filePath))
  34. {
  35. CreateDirectory(filePath);
  36. }
  37. using (var fileStream = File.CreateText(filePath))
  38. {
  39. WriteResultToStream(result, fileStream);
  40. }
  41. }
  42. catch (Exception ex)
  43. {
  44. Debug.LogError("Saving result file failed.");
  45. Debug.LogException(ex);
  46. }
  47. }
  48. void CreateDirectory(string filePath)
  49. {
  50. var driectoryPath = Path.GetDirectoryName(filePath);
  51. if (!String.IsNullOrEmpty(driectoryPath))
  52. {
  53. Directory.CreateDirectory(driectoryPath);
  54. }
  55. }
  56. public void WriteResultToStream(ITestResultAdaptor result, StreamWriter streamWriter, XmlWriterSettings settings = null)
  57. {
  58. settings = settings ?? new XmlWriterSettings();
  59. settings.Indent = true;
  60. settings.NewLineOnAttributes = false;
  61. using (var xmlWriter = XmlWriter.Create(streamWriter, settings))
  62. {
  63. WriteResultsToXml(result, xmlWriter);
  64. }
  65. }
  66. void WriteResultsToXml(ITestResultAdaptor result, XmlWriter xmlWriter)
  67. {
  68. // XML format as specified at https://github.com/nunit/docs/wiki/Test-Result-XML-Format
  69. var testRunNode = new TNode(k_TestRunNode);
  70. testRunNode.AddAttribute(k_Id, "2");
  71. testRunNode.AddAttribute(k_Testcasecount, (result.PassCount + result.FailCount + result.SkipCount + result.InconclusiveCount).ToString());
  72. testRunNode.AddAttribute(k_Result, result.ResultState.ToString());
  73. testRunNode.AddAttribute(k_Total, (result.PassCount + result.FailCount + result.SkipCount + result.InconclusiveCount).ToString());
  74. testRunNode.AddAttribute(k_Passed, result.PassCount.ToString());
  75. testRunNode.AddAttribute(k_Failed, result.FailCount.ToString());
  76. testRunNode.AddAttribute(k_Inconclusive, result.InconclusiveCount.ToString());
  77. testRunNode.AddAttribute(k_Skipped, result.SkipCount.ToString());
  78. testRunNode.AddAttribute(k_Asserts, result.AssertCount.ToString());
  79. testRunNode.AddAttribute(k_EngineVersion, k_nUnitVersion);
  80. testRunNode.AddAttribute(k_ClrVersion, Environment.Version.ToString());
  81. testRunNode.AddAttribute(k_StartTime, result.StartTime.ToString(k_TimeFormat));
  82. testRunNode.AddAttribute(k_EndTime, result.EndTime.ToString(k_TimeFormat));
  83. testRunNode.AddAttribute(k_Duration, result.Duration.ToString());
  84. var resultNode = result.ToXml();
  85. testRunNode.ChildNodes.Add(resultNode);
  86. testRunNode.WriteTo(xmlWriter);
  87. }
  88. }
  89. }