暫無描述
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

SettingsBuilder.cs 7.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. using System;
  2. using System.IO;
  3. using UnityEditor.TestRunner.CommandLineParser;
  4. using UnityEditor.TestTools.TestRunner.Api;
  5. using UnityEditor.TestTools.TestRunner.GUI;
  6. namespace UnityEditor.TestTools.TestRunner.CommandLineTest
  7. {
  8. internal class SettingsBuilder : ISettingsBuilder
  9. {
  10. private ITestSettingsDeserializer m_TestSettingsDeserializer;
  11. private Action<string> m_LogAction;
  12. private Action<string> m_LogWarningAction;
  13. private Func<string, bool> m_FileExistsCheck;
  14. private Func<bool> m_ScriptCompilationFailedCheck;
  15. public SettingsBuilder(ITestSettingsDeserializer testSettingsDeserializer, Action<string> logAction, Action<string> logWarningAction, Func<string, bool> fileExistsCheck, Func<bool> scriptCompilationFailedCheck)
  16. {
  17. m_LogAction = logAction;
  18. m_LogWarningAction = logWarningAction;
  19. m_FileExistsCheck = fileExistsCheck;
  20. m_ScriptCompilationFailedCheck = scriptCompilationFailedCheck;
  21. m_TestSettingsDeserializer = testSettingsDeserializer;
  22. }
  23. public Api.ExecutionSettings BuildApiExecutionSettings(string[] commandLineArgs)
  24. {
  25. var quit = false;
  26. string testPlatform = TestMode.EditMode.ToString();
  27. string[] testFilters = null;
  28. string[] testCategories = null;
  29. string testSettingsFilePath = null;
  30. int testRepetitions = 1;
  31. int? playerHeartbeatTimeout = null;
  32. bool runSynchronously = false;
  33. string[] testAssemblyNames = null;
  34. string buildPlayerPath = string.Empty;
  35. var optionSet = new CommandLineOptionSet(
  36. new CommandLineOption("quit", () => { quit = true; }),
  37. new CommandLineOption("testPlatform", platform => { testPlatform = platform; }),
  38. new CommandLineOption("editorTestsFilter", filters => { testFilters = filters; }),
  39. new CommandLineOption("testFilter", filters => { testFilters = filters; }),
  40. new CommandLineOption("editorTestsCategories", catagories => { testCategories = catagories; }),
  41. new CommandLineOption("testCategory", catagories => { testCategories = catagories; }),
  42. new CommandLineOption("testSettingsFile", settingsFilePath => { testSettingsFilePath = settingsFilePath; }),
  43. new CommandLineOption("testRepetitions", reps => { testRepetitions = int.Parse(reps); }),
  44. new CommandLineOption("playerHeartbeatTimeout", timeout => { playerHeartbeatTimeout = int.Parse(timeout); }),
  45. new CommandLineOption("runSynchronously", () => { runSynchronously = true; }),
  46. new CommandLineOption("assemblyNames", assemblyNames => { testAssemblyNames = assemblyNames; }),
  47. new CommandLineOption("buildPlayerPath", buildPath => { buildPlayerPath = buildPath; })
  48. );
  49. optionSet.Parse(commandLineArgs);
  50. DisplayQuitWarningIfQuitIsGiven(quit);
  51. CheckForScriptCompilationErrors();
  52. LogParametersForRun(testPlatform, testFilters, testCategories, testSettingsFilePath);
  53. var testSettings = GetTestSettings(testSettingsFilePath);
  54. var filter = new Filter()
  55. {
  56. groupNames = testFilters,
  57. categoryNames = testCategories,
  58. assemblyNames = testAssemblyNames
  59. };
  60. var buildTarget = SetFilterAndGetBuildTarget(testPlatform, filter);
  61. RerunCallbackData.instance.runFilters = new []{new UITestRunnerFilter()
  62. {
  63. categoryNames = filter.categoryNames,
  64. groupNames = filter.groupNames,
  65. testRepetitions = testRepetitions
  66. }};
  67. RerunCallbackData.instance.testMode = filter.testMode;
  68. var settings = new Api.ExecutionSettings()
  69. {
  70. filters = new []{filter},
  71. overloadTestRunSettings = new RunSettings(testSettings),
  72. targetPlatform = buildTarget,
  73. runSynchronously = runSynchronously,
  74. playerSavePath = buildPlayerPath
  75. };
  76. if (playerHeartbeatTimeout != null)
  77. {
  78. settings.playerHeartbeatTimeout = playerHeartbeatTimeout.Value;
  79. }
  80. return settings;
  81. }
  82. public ExecutionSettings BuildExecutionSettings(string[] commandLineArgs)
  83. {
  84. string resultFilePath = null;
  85. string deviceLogsDirectory = null;
  86. var optionSet = new CommandLineOptionSet(
  87. new CommandLineOption("editorTestsResultFile", filePath => { resultFilePath = filePath; }),
  88. new CommandLineOption("testResults", filePath => { resultFilePath = filePath; }),
  89. new CommandLineOption("deviceLogs", dirPath => { deviceLogsDirectory = dirPath; })
  90. );
  91. optionSet.Parse(commandLineArgs);
  92. return new ExecutionSettings()
  93. {
  94. TestResultsFile = resultFilePath,
  95. DeviceLogsDirectory = deviceLogsDirectory
  96. };
  97. }
  98. void DisplayQuitWarningIfQuitIsGiven(bool quitIsGiven)
  99. {
  100. if (quitIsGiven)
  101. {
  102. m_LogWarningAction("Running tests from command line arguments will not work when \"quit\" is specified.");
  103. }
  104. }
  105. void CheckForScriptCompilationErrors()
  106. {
  107. if (m_ScriptCompilationFailedCheck())
  108. {
  109. throw new SetupException(SetupException.ExceptionType.ScriptCompilationFailed);
  110. }
  111. }
  112. void LogParametersForRun(string testPlatform, string[] testFilters, string[] testCategories, string testSettingsFilePath)
  113. {
  114. m_LogAction("Running tests for " + testPlatform);
  115. if (testFilters != null && testFilters.Length > 0)
  116. {
  117. m_LogAction("With test filter: " + string.Join(", ", testFilters));
  118. }
  119. if (testCategories != null && testCategories.Length > 0)
  120. {
  121. m_LogAction("With test categories: " + string.Join(", ", testCategories));
  122. }
  123. if (!string.IsNullOrEmpty(testSettingsFilePath))
  124. {
  125. m_LogAction("With test settings file: " + testSettingsFilePath);
  126. }
  127. }
  128. ITestSettings GetTestSettings(string testSettingsFilePath)
  129. {
  130. ITestSettings testSettings = null;
  131. if (!string.IsNullOrEmpty(testSettingsFilePath))
  132. {
  133. if (!m_FileExistsCheck(testSettingsFilePath))
  134. {
  135. throw new SetupException(SetupException.ExceptionType.TestSettingsFileNotFound, testSettingsFilePath);
  136. }
  137. testSettings = m_TestSettingsDeserializer.GetSettingsFromJsonFile(testSettingsFilePath);
  138. }
  139. return testSettings;
  140. }
  141. static BuildTarget? SetFilterAndGetBuildTarget(string testPlatform, Filter filter)
  142. {
  143. BuildTarget? buildTarget = null;
  144. if (testPlatform.ToLower() == "editmode")
  145. {
  146. filter.testMode = TestMode.EditMode;
  147. }
  148. else if (testPlatform.ToLower() == "playmode")
  149. {
  150. filter.testMode = TestMode.PlayMode;
  151. }
  152. else
  153. {
  154. try
  155. {
  156. buildTarget = (BuildTarget)Enum.Parse(typeof(BuildTarget), testPlatform, true);
  157. filter.testMode = TestMode.PlayMode;
  158. }
  159. catch (ArgumentException)
  160. {
  161. throw new SetupException(SetupException.ExceptionType.PlatformNotFound, testPlatform);
  162. }
  163. }
  164. return buildTarget;
  165. }
  166. }
  167. }