暂无描述
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

UnityTestAssemblyRunner.cs 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Reflection;
  6. using NUnit;
  7. using NUnit.Framework.Interfaces;
  8. using NUnit.Framework.Internal;
  9. using NUnit.Framework.Internal.Execution;
  10. using UnityEngine.TestTools;
  11. using UnityEngine.TestTools.NUnitExtensions;
  12. namespace UnityEngine.TestRunner.NUnitExtensions.Runner
  13. {
  14. internal interface IUnityTestAssemblyRunner
  15. {
  16. ITest LoadedTest { get; }
  17. ITestResult Result { get; }
  18. bool IsTestLoaded { get; }
  19. bool IsTestRunning { get; }
  20. bool IsTestComplete { get; }
  21. UnityWorkItem TopLevelWorkItem { get; set; }
  22. UnityTestExecutionContext GetCurrentContext();
  23. ITest Load(Assembly[] assemblies, TestPlatform testPlatform, IDictionary<string, object> settings);
  24. void LoadTestTree(ITest testTree);
  25. IEnumerable Run(ITestListener listener, ITestFilter filter);
  26. void StopRun();
  27. }
  28. internal class UnityTestAssemblyRunner : IUnityTestAssemblyRunner
  29. {
  30. private readonly UnityTestAssemblyBuilder unityBuilder;
  31. private readonly WorkItemFactory m_Factory;
  32. protected UnityTestExecutionContext Context { get; set; }
  33. public UnityTestExecutionContext GetCurrentContext()
  34. {
  35. return UnityTestExecutionContext.CurrentContext;
  36. }
  37. protected IDictionary<string, object> Settings { get; set; }
  38. public ITest LoadedTest { get; protected set; }
  39. public ITestResult Result
  40. {
  41. get { return TopLevelWorkItem == null ? null : TopLevelWorkItem.Result; }
  42. }
  43. public bool IsTestLoaded
  44. {
  45. get { return LoadedTest != null; }
  46. }
  47. public bool IsTestRunning
  48. {
  49. get { return TopLevelWorkItem != null && TopLevelWorkItem.State == WorkItemState.Running; }
  50. }
  51. public bool IsTestComplete
  52. {
  53. get { return TopLevelWorkItem != null && TopLevelWorkItem.State == WorkItemState.Complete; }
  54. }
  55. public UnityTestAssemblyRunner(UnityTestAssemblyBuilder builder, WorkItemFactory factory, UnityTestExecutionContext context)
  56. {
  57. unityBuilder = builder;
  58. m_Factory = factory;
  59. Context = context;
  60. }
  61. public ITest Load(Assembly[] assemblies, TestPlatform testPlatform, IDictionary<string, object> settings)
  62. {
  63. // The setting of the TestMode should happen when running tests.
  64. if (Context != null)
  65. {
  66. Context.TestMode = testPlatform;
  67. }
  68. Settings = settings;
  69. if (settings.ContainsKey(FrameworkPackageSettings.RandomSeed))
  70. Randomizer.InitialSeed = (int)settings[FrameworkPackageSettings.RandomSeed];
  71. var tree = unityBuilder.Build(assemblies, Enumerable.Repeat(testPlatform, assemblies.Length).ToArray(), settings);
  72. return LoadedTest = tree;
  73. }
  74. public void LoadTestTree(ITest testTree)
  75. {
  76. LoadedTest = testTree;
  77. }
  78. public IEnumerable Run(ITestListener listener, ITestFilter filter)
  79. {
  80. TopLevelWorkItem = m_Factory.Create(LoadedTest, filter);
  81. TopLevelWorkItem.InitializeContext(Context);
  82. Context.Listener = listener;
  83. return TopLevelWorkItem.Execute();
  84. }
  85. public UnityWorkItem TopLevelWorkItem { get; set; }
  86. public void StopRun()
  87. {
  88. if (IsTestRunning)
  89. {
  90. TopLevelWorkItem.Cancel(false);
  91. }
  92. }
  93. }
  94. }