RuntimeTestLauncherBase.cs 4.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. using System;
  2. using System.Linq;
  3. using NUnit.Framework.Interfaces;
  4. using UnityEditor.Events;
  5. using UnityEditor.SceneManagement;
  6. using UnityEngine;
  7. using UnityEngine.SceneManagement;
  8. using UnityEngine.TestRunner.NUnitExtensions.Runner;
  9. using UnityEngine.TestTools;
  10. using UnityEngine.TestTools.NUnitExtensions;
  11. using UnityEngine.TestTools.TestRunner;
  12. using UnityEngine.TestTools.Utils;
  13. namespace UnityEditor.TestTools.TestRunner
  14. {
  15. internal abstract class RuntimeTestLauncherBase : TestLauncherBase
  16. {
  17. protected Scene CreateBootstrapScene(string sceneName, Action<PlaymodeTestsController> runnerSetup)
  18. {
  19. var scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single);
  20. var go = new GameObject(PlaymodeTestsController.kPlaymodeTestControllerName);
  21. var editorLoadedTestAssemblyProvider = new EditorLoadedTestAssemblyProvider(new EditorCompilationInterfaceProxy(), new EditorAssembliesProxy());
  22. var runner = go.AddComponent<PlaymodeTestsController>();
  23. runnerSetup(runner);
  24. runner.settings.bootstrapScene = sceneName;
  25. runner.AssembliesWithTests = editorLoadedTestAssemblyProvider.GetAssembliesGroupedByType(TestPlatform.PlayMode).Select(x => x.Assembly.GetName().Name).ToList();
  26. EditorSceneManager.MarkSceneDirty(scene);
  27. AssetDatabase.SaveAssets();
  28. EditorSceneManager.SaveScene(scene, sceneName, false);
  29. return scene;
  30. }
  31. public string CreateSceneName()
  32. {
  33. return "Assets/InitTestScene" + DateTime.Now.Ticks + ".unity";
  34. }
  35. protected UnityTestAssemblyRunner LoadTests(ITestFilter filter)
  36. {
  37. var editorLoadedTestAssemblyProvider = new EditorLoadedTestAssemblyProvider(new EditorCompilationInterfaceProxy(), new EditorAssembliesProxy());
  38. var assembliesWithTests = editorLoadedTestAssemblyProvider.GetAssembliesGroupedByType(TestPlatform.PlayMode).Select(x => x.Assembly.GetName().Name).ToList();
  39. var nUnitTestAssemblyRunner = new UnityTestAssemblyRunner(new UnityTestAssemblyBuilder(), null);
  40. var assemblyProvider = new PlayerTestAssemblyProvider(new AssemblyLoadProxy(), assembliesWithTests);
  41. nUnitTestAssemblyRunner.Load(assemblyProvider.GetUserAssemblies().Select(a => a.Assembly).ToArray(), TestPlatform.PlayMode, UnityTestAssemblyBuilder.GetNUnitTestBuilderSettings(TestPlatform.PlayMode));
  42. return nUnitTestAssemblyRunner;
  43. }
  44. protected static void ReopenOriginalScene(string originalSceneName)
  45. {
  46. EditorSceneManager.NewScene(NewSceneSetup.DefaultGameObjects);
  47. if (!string.IsNullOrEmpty(originalSceneName))
  48. {
  49. EditorSceneManager.OpenScene(originalSceneName);
  50. }
  51. }
  52. }
  53. internal static class PlaymodeTestsControllerExtensions
  54. {
  55. internal static T AddEventHandlerMonoBehaviour<T>(this PlaymodeTestsController controller) where T : MonoBehaviour, ITestRunnerListener
  56. {
  57. var eventHandler = controller.gameObject.AddComponent<T>();
  58. SetListeners(controller, eventHandler);
  59. return eventHandler;
  60. }
  61. internal static T AddEventHandlerScriptableObject<T>(this PlaymodeTestsController controller) where T : ScriptableObject, ITestRunnerListener
  62. {
  63. var eventListener = ScriptableObject.CreateInstance<T>();
  64. AddEventHandlerScriptableObject(controller, eventListener);
  65. return eventListener;
  66. }
  67. internal static void AddEventHandlerScriptableObject(this PlaymodeTestsController controller, ITestRunnerListener obj)
  68. {
  69. SetListeners(controller, obj);
  70. }
  71. private static void SetListeners(PlaymodeTestsController controller, ITestRunnerListener eventHandler)
  72. {
  73. UnityEventTools.AddPersistentListener(controller.testStartedEvent, eventHandler.TestStarted);
  74. UnityEventTools.AddPersistentListener(controller.testFinishedEvent, eventHandler.TestFinished);
  75. UnityEventTools.AddPersistentListener(controller.runStartedEvent, eventHandler.RunStarted);
  76. UnityEventTools.AddPersistentListener(controller.runFinishedEvent, eventHandler.RunFinished);
  77. }
  78. }
  79. }