No Description
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.

TestStarter.cs 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using System;
  2. using UnityEditor.TestRunner.CommandLineParser;
  3. using UnityEditor.TestTools.TestRunner.Api;
  4. using UnityEngine;
  5. namespace UnityEditor.TestTools.TestRunner.CommandLineTest
  6. {
  7. internal class TestStarter
  8. {
  9. [InitializeOnLoadMethod]
  10. internal static void Initialize()
  11. {
  12. new TestStarter().Init();
  13. }
  14. internal Action<EditorApplication.CallbackFunction> registerEditorUpdateCallback = action =>
  15. {
  16. EditorApplication.update += action;
  17. };
  18. internal Action<EditorApplication.CallbackFunction> unregisterEditorUpdateCallback = action =>
  19. {
  20. EditorApplication.update -= action;
  21. };
  22. internal Func<bool> isCompiling = () => EditorApplication.isCompiling;
  23. internal IRunData runData = RunData.instance;
  24. internal Func<string[]> GetCommandLineArgs = Environment.GetCommandLineArgs;
  25. internal void Init()
  26. {
  27. if (!ShouldRunTests())
  28. {
  29. return;
  30. }
  31. if (isCompiling())
  32. {
  33. return;
  34. }
  35. executer.ExitOnCompileErrors();
  36. if (runData.IsRunning)
  37. {
  38. executer.SetUpCallbacks(runData.ExecutionSettings);
  39. registerEditorUpdateCallback(executer.ExitIfRunIsCompleted);
  40. return;
  41. }
  42. // Execute the test run on the next editor update to allow other framework components
  43. // (the TestJobDataHolder.ResumeRunningJobs method in particular) to register themselves
  44. // or modify the test run environment using InitializeOnLoad and InitializeOnLoadMethod calls
  45. registerEditorUpdateCallback(InitializeAndExecuteRun);
  46. }
  47. internal void InitializeAndExecuteRun()
  48. {
  49. unregisterEditorUpdateCallback(InitializeAndExecuteRun);
  50. runData.IsRunning = true;
  51. var commandLineArgs = GetCommandLineArgs();
  52. runData.ExecutionSettings = executer.BuildExecutionSettings(commandLineArgs);
  53. executer.SetUpCallbacks(runData.ExecutionSettings);
  54. runData.RunState = default;
  55. runData.RunId = executer.InitializeAndExecuteRun(commandLineArgs);
  56. registerEditorUpdateCallback(executer.ExitIfRunIsCompleted);
  57. }
  58. private bool ShouldRunTests()
  59. {
  60. var shouldRunTests = false;
  61. var optionSet = new CommandLineOptionSet(
  62. new CommandLineOption("runTests", () => { shouldRunTests = true; }),
  63. new CommandLineOption("runEditorTests", () => { shouldRunTests = true; })
  64. );
  65. optionSet.Parse(GetCommandLineArgs());
  66. return shouldRunTests;
  67. }
  68. internal IExecuter m_Executer;
  69. private IExecuter executer
  70. {
  71. get
  72. {
  73. if (m_Executer == null)
  74. {
  75. Func<bool> compilationCheck = () => EditorUtility.scriptCompilationFailed;
  76. Action<string> actionLogger = msg => { Debug.LogFormat(LogType.Log, LogOption.NoStacktrace, null, msg); };
  77. var apiSettingsBuilder = new SettingsBuilder(new TestSettingsDeserializer(() => new TestSettings()), actionLogger, Debug.LogWarning, compilationCheck);
  78. m_Executer = new Executer(ScriptableObject.CreateInstance<TestRunnerApi>(), apiSettingsBuilder, Debug.LogErrorFormat, Debug.LogException, Debug.Log, EditorApplication.Exit, compilationCheck, TestRunnerApi.IsRunActive);
  79. }
  80. return m_Executer;
  81. }
  82. }
  83. }
  84. }