Ingen beskrivning
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.

RuntimeTestLauncherBase.cs 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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. internal readonly PlaymodeTestsControllerSettings m_Settings;
  18. protected RuntimeTestLauncherBase(PlaymodeTestsControllerSettings mSettings)
  19. {
  20. m_Settings = mSettings;
  21. }
  22. protected Scene CreateBootstrapScene(string sceneName, Action<PlaymodeTestsController> runnerSetup)
  23. {
  24. var scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single);
  25. var go = new GameObject(PlaymodeTestsController.kPlaymodeTestControllerName);
  26. var editorLoadedTestAssemblyProvider = new EditorLoadedTestAssemblyProvider(new EditorCompilationInterfaceProxy(), new EditorAssembliesProxy());
  27. var runner = go.AddComponent<PlaymodeTestsController>();
  28. runnerSetup(runner);
  29. runner.settings.bootstrapScene = sceneName;
  30. runner.settings.orderedTestNames = m_Settings.orderedTestNames;
  31. runner.AssembliesWithTests = editorLoadedTestAssemblyProvider.GetAssembliesGroupedByType(TestPlatform.PlayMode).Select(x => x.Assembly.GetName().Name).ToList();
  32. EditorSceneManager.MarkSceneDirty(scene);
  33. AssetDatabase.SaveAssets();
  34. EditorSceneManager.SaveScene(scene, sceneName, false);
  35. return scene;
  36. }
  37. public string CreateSceneName()
  38. {
  39. return "Assets/InitTestScene" + DateTime.Now.Ticks + ".unity";
  40. }
  41. protected UnityTestAssemblyRunner LoadTests(ITestFilter filter)
  42. {
  43. var editorLoadedTestAssemblyProvider = new EditorLoadedTestAssemblyProvider(new EditorCompilationInterfaceProxy(), new EditorAssembliesProxy());
  44. var assembliesWithTests = editorLoadedTestAssemblyProvider.GetAssembliesGroupedByType(TestPlatform.PlayMode).Select(x => x.Assembly.GetName().Name).ToList();
  45. var nUnitTestAssemblyRunner = new UnityTestAssemblyRunner(new UnityTestAssemblyBuilder(m_Settings.orderedTestNames), null);
  46. var assemblyProvider = new PlayerTestAssemblyProvider(new AssemblyLoadProxy(), assembliesWithTests);
  47. nUnitTestAssemblyRunner.Load(assemblyProvider.GetUserAssemblies().Select(a => a.Assembly).ToArray(), TestPlatform.PlayMode, UnityTestAssemblyBuilder.GetNUnitTestBuilderSettings(TestPlatform.PlayMode));
  48. return nUnitTestAssemblyRunner;
  49. }
  50. protected static void ReopenOriginalScene(string originalSceneName)
  51. {
  52. EditorSceneManager.NewScene(NewSceneSetup.DefaultGameObjects);
  53. if (!string.IsNullOrEmpty(originalSceneName))
  54. {
  55. EditorSceneManager.OpenScene(originalSceneName);
  56. }
  57. }
  58. }
  59. internal static class PlaymodeTestsControllerExtensions
  60. {
  61. internal static T AddEventHandlerMonoBehaviour<T>(this PlaymodeTestsController controller) where T : MonoBehaviour, ITestRunnerListener
  62. {
  63. var eventHandler = controller.gameObject.AddComponent<T>();
  64. SetListeners(controller, eventHandler);
  65. return eventHandler;
  66. }
  67. internal static T AddEventHandlerScriptableObject<T>(this PlaymodeTestsController controller) where T : ScriptableObject, ITestRunnerListener
  68. {
  69. var eventListener = ScriptableObject.CreateInstance<T>();
  70. AddEventHandlerScriptableObject(controller, eventListener);
  71. return eventListener;
  72. }
  73. internal static void AddEventHandlerScriptableObject(this PlaymodeTestsController controller, ITestRunnerListener obj)
  74. {
  75. SetListeners(controller, obj);
  76. }
  77. private static void SetListeners(PlaymodeTestsController controller, ITestRunnerListener eventHandler)
  78. {
  79. UnityEventTools.AddPersistentListener(controller.testStartedEvent, eventHandler.TestStarted);
  80. UnityEventTools.AddPersistentListener(controller.testFinishedEvent, eventHandler.TestFinished);
  81. UnityEventTools.AddPersistentListener(controller.runStartedEvent, eventHandler.RunStarted);
  82. UnityEventTools.AddPersistentListener(controller.runFinishedEvent, eventHandler.RunFinished);
  83. }
  84. }
  85. }