Nessuna descrizione
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.

PlaymodeTestsController.cs 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using UnityEngine.SceneManagement;
  6. using UnityEngine.TestRunner.NUnitExtensions;
  7. using UnityEngine.TestRunner.NUnitExtensions.Runner;
  8. using UnityEngine.TestTools.NUnitExtensions;
  9. using UnityEngine.TestTools.Utils;
  10. namespace UnityEngine.TestTools.TestRunner
  11. {
  12. [Serializable]
  13. [AddComponentMenu("")]
  14. internal class PlaymodeTestsController : MonoBehaviour
  15. {
  16. private IEnumerator m_TestSteps;
  17. public static PlaymodeTestsController ActiveController { get; set; }
  18. [SerializeField]
  19. private List<string> m_AssembliesWithTests;
  20. public List<string> AssembliesWithTests
  21. {
  22. get
  23. {
  24. return m_AssembliesWithTests;
  25. }
  26. set
  27. {
  28. m_AssembliesWithTests = value;
  29. }
  30. }
  31. [SerializeField]
  32. internal TestStartedEvent testStartedEvent = new TestStartedEvent();
  33. [SerializeField]
  34. internal TestFinishedEvent testFinishedEvent = new TestFinishedEvent();
  35. [SerializeField]
  36. internal RunStartedEvent runStartedEvent = new RunStartedEvent();
  37. [SerializeField]
  38. internal RunFinishedEvent runFinishedEvent = new RunFinishedEvent();
  39. //DO NOT change this string, third party code is using this string to identify the test runner game object.
  40. internal const string kPlaymodeTestControllerName = "Code-based tests runner";
  41. [SerializeField]
  42. public PlaymodeTestsControllerSettings settings = new PlaymodeTestsControllerSettings();
  43. [NonSerialized]
  44. public bool RunInfrastructureHasRegistered = false;
  45. internal UnityTestAssemblyRunner m_Runner;
  46. public IEnumerator Start()
  47. {
  48. UnityTestExecutionContext.CurrentContext = new UnityTestExecutionContext()
  49. {
  50. FeatureFlags = settings.featureFlags,
  51. RetryCount = settings.retryCount,
  52. RepeatCount = settings.repeatCount,
  53. Automated = settings.automated
  54. };
  55. ActiveController = this;
  56. //Skip 2 frame because Unity.
  57. yield return null;
  58. yield return null;
  59. StartCoroutine(Run());
  60. }
  61. internal static bool IsControllerOnScene()
  62. {
  63. return GameObject.Find(kPlaymodeTestControllerName) != null;
  64. }
  65. internal static PlaymodeTestsController GetController()
  66. {
  67. return GameObject.Find(kPlaymodeTestControllerName).GetComponent<PlaymodeTestsController>();
  68. }
  69. public IEnumerator TestRunnerCoroutine()
  70. {
  71. while (m_TestSteps.MoveNext())
  72. {
  73. yield return m_TestSteps.Current;
  74. }
  75. if (m_Runner.IsTestComplete)
  76. {
  77. runFinishedEvent.Invoke(m_Runner.Result);
  78. yield return null;
  79. }
  80. }
  81. public IEnumerator Run()
  82. {
  83. if (!RunInfrastructureHasRegistered)
  84. {
  85. // Wait for the infrastructure to be ready
  86. yield return null;
  87. }
  88. CoroutineTestWorkItem.monoBehaviourCoroutineRunner = this;
  89. gameObject.hideFlags |= HideFlags.DontSave;
  90. if (settings.sceneBased)
  91. {
  92. SceneManager.LoadScene(1, LoadSceneMode.Additive);
  93. yield return null;
  94. }
  95. var testListUtil = new PlayerTestAssemblyProvider(new AssemblyLoadProxy(), m_AssembliesWithTests);
  96. m_Runner = new UnityTestAssemblyRunner(new UnityTestAssemblyBuilder(settings.orderedTestNames, settings.randomOrderSeed), new PlaymodeWorkItemFactory(), UnityTestExecutionContext.CurrentContext);
  97. var loadedTests = m_Runner.Load(testListUtil.GetUserAssemblies().Select(a => a.Assembly).ToArray(), TestPlatform.PlayMode, UnityTestAssemblyBuilder.GetNUnitTestBuilderSettings(TestPlatform.PlayMode));
  98. loadedTests.ParseForNameDuplicates();
  99. runStartedEvent.Invoke(m_Runner.LoadedTest);
  100. var testListenerWrapper = new TestListenerWrapper(testStartedEvent, testFinishedEvent);
  101. m_TestSteps = m_Runner.Run(testListenerWrapper, settings.BuildNUnitFilter()).GetEnumerator();
  102. yield return TestRunnerCoroutine();
  103. }
  104. public void Cleanup()
  105. {
  106. if (m_Runner != null)
  107. {
  108. m_Runner.StopRun();
  109. m_Runner = null;
  110. }
  111. if (Application.isEditor)
  112. {
  113. if (Application.isPlaying)
  114. {
  115. Destroy(gameObject);
  116. }
  117. else
  118. {
  119. DestroyImmediate(gameObject);
  120. }
  121. }
  122. }
  123. }
  124. }