Skip to content

Commit 4959941

Browse files
authored
Add option to order tests by name (#3796)
1 parent 62659f7 commit 4959941

File tree

2 files changed

+42
-16
lines changed

2 files changed

+42
-16
lines changed

src/Adapter/MSTest.TestAdapter/Execution/TestExecutionManager.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,11 @@ private void ExecuteTestsWithTestRunner(
407407
bool hasAnyRunnableTests = false;
408408
var fixtureTests = new List<TestCase>();
409409

410-
foreach (TestCase currentTest in tests)
410+
IEnumerable<TestCase> orderedTests = MSTestSettings.CurrentSettings.OrderTestsByNameInClass
411+
? tests.OrderBy(t => t.GetManagedType()).ThenBy(t => t.GetManagedMethod())
412+
: tests;
413+
414+
foreach (TestCase currentTest in orderedTests)
411415
{
412416
_testRunCancellationToken?.ThrowIfCancellationRequested();
413417

src/Adapter/MSTest.TestAdapter/MSTestSettings.cs

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ public MSTestSettings()
6666
TestCleanupTimeout = 0;
6767
TreatClassAndAssemblyCleanupWarningsAsErrors = false;
6868
CooperativeCancellationTimeout = false;
69+
OrderTestsByNameInClass = false;
6970
}
7071

7172
/// <summary>
@@ -204,6 +205,11 @@ public static RunConfigurationSettings RunConfigurationSettings
204205
/// </summary>
205206
internal bool CooperativeCancellationTimeout { get; private set; }
206207

208+
/// <summary>
209+
/// Gets a value indicating whether tests should be ordered by name in the class.
210+
/// </summary>
211+
internal bool OrderTestsByNameInClass { get; private set; }
212+
207213
/// <summary>
208214
/// Populate settings based on existing settings object.
209215
/// </summary>
@@ -215,28 +221,29 @@ public static void PopulateSettings(MSTestSettings settings)
215221
return;
216222
}
217223

224+
CurrentSettings.AssemblyCleanupTimeout = settings.AssemblyCleanupTimeout;
225+
CurrentSettings.AssemblyInitializeTimeout = settings.AssemblyInitializeTimeout;
218226
CurrentSettings.CaptureDebugTraces = settings.CaptureDebugTraces;
227+
CurrentSettings.ClassCleanupLifecycle = settings.ClassCleanupLifecycle;
228+
CurrentSettings.ClassCleanupTimeout = settings.ClassCleanupTimeout;
229+
CurrentSettings.ClassInitializeTimeout = settings.ClassInitializeTimeout;
230+
CurrentSettings.ConsiderEmptyDataSourceAsInconclusive = settings.ConsiderEmptyDataSourceAsInconclusive;
231+
CurrentSettings.ConsiderFixturesAsSpecialTests = settings.ConsiderFixturesAsSpecialTests;
232+
CurrentSettings.CooperativeCancellationTimeout = settings.CooperativeCancellationTimeout;
233+
CurrentSettings.DisableParallelization = settings.DisableParallelization;
234+
CurrentSettings.EnableBaseClassTestMethodsFromOtherAssemblies = settings.EnableBaseClassTestMethodsFromOtherAssemblies;
219235
CurrentSettings.ForcedLegacyMode = settings.ForcedLegacyMode;
220-
CurrentSettings.TestSettingsFile = settings.TestSettingsFile;
221236
CurrentSettings.MapInconclusiveToFailed = settings.MapInconclusiveToFailed;
222237
CurrentSettings.MapNotRunnableToFailed = settings.MapNotRunnableToFailed;
223-
CurrentSettings.TreatDiscoveryWarningsAsErrors = settings.TreatDiscoveryWarningsAsErrors;
224-
CurrentSettings.EnableBaseClassTestMethodsFromOtherAssemblies = settings.EnableBaseClassTestMethodsFromOtherAssemblies;
225-
CurrentSettings.ClassCleanupLifecycle = settings.ClassCleanupLifecycle;
226-
CurrentSettings.ParallelizationWorkers = settings.ParallelizationWorkers;
238+
CurrentSettings.OrderTestsByNameInClass = settings.OrderTestsByNameInClass;
227239
CurrentSettings.ParallelizationScope = settings.ParallelizationScope;
228-
CurrentSettings.DisableParallelization = settings.DisableParallelization;
240+
CurrentSettings.ParallelizationWorkers = settings.ParallelizationWorkers;
241+
CurrentSettings.TestCleanupTimeout = settings.TestCleanupTimeout;
242+
CurrentSettings.TestInitializeTimeout = settings.TestInitializeTimeout;
243+
CurrentSettings.TestSettingsFile = settings.TestSettingsFile;
229244
CurrentSettings.TestTimeout = settings.TestTimeout;
230245
CurrentSettings.TreatClassAndAssemblyCleanupWarningsAsErrors = settings.TreatClassAndAssemblyCleanupWarningsAsErrors;
231-
CurrentSettings.AssemblyInitializeTimeout = settings.AssemblyInitializeTimeout;
232-
CurrentSettings.AssemblyCleanupTimeout = settings.AssemblyCleanupTimeout;
233-
CurrentSettings.ConsiderEmptyDataSourceAsInconclusive = settings.ConsiderEmptyDataSourceAsInconclusive;
234-
CurrentSettings.ClassInitializeTimeout = settings.ClassInitializeTimeout;
235-
CurrentSettings.ClassCleanupTimeout = settings.ClassCleanupTimeout;
236-
CurrentSettings.TestInitializeTimeout = settings.TestInitializeTimeout;
237-
CurrentSettings.TestCleanupTimeout = settings.TestCleanupTimeout;
238-
CurrentSettings.ConsiderFixturesAsSpecialTests = settings.ConsiderFixturesAsSpecialTests;
239-
CurrentSettings.CooperativeCancellationTimeout = settings.CooperativeCancellationTimeout;
246+
CurrentSettings.TreatDiscoveryWarningsAsErrors = settings.TreatDiscoveryWarningsAsErrors;
240247
}
241248

242249
/// <summary>
@@ -693,6 +700,21 @@ private static MSTestSettings ToSettings(XmlReader reader, IMessageLogger? logge
693700
break;
694701
}
695702

703+
case "ORDERTESTSBYNAMEINCLASS":
704+
{
705+
string value = reader.ReadInnerXml();
706+
if (bool.TryParse(value, out result))
707+
{
708+
settings.OrderTestsByNameInClass = result;
709+
}
710+
else
711+
{
712+
logger?.SendMessage(TestMessageLevel.Warning, string.Format(CultureInfo.CurrentCulture, Resource.InvalidValue, value, "OrderTestsByNameInClass"));
713+
}
714+
715+
break;
716+
}
717+
696718
default:
697719
{
698720
PlatformServiceProvider.Instance.SettingsProvider.Load(reader.ReadSubtree());

0 commit comments

Comments
 (0)