Skip to content

Commit d176ec6

Browse files
SimonCroppthomhurst
authored andcommitted
Expose test arguments as filterable properties
Parameterized tests can now be filtered by their resolved argument values via `--treenode-filter`, e.g.: --treenode-filter "/*/*/MyTests/*[arg0=*foo*]" TestBuilder.InvokeDiscoveryEventReceiversAsync stringifies each entry in TestDetails.TestMethodArguments and adds it to the DiscoveredTestContext as arg0, arg1, ... so it flows into the existing property bag used by the filter matcher. Wildcards in the value are supported by the platform's built-in matcher.
1 parent 39a9ed5 commit d176ec6

3 files changed

Lines changed: 43 additions & 0 deletions

File tree

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using Shouldly;
2+
using TUnit.Engine.Tests.Enums;
3+
4+
namespace TUnit.Engine.Tests;
5+
6+
public class FilterByArgumentValueFilteringTests(TestMode testMode) : InvokableTestBase(testMode)
7+
{
8+
[Test]
9+
public async Task ExactMatch()
10+
{
11+
await RunTestsWithFilter(
12+
"/*/*/FilterByArgumentValueTests/*[arg0=beta]",
13+
[
14+
result => result.ResultSummary.Outcome.ShouldBe("Completed"),
15+
result => result.ResultSummary.Counters.Total.ShouldBe(1),
16+
result => result.ResultSummary.Counters.Passed.ShouldBe(1),
17+
result => result.ResultSummary.Counters.Failed.ShouldBe(0),
18+
result => result.ResultSummary.Counters.NotExecuted.ShouldBe(0)
19+
]);
20+
}
21+
}

TUnit.Engine/Building/TestBuilder.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1126,6 +1126,16 @@ private Task InvokeDiscoveryEventReceiversAsync(TestContext context)
11261126
context.Metadata.TestDetails.TestName,
11271127
context);
11281128

1129+
// Expose the resolved method argument values as filterable properties so
1130+
// callers can use `--treenode-filter` with syntax like `MyTest[arg0=*foo*]`
1131+
// to target a specific parameterized instance.
1132+
var testMethodArguments = context.Metadata.TestDetails.TestMethodArguments;
1133+
for (var i = 0; i < testMethodArguments.Length; i++)
1134+
{
1135+
var argValue = testMethodArguments[i]?.ToString() ?? "";
1136+
discoveredContext.AddProperty($"arg{i}", argValue);
1137+
}
1138+
11291139
return _eventReceiverOrchestrator.InvokeTestDiscoveryEventReceiversAsync(context, discoveredContext, CancellationToken.None);
11301140
}
11311141

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
namespace TUnit.TestProject;
2+
3+
public class FilterByArgumentValueTests
4+
{
5+
[Test]
6+
[Arguments("alpha")]
7+
[Arguments("beta")]
8+
[Arguments("gamma")]
9+
public void Test(string value)
10+
{
11+
}
12+
}

0 commit comments

Comments
 (0)