diff --git a/runfo/Program.cs b/runfo/Program.cs index 327fbd3..01a1ea6 100644 --- a/runfo/Program.cs +++ b/runfo/Program.cs @@ -132,7 +132,7 @@ void ShowHelp() Console.WriteLine(" search-timeline Search timeline info"); Console.WriteLine(" search-helix Search helix logs"); Console.WriteLine(" search-buildlog Search build logs"); - Console.WriteLine(" tests Print build test failures"); + Console.WriteLine(" search-tests Print build test failures"); Console.WriteLine(" timeline Dump the timeline"); Console.WriteLine(" yaml Dump the YML for a build"); Console.WriteLine(); diff --git a/runfo/RuntimeInfo.cs b/runfo/RuntimeInfo.cs index 77aa075..015471b 100644 --- a/runfo/RuntimeInfo.cs +++ b/runfo/RuntimeInfo.cs @@ -893,6 +893,7 @@ internal async Task PrintFailedTests(IEnumerable args) { bool verbose = false; bool markdown = false; + string? playlist = null; bool includeAllTests = false; string? name = null; string grouping = "tests"; @@ -900,6 +901,7 @@ internal async Task PrintFailedTests(IEnumerable args) { { "g|grouping=", "output grouping: tests*, builds, jobs", g => grouping = g }, { "m|markdown", "output in markdown", m => markdown = m is object }, + { "playlist=", "save VS test playlist to a file", p => playlist = p }, { "n|name=", "name regex to match in results", n => name = n }, { "at|all-tests", "include all tests", at => includeAllTests = at is object }, { "v|verbose", "verbose output", d => verbose = d is object }, @@ -908,7 +910,7 @@ internal async Task PrintFailedTests(IEnumerable args) ParseAll(optionSet, args); var collection = await QueryUtil.ListBuildTestInfosAsync(optionSet, includeAllTests); - await PrintFailureInfo(collection, grouping, name, verbose, markdown); + await PrintFailureInfo(collection, grouping, name, verbose, markdown, playlist); return ExitSuccess; } @@ -917,20 +919,21 @@ private async Task PrintFailureInfo( string grouping, string? name, bool verbose, - bool markdown) + bool markdown, + string? playlist) { + FilterToTestName(); + SavePlaylist(); + switch (grouping) { case "tests": - FilterToTestName(); await GroupByTests(); break; case "builds": - FilterToTestName(); GroupByBuilds(); break; case "jobs": - FilterToTestName(); GroupByJobs(); break; default: @@ -946,6 +949,21 @@ void FilterToTestName() } } + void SavePlaylist() + { + if (!string.IsNullOrEmpty(playlist)) + { + // Test playlist file format docs: https://learn.microsoft.com/en-us/visualstudio/test/run-unit-tests-with-test-explorer?view=vs-2022#create-custom-playlists + using var writer = File.CreateText(playlist); + writer.WriteLine(""); + foreach (var testName in collection.GetTestCaseTitles()) + { + writer.WriteLine($""); + } + writer.WriteLine(""); + } + } + void GroupByBuilds() { foreach (var buildTestInfo in collection)