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

UnityTestAssemblyBuilder.cs 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Reflection;
  5. using NUnit;
  6. using NUnit.Framework.Api;
  7. using NUnit.Framework.Interfaces;
  8. using NUnit.Framework.Internal;
  9. using Unity.Profiling;
  10. using UnityEngine.TestRunner.NUnitExtensions;
  11. using UnityEngine.TestRunner.NUnitExtensions.Filters;
  12. namespace UnityEngine.TestTools.NUnitExtensions
  13. {
  14. internal class UnityTestAssemblyBuilder : DefaultTestAssemblyBuilder, IAsyncTestAssemblyBuilder
  15. {
  16. private readonly string m_ProductName;
  17. private readonly ITestSuiteModifier[] m_TestSuiteModifiers;
  18. public UnityTestAssemblyBuilder(string[] orderedTestNames, int randomSeed)
  19. {
  20. m_TestSuiteModifiers = (orderedTestNames != null && orderedTestNames.Length > 0) || randomSeed != 0
  21. ? new ITestSuiteModifier[] {new OrderedTestSuiteModifier(orderedTestNames, randomSeed)}
  22. : new ITestSuiteModifier[0];
  23. m_ProductName = Application.productName;
  24. }
  25. public ITest Build(Assembly[] assemblies, TestPlatform[] testPlatforms, IDictionary<string, object> options)
  26. {
  27. var test = BuildAsync(assemblies, testPlatforms, options);
  28. while (test.MoveNext())
  29. {
  30. }
  31. return test.Current;
  32. }
  33. struct PlatformAssembly : IEquatable<PlatformAssembly>
  34. {
  35. public System.Reflection.Assembly Assembly;
  36. public TestPlatform Platform;
  37. public bool Equals(PlatformAssembly other)
  38. {
  39. return Equals(Assembly, other.Assembly) && Platform == other.Platform;
  40. }
  41. public override bool Equals(object obj)
  42. {
  43. return obj is PlatformAssembly other && Equals(other);
  44. }
  45. public override int GetHashCode()
  46. {
  47. unchecked
  48. {
  49. return ((Assembly != null ? Assembly.GetHashCode() : 0) * 397) ^ (int) Platform;
  50. }
  51. }
  52. }
  53. private static Dictionary<PlatformAssembly, TestSuite> CachedAssemblies = new Dictionary<PlatformAssembly, TestSuite>();
  54. public IEnumerator<ITest> BuildAsync(Assembly[] assemblies, TestPlatform[] testPlatforms, IDictionary<string, object> options)
  55. {
  56. var productName = string.Join("_", m_ProductName.Split(Path.GetInvalidFileNameChars()));
  57. var suite = new TestSuite(productName);
  58. for (var index = 0; index < assemblies.Length; index++)
  59. {
  60. var assembly = assemblies[index];
  61. var platform = testPlatforms[index];
  62. using (new ProfilerMarker(nameof(UnityTestAssemblyBuilder) + "." + assembly.GetName().Name).Auto())
  63. {
  64. var key = new PlatformAssembly {Assembly = assembly, Platform = platform};
  65. if (!CachedAssemblies.TryGetValue(key, out var assemblySuite))
  66. {
  67. assemblySuite = Build(assembly, GetNUnitTestBuilderSettings(platform)) as TestSuite;
  68. if (assemblySuite != null)
  69. {
  70. assemblySuite.Properties.Set("platform", platform);
  71. EditorOnlyFilter.ApplyPropertyToTest(assemblySuite, platform == TestPlatform.EditMode);
  72. }
  73. CachedAssemblies.Add(key, assemblySuite);
  74. }
  75. if (assemblySuite != null && assemblySuite.HasChildren)
  76. {
  77. suite.Add(assemblySuite);
  78. }
  79. }
  80. yield return null;
  81. }
  82. suite.ParseForNameDuplicates();
  83. suite.Properties.Set("platform", testPlatforms.MergeFlags());
  84. foreach (var testSuiteModifier in m_TestSuiteModifiers)
  85. {
  86. suite = testSuiteModifier.ModifySuite(suite);
  87. }
  88. yield return suite;
  89. }
  90. public static Dictionary<string, object> GetNUnitTestBuilderSettings(TestPlatform testPlatform)
  91. {
  92. var emptySettings = new Dictionary<string, object>();
  93. emptySettings.Add(FrameworkPackageSettings.TestParameters, "platform=" + testPlatform);
  94. return emptySettings;
  95. }
  96. }
  97. }