CodeCoverage.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. using UnityEditor.TestTools.CodeCoverage.Analytics;
  2. using UnityEditor.TestTools.CodeCoverage.Utils;
  3. using UnityEngine.TestTools;
  4. namespace UnityEditor.TestTools.CodeCoverage
  5. {
  6. /// <summary>
  7. /// Utility class for the CodeCoverage API.
  8. /// </summary>
  9. /// <example>
  10. /// The following example loads a scene, starts coverage recording, initializes a number of instances of a prefab, then pauses the recording to load another scene, unpauses the recording, initializes a number of instances of a different prefab and finally stops the recording.
  11. /// It also sets the verbosity level to Verbose, so all logs are printed to the editor log.
  12. /// <code>
  13. /// using UnityEngine;
  14. /// using UnityEditor;
  15. /// using UnityEditor.TestTools.CodeCoverage;
  16. /// using UnityEditor.SceneManagement;
  17. ///
  18. /// public class CoverageApiTest : MonoBehaviour
  19. /// {
  20. /// [MenuItem("CodeCoverage/Run Recording")]
  21. /// static void RunRecording()
  22. /// {
  23. /// CodeCoverage.VerbosityLevel = LogVerbosityLevel.Verbose;
  24. ///
  25. /// int i;
  26. ///
  27. /// EditorSceneManager.OpenScene("Assets/Scenes/Scene1.unity");
  28. ///
  29. /// CodeCoverage.StartRecording();
  30. ///
  31. /// for (i = 0; i &lt; 1000; ++i)
  32. /// {
  33. /// Instantiate(Resources.Load("ComplexPrefab1"));
  34. /// }
  35. ///
  36. /// CodeCoverage.PauseRecording();
  37. ///
  38. /// EditorSceneManager.OpenScene("Assets/Scenes/Scene2.unity");
  39. ///
  40. /// CodeCoverage.UnpauseRecording();
  41. ///
  42. /// for (i = 0; i &lt; 1000; ++i)
  43. /// {
  44. /// Instantiate(Resources.Load("ComplexPrefab2"));
  45. /// }
  46. ///
  47. /// CodeCoverage.StopRecording();
  48. /// }
  49. /// }
  50. /// </code>
  51. /// </example>
  52. public static class CodeCoverage
  53. {
  54. private static CoverageReporterManager s_CoverageReporterManager;
  55. /// <summary>
  56. /// Sets the verbosity level used in editor and console logs. The default level is <see cref="LogVerbosityLevel.Info"/>.
  57. /// </summary>
  58. /// <value>
  59. /// The verbosity level used in editor and console logs.
  60. /// </value>
  61. public static LogVerbosityLevel VerbosityLevel
  62. {
  63. set
  64. {
  65. ResultsLogger.VerbosityLevel = value;
  66. }
  67. get
  68. {
  69. return ResultsLogger.VerbosityLevel;
  70. }
  71. }
  72. /// <summary>
  73. /// Call this to start a new coverage recording session.
  74. /// </summary>
  75. public static void StartRecording()
  76. {
  77. CoverageAnalytics.instance.CurrentCoverageEvent.useAPI_StartRec = true;
  78. StartRecordingInternal();
  79. }
  80. internal static void StartRecordingInternal()
  81. {
  82. bool isRunning = CoverageRunData.instance.isRunning;
  83. if (!isRunning)
  84. {
  85. Coverage.ResetAll();
  86. CoverageRunData.instance.StartRecording();
  87. if (s_CoverageReporterManager == null)
  88. s_CoverageReporterManager = CoverageReporterStarter.CoverageReporterManager;
  89. s_CoverageReporterManager.CreateCoverageReporter();
  90. ICoverageReporter coverageReporter = s_CoverageReporterManager.CoverageReporter;
  91. if (coverageReporter != null)
  92. coverageReporter.OnRunStarted(null);
  93. }
  94. }
  95. /// <summary>
  96. /// Call this to pause the recording on the current coverage recording session.
  97. /// </summary>
  98. public static void PauseRecording()
  99. {
  100. CoverageAnalytics.instance.CurrentCoverageEvent.useAPI_PauseRec = true;
  101. bool isRunning = CoverageRunData.instance.isRunning;
  102. if (isRunning)
  103. {
  104. if (CoverageRunData.instance.isRecording && !CoverageRunData.instance.isRecordingPaused)
  105. {
  106. if (s_CoverageReporterManager == null)
  107. s_CoverageReporterManager = CoverageReporterStarter.CoverageReporterManager;
  108. ICoverageReporter coverageReporter = s_CoverageReporterManager.CoverageReporter;
  109. if (coverageReporter != null)
  110. coverageReporter.OnCoverageRecordingPaused();
  111. CoverageRunData.instance.PauseRecording();
  112. }
  113. }
  114. }
  115. /// <summary>
  116. /// Call this to continue recording on the current coverage recording session, after having paused the recording.
  117. /// </summary>
  118. public static void UnpauseRecording()
  119. {
  120. CoverageAnalytics.instance.CurrentCoverageEvent.useAPI_UnpauseRec = true;
  121. bool isRunning = CoverageRunData.instance.isRunning;
  122. if (isRunning)
  123. {
  124. if (CoverageRunData.instance.isRecording && CoverageRunData.instance.isRecordingPaused)
  125. {
  126. Coverage.ResetAll();
  127. CoverageRunData.instance.UnpauseRecording();
  128. }
  129. }
  130. }
  131. /// <summary>
  132. /// Call this to end the current coverage recording session.
  133. /// </summary>
  134. public static void StopRecording()
  135. {
  136. CoverageAnalytics.instance.CurrentCoverageEvent.useAPI_StopRec = true;
  137. StopRecordingInternal();
  138. }
  139. internal static void StopRecordingInternal()
  140. {
  141. bool isRunning = CoverageRunData.instance.isRunning;
  142. if (isRunning)
  143. {
  144. if (CoverageRunData.instance.isRecording)
  145. {
  146. if (CoverageRunData.instance.isRecordingPaused)
  147. Coverage.ResetAll();
  148. if (s_CoverageReporterManager == null)
  149. s_CoverageReporterManager = CoverageReporterStarter.CoverageReporterManager;
  150. ICoverageReporter coverageReporter = s_CoverageReporterManager.CoverageReporter;
  151. if (coverageReporter != null)
  152. coverageReporter.OnRunFinished(null);
  153. CoverageRunData.instance.StopRecording();
  154. s_CoverageReporterManager.GenerateReport();
  155. }
  156. }
  157. }
  158. }
  159. }