Skip to content

feat: use results directory provided by Microsoft Testing Platform in HtmlReporter#5294

Merged
thomhurst merged 2 commits intothomhurst:mainfrom
DavidZidar:use-results-directory
Mar 29, 2026
Merged

feat: use results directory provided by Microsoft Testing Platform in HtmlReporter#5294
thomhurst merged 2 commits intothomhurst:mainfrom
DavidZidar:use-results-directory

Conversation

@DavidZidar
Copy link
Copy Markdown
Contributor

Description

Store HTML reports in the results directory provided by Microsoft Testing Platform instead of using the hard coded path TestResults.

Related Issue

Fixes #5293

Type of Change

  • Bug fix (non-breaking change that fixes an issue)
  • New feature (non-breaking change that adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update
  • Performance improvement
  • Refactoring (no functional changes)

Checklist

Required

  • I have read the Contributing Guidelines
  • If this is a new feature, I started a discussion first and received agreement
  • My code follows the project's code style (modern C# syntax, proper naming conventions)
  • I have written tests that prove my fix is effective or my feature works (no, but I have tested the change manually)

TUnit-Specific Requirements

  • Dual-Mode Implementation: If this change affects test discovery/execution, I have implemented it in BOTH:
    • Source Generator path (TUnit.Core.SourceGenerator)
    • Reflection path (TUnit.Engine)
  • Snapshot Tests: If I changed source generator output or public APIs:
    • I ran TUnit.Core.SourceGenerator.Tests and/or TUnit.PublicAPI tests
    • I reviewed the .received.txt files and accepted them as .verified.txt
    • I committed the updated .verified.txt files
  • Performance: If this change affects hot paths (test discovery, execution, assertions):
    • I minimized allocations and avoided LINQ in hot paths
    • I cached reflection results where appropriate
  • AOT Compatibility: If this change uses reflection:
    • I added appropriate [DynamicallyAccessedMembers] annotations
    • I verified the change works with dotnet publish -p:PublishAot=true

Testing

  • All existing tests pass (dotnet test) - The tests do not run cleanly in main branch so I can't verify
  • I have added tests that cover my changes
  • I have tested both source-generated and reflection modes (if applicable)

Additional Notes

This is just a proposed solution. I have tested this manually by referencing the projects TUnit.Core, TUnit.Engine in one of my projects and did tests with and without the --results-directory CLI parameter. With this fix the HTML report is saved in the proper location.

I have been unable to run the tests as there are too many failures in the main branch.

@claude
Copy link
Copy Markdown
Contributor

claude bot commented Mar 29, 2026

Code Review

Thanks for the contribution! This is a good fix for an important issue — the hardcoded TestResults path is indeed a problem when --results-directory is passed to the test runner. Here is a detailed review covering the approach, correctness, and a few concerns.


What the PR does

The PR introduces SetResultsDirectory(string path) on HtmlReporter, calls it from the service factory in TestApplicationBuilderExtensions via IConfiguration.GetTestResultDirectory(), and moves the _outputPath initialization from BeforeRunAsync to OnTestSessionFinishingAsync. This ensures the HTML report lands in the same directory that MTP has already created for other output files.


Correctness of the API usage

IConfiguration.GetTestResultDirectory() is a valid MTP extension method (Microsoft.Testing.Platform.Configurations.ConfigurationExtensions). However, its implementation is:

var result = configuration["platformOptions:resultDirectory"];
return Ensure.NotNull(result, "resultDirectory");

Ensure.NotNull throws if the value is null. This is fine in practice because MTP always populates platformOptions:resultDirectory in AggregatedConfiguration via CheckTestResultsDirectoryOverrideAndCreateItAsync before service factories run. However, the PR's SetResultsDirectory guard:

if (string.IsNullOrWhiteSpace(path))
{
    throw new ArgumentException("Results directory cannot be null or empty", nameof(path));
}

...is redundant: GetTestResultDirectory has already thrown before this is reached. It is not harmful, but it creates a false impression that empty paths need to be guarded against here. The real guard is in MTP itself.


The BeforeRunAsyncOnTestSessionFinishingAsync move

The PR moves the _outputPath initialisation out of BeforeRunAsync and into OnTestSessionFinishingAsync. Looking at the current (main branch) code, BeforeRunAsync already does this guard:

public Task BeforeRunAsync(CancellationToken cancellationToken)
{
    if (string.IsNullOrEmpty(_outputPath))
    {
        _outputPath = GetDefaultOutputPath();
    }
    // ...
}

The PR removes this and puts the same check at the top of OnTestSessionFinishingAsync. This is functionally equivalent for the default path, but it changes the observable semantics: previously a consumer could call SetOutputPath(...) any time before BeforeRunAsync ran; now there is a broader window (until OnTestSessionFinishingAsync). That is not a problem in the current codebase, but it is a slight behavioural drift worth noting.

The real issue is that _resultsDirectory needs to be set before GetDefaultOutputPath() is called — and that's guaranteed now only because the service factory runs before any session events fire, which is the same guarantee that already exists for SetMessageBus. This is fine, but worth a comment explaining the ordering invariant (similar to the existing comment for SetMessageBus).


The JUnit reporter has the same bug

JUnitReporter.GetDefaultOutputPath() still has the hardcoded "TestResults":

return Path.GetFullPath(Path.Combine("TestResults", $"{sanitizedName}-junit.xml"));

For consistency, the same fix should be applied there. Leaving it out creates a confusing split where the HTML report respects --results-directory but JUnit does not.


Architectural concern: two-step initialisation

The current design requires the caller to know it must call both SetMessageBus() and now also SetResultsDirectory(), or the reporter silently falls back to a hardcoded path. This is a form of temporal coupling: the object is not usable until multiple setters have been called.

A cleaner approach would be to inject IConfiguration (or just the resolved path string) via the constructor, since HtmlReporter is instantiated inside a factory lambda that already has access to serviceProvider:

testApplicationBuilder.TestHost.AddTestSessionLifetimeHandler(serviceProvider =>
{
    var commandLineOptions = serviceProvider.GetRequiredService<ICommandLineOptions>();
    var resultsDirectory = serviceProvider.GetRequiredService<IConfiguration>().GetTestResultDirectory();

    var htmlReporter = new HtmlReporter(extension, resultsDirectory);
    // ...
});

This would eliminate SetResultsDirectory entirely and make the dependency explicit in the constructor signature. It would also make HtmlReporter easier to unit-test in isolation.

That said, SetMessageBus has the same pattern and it predates this PR, so the current two-step approach is at least consistent with the existing code. If the constructor refactor is out of scope for this PR, it is worth filing a follow-up.


Minor nib: field initialiser vs setter

private string _resultsDirectory = "TestResults";

This fallback default is now vestigial: SetResultsDirectory is always called from the factory, and GetTestResultDirectory always returns a non-null value. If the setter is removed (e.g., via the constructor refactor above) this dead default disappears naturally. As-is, it gives a false sense of safety — if SetResultsDirectory is somehow not called, the reporter silently uses "TestResults" with no warning.


Summary

Assessment
Bug being fixed Correct and important
API used (GetTestResultDirectory) Valid and correct
BeforeRunAsyncOnTestSessionFinishingAsync move Safe, but deserves a comment
SetResultsDirectory guard Redundant but harmless
JUnit reporter not updated Gap — same fix needed for consistency
Two-step initialisation Acceptable given existing patterns, but worth a follow-up issue for constructor injection

The fix is directionally correct and addresses a real user pain point. The main things I would ask for before merging:

  1. Apply the same fix to JUnitReporter.GetDefaultOutputPath() so both reporters behave consistently with --results-directory.
  2. Add a comment to the SetResultsDirectory call site (same pattern as the existing SetMessageBus comment) explaining that it must be called before OnTestSessionFinishingAsync fires.
  3. (Optional but recommended) File a follow-up issue to refactor towards constructor injection so the temporal coupling is eliminated.

@DavidZidar DavidZidar force-pushed the use-results-directory branch from a834fe6 to 3af0efb Compare March 29, 2026 14:59
@DavidZidar
Copy link
Copy Markdown
Contributor Author

I have made the adjustments proposed by Claude with some caveats:

  • I'm keeping the default value on _resultsDirectory even if it's vestigial to avoid having to make the field nullable
  • I made the same style change to JUnitReporter as requested but I haven't tested this because I'm not sure how to use the JUnit reporter, is this documented? I can't find it.
  • Constructor injection requires a bigger refactor than I want like to attempt at this time.

Copy link
Copy Markdown
Contributor

@claude claude bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Follow-up Review

Thanks for addressing the points from the previous review — comments are in, has the field and method, and the output-path initialisation has been deferred. However there is a copy-paste bug in TestApplicationBuilderExtensions.cs that means the JUnit fix is completely non-functional.


Bug: wrong reporter called inside the JUnit factory

In the JUnit AddDataConsumer factory, the code sets the results directory on htmlReporter instead of junitReporter:

// ❌ Current – sets htmlReporter inside the JUnit factory
testApplicationBuilder.TestHost.AddDataConsumer(serviceProvider =>
{
    ...
    htmlReporter.SetResultsDirectory(serviceProvider.GetRequiredService<IConfiguration>().GetTestResultDirectory());
    return junitReporter;  // but returns junitReporter!
});

This means:

  1. junitReporter.SetResultsDirectory is never called_resultsDirectory stays at the fallback "TestResults" despite having the method.
  2. htmlReporter.SetResultsDirectory is called twice — once here and again in the AddTestSessionLifetimeHandler factory — which is harmless but wasteful and confusing.

The fix is a one-word change:

// ✅ Correct
junitReporter.SetResultsDirectory(serviceProvider.GetRequiredService<IConfiguration>().GetTestResultDirectory());

Everything else looks good

  • The HtmlReporter changes are correct: SetResultsDirectory is wired up in the right factory and GetDefaultOutputPath now uses _resultsDirectory.
  • The ordering invariant comments on both SetResultsDirectory methods are clear.
  • Deferring _outputPath initialisation to OnTestSessionFinishingAsync / AfterRunAsync is the right call.
  • The _resultsDirectory = "TestResults" default is a reasonable safety net even if vestigial.

Once the copy-paste bug above is fixed, this PR is in good shape.

Copy link
Copy Markdown
Contributor

@claude claude bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Follow-up Review

Thanks for addressing the points from the previous review — comments are in, JUnitReporter has the _resultsDirectory field and SetResultsDirectory method, and the output-path initialisation has been deferred. However there is a copy-paste bug in TestApplicationBuilderExtensions.cs that means the JUnit fix is completely non-functional.


Bug: wrong reporter called inside the JUnit factory

In the JUnit AddDataConsumer factory, the code sets the results directory on htmlReporter instead of junitReporter:

// ❌ Current – sets htmlReporter inside the JUnit factory
testApplicationBuilder.TestHost.AddDataConsumer(serviceProvider =>
{
    ...
    htmlReporter.SetResultsDirectory(serviceProvider.GetRequiredService<IConfiguration>().GetTestResultDirectory());
    return junitReporter;  // but returns junitReporter!
});

This means:

  1. junitReporter.SetResultsDirectory is never called_resultsDirectory stays at the fallback "TestResults" despite having the method.
  2. htmlReporter.SetResultsDirectory is called twice — once here and again in the AddTestSessionLifetimeHandler factory — which is harmless but confusing.

The fix is a one-word change:

// ✅ Correct
junitReporter.SetResultsDirectory(serviceProvider.GetRequiredService<IConfiguration>().GetTestResultDirectory());

Everything else looks good

  • The HtmlReporter changes are correct: SetResultsDirectory is wired up in the right factory and GetDefaultOutputPath now uses _resultsDirectory.
  • The ordering invariant comments on both SetResultsDirectory methods are clear.
  • Deferring _outputPath initialisation to OnTestSessionFinishingAsync / AfterRunAsync is the right call.
  • The _resultsDirectory = "TestResults" default is a reasonable safety net even if vestigial.

Once the copy-paste bug above is fixed, this PR is in good shape.

@DavidZidar DavidZidar force-pushed the use-results-directory branch from 3af0efb to 7afc5dd Compare March 29, 2026 16:15
@DavidZidar
Copy link
Copy Markdown
Contributor Author

Good catch, I fixed the copy & paste bug and rebased the branch.

@thomhurst
Copy link
Copy Markdown
Owner

Thanks!

intellitect-bot pushed a commit to IntelliTect/EssentialCSharp.Web that referenced this pull request Mar 30, 2026
Updated [TUnit](https://github.com/thomhurst/TUnit) from 1.21.30 to
1.23.7.

<details>
<summary>Release notes</summary>

_Sourced from [TUnit's
releases](https://github.com/thomhurst/TUnit/releases)._

## 1.23.7

<!-- Release notes generated using configuration in .github/release.yml
at v1.23.7 -->

## What's Changed
### Other Changes
* feat: use results directory provided by Microsoft Testing Platform in
HtmlReporter by @​DavidZidar in
thomhurst/TUnit#5294
* feat: add benchmarks for Imposter and Mockolate mocking frameworks by
@​vbreuss in thomhurst/TUnit#5295
* feat: add TUnit0080 analyzer for missing polyfill types by @​thomhurst
in thomhurst/TUnit#5292
* fix: respect user-set TUnitImplicitUsings from Directory.Build.props
by @​thomhurst in thomhurst/TUnit#5280
* perf: optimize TUnit.Mocks hot paths by @​thomhurst in
thomhurst/TUnit#5300
### Dependencies
* chore(deps): update tunit to 1.22.19 by @​thomhurst in
thomhurst/TUnit#5296

## New Contributors
* @​DavidZidar made their first contribution in
thomhurst/TUnit#5294

**Full Changelog**:
thomhurst/TUnit@v1.22.19...v1.23.7

## 1.22.19

<!-- Release notes generated using configuration in .github/release.yml
at v1.22.19 -->

## What's Changed
### Other Changes
* Add mock library benchmarks: TUnit.Mocks vs Moq, NSubstitute,
FakeItEasy by @​Copilot in thomhurst/TUnit#5284
* perf: lazily initialize optional MockEngine collections by @​thomhurst
in thomhurst/TUnit#5289
* Always emit TUnit.Mocks.Generated namespace from source generator by
@​Copilot in thomhurst/TUnit#5282
### Dependencies
* chore(deps): update tunit to 1.22.6 by @​thomhurst in
thomhurst/TUnit#5285


**Full Changelog**:
thomhurst/TUnit@v1.22.6...v1.22.19

## 1.22.6

<!-- Release notes generated using configuration in .github/release.yml
at v1.22.6 -->

## What's Changed
### Other Changes
* fix: use IComputeResource to filter waitable Aspire resources by
@​thomhurst in thomhurst/TUnit#5278
* fix: preserve StateBag when creating per-test TestBuilderContext by
@​thomhurst in thomhurst/TUnit#5279
### Dependencies
* chore(deps): update tunit to 1.22.3 by @​thomhurst in
thomhurst/TUnit#5275


**Full Changelog**:
thomhurst/TUnit@v1.22.3...v1.22.6

## 1.22.3

<!-- Release notes generated using configuration in .github/release.yml
at v1.22.3 -->

## What's Changed
### Other Changes
* fix: pass assembly version properties to dotnet pack by @​thomhurst in
thomhurst/TUnit#5274
### Dependencies
* chore(deps): update tunit to 1.22.0 by @​thomhurst in
thomhurst/TUnit#5272


**Full Changelog**:
thomhurst/TUnit@v1.22.0...v1.22.3

## 1.22.0

<!-- Release notes generated using configuration in .github/release.yml
at v1.22.0 -->

## What's Changed
### Other Changes
* perf: run GitVersion once in CI instead of per-project by @​slang25 in
thomhurst/TUnit#5259
* perf: disable GitVersion MSBuild task globally by @​thomhurst in
thomhurst/TUnit#5266
* fix: skip IResourceWithoutLifetime resources in Aspire fixture wait
logic by @​thomhurst in thomhurst/TUnit#5268
* fix: relax docs site Node.js engine constraint to >=24 by @​thomhurst
in thomhurst/TUnit#5269
* fix: catch unhandled exceptions in ExecuteRequestAsync to prevent IDE
RPC crashes by @​thomhurst in
thomhurst/TUnit#5271
* feat: register HTML report as MTP session artifact by @​thomhurst in
thomhurst/TUnit#5270
### Dependencies
* chore(deps): update tunit to 1.21.30 by @​thomhurst in
thomhurst/TUnit#5254
* chore(deps): update opentelemetry to 1.15.1 by @​thomhurst in
thomhurst/TUnit#5258
* chore(deps): bump node-forge from 1.3.1 to 1.4.0 in /docs by
@​dependabot[bot] in thomhurst/TUnit#5255
* chore(deps): bump picomatch from 2.3.1 to 2.3.2 in /docs by
@​dependabot[bot] in thomhurst/TUnit#5256
* chore(deps): update react by @​thomhurst in
thomhurst/TUnit#5261
* chore(deps): update node.js to >=18.20.8 by @​thomhurst in
thomhurst/TUnit#5262
* chore(deps): update node.js to v24 by @​thomhurst in
thomhurst/TUnit#5264


**Full Changelog**:
thomhurst/TUnit@v1.21.30...v1.22.0

Commits viewable in [compare
view](thomhurst/TUnit@v1.21.30...v1.23.7).
</details>

[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=TUnit&package-manager=nuget&previous-version=1.21.30&new-version=1.23.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
@DavidZidar DavidZidar deleted the use-results-directory branch March 30, 2026 16:07
github-actions bot pushed a commit to IntelliTect/CodingGuidelines that referenced this pull request Mar 30, 2026
Updated [TUnit.Core](https://github.com/thomhurst/TUnit) from 1.21.6 to
1.23.7.

<details>
<summary>Release notes</summary>

_Sourced from [TUnit.Core's
releases](https://github.com/thomhurst/TUnit/releases)._

## 1.23.7

<!-- Release notes generated using configuration in .github/release.yml
at v1.23.7 -->

## What's Changed
### Other Changes
* feat: use results directory provided by Microsoft Testing Platform in
HtmlReporter by @​DavidZidar in
thomhurst/TUnit#5294
* feat: add benchmarks for Imposter and Mockolate mocking frameworks by
@​vbreuss in thomhurst/TUnit#5295
* feat: add TUnit0080 analyzer for missing polyfill types by @​thomhurst
in thomhurst/TUnit#5292
* fix: respect user-set TUnitImplicitUsings from Directory.Build.props
by @​thomhurst in thomhurst/TUnit#5280
* perf: optimize TUnit.Mocks hot paths by @​thomhurst in
thomhurst/TUnit#5300
### Dependencies
* chore(deps): update tunit to 1.22.19 by @​thomhurst in
thomhurst/TUnit#5296

## New Contributors
* @​DavidZidar made their first contribution in
thomhurst/TUnit#5294

**Full Changelog**:
thomhurst/TUnit@v1.22.19...v1.23.7

## 1.22.19

<!-- Release notes generated using configuration in .github/release.yml
at v1.22.19 -->

## What's Changed
### Other Changes
* Add mock library benchmarks: TUnit.Mocks vs Moq, NSubstitute,
FakeItEasy by @​Copilot in thomhurst/TUnit#5284
* perf: lazily initialize optional MockEngine collections by @​thomhurst
in thomhurst/TUnit#5289
* Always emit TUnit.Mocks.Generated namespace from source generator by
@​Copilot in thomhurst/TUnit#5282
### Dependencies
* chore(deps): update tunit to 1.22.6 by @​thomhurst in
thomhurst/TUnit#5285


**Full Changelog**:
thomhurst/TUnit@v1.22.6...v1.22.19

## 1.22.6

<!-- Release notes generated using configuration in .github/release.yml
at v1.22.6 -->

## What's Changed
### Other Changes
* fix: use IComputeResource to filter waitable Aspire resources by
@​thomhurst in thomhurst/TUnit#5278
* fix: preserve StateBag when creating per-test TestBuilderContext by
@​thomhurst in thomhurst/TUnit#5279
### Dependencies
* chore(deps): update tunit to 1.22.3 by @​thomhurst in
thomhurst/TUnit#5275


**Full Changelog**:
thomhurst/TUnit@v1.22.3...v1.22.6

## 1.22.3

<!-- Release notes generated using configuration in .github/release.yml
at v1.22.3 -->

## What's Changed
### Other Changes
* fix: pass assembly version properties to dotnet pack by @​thomhurst in
thomhurst/TUnit#5274
### Dependencies
* chore(deps): update tunit to 1.22.0 by @​thomhurst in
thomhurst/TUnit#5272


**Full Changelog**:
thomhurst/TUnit@v1.22.0...v1.22.3

## 1.22.0

<!-- Release notes generated using configuration in .github/release.yml
at v1.22.0 -->

## What's Changed
### Other Changes
* perf: run GitVersion once in CI instead of per-project by @​slang25 in
thomhurst/TUnit#5259
* perf: disable GitVersion MSBuild task globally by @​thomhurst in
thomhurst/TUnit#5266
* fix: skip IResourceWithoutLifetime resources in Aspire fixture wait
logic by @​thomhurst in thomhurst/TUnit#5268
* fix: relax docs site Node.js engine constraint to >=24 by @​thomhurst
in thomhurst/TUnit#5269
* fix: catch unhandled exceptions in ExecuteRequestAsync to prevent IDE
RPC crashes by @​thomhurst in
thomhurst/TUnit#5271
* feat: register HTML report as MTP session artifact by @​thomhurst in
thomhurst/TUnit#5270
### Dependencies
* chore(deps): update tunit to 1.21.30 by @​thomhurst in
thomhurst/TUnit#5254
* chore(deps): update opentelemetry to 1.15.1 by @​thomhurst in
thomhurst/TUnit#5258
* chore(deps): bump node-forge from 1.3.1 to 1.4.0 in /docs by
@​dependabot[bot] in thomhurst/TUnit#5255
* chore(deps): bump picomatch from 2.3.1 to 2.3.2 in /docs by
@​dependabot[bot] in thomhurst/TUnit#5256
* chore(deps): update react by @​thomhurst in
thomhurst/TUnit#5261
* chore(deps): update node.js to >=18.20.8 by @​thomhurst in
thomhurst/TUnit#5262
* chore(deps): update node.js to v24 by @​thomhurst in
thomhurst/TUnit#5264


**Full Changelog**:
thomhurst/TUnit@v1.21.30...v1.22.0

## 1.21.30

<!-- Release notes generated using configuration in .github/release.yml
at v1.21.30 -->

## What's Changed
### Other Changes
* feat: add test discovery Activity span for tracing by @​thomhurst in
thomhurst/TUnit#5246
* Fix mock generator not preserving nullable annotations on reference
types by @​Copilot in thomhurst/TUnit#5251
* Fix ITestSkippedEventReceiver not firing for [Skip]-attributed tests
by @​thomhurst in thomhurst/TUnit#5253
* Use CallerArgumentExpression for TestDataRow by default. by @​m-gasser
in thomhurst/TUnit#5135
### Dependencies
* chore(deps): update tunit to 1.21.24 by @​thomhurst in
thomhurst/TUnit#5247


**Full Changelog**:
thomhurst/TUnit@v1.21.24...v1.21.30

## 1.21.24

<!-- Release notes generated using configuration in .github/release.yml
at v1.21.24 -->

## What's Changed
### Other Changes
* Fix OpenTelemetry missing root span by reordering session activity
lifecycle by @​Copilot in thomhurst/TUnit#5245
### Dependencies
* chore(deps): update tunit to 1.21.20 by @​thomhurst in
thomhurst/TUnit#5241
* chore(deps): update dependency stackexchange.redis to 2.12.8 by
@​thomhurst in thomhurst/TUnit#5243


**Full Changelog**:
thomhurst/TUnit@v1.21.20...v1.21.24

## 1.21.20

<!-- Release notes generated using configuration in .github/release.yml
at v1.21.20 -->

## What's Changed
### Other Changes
* fix: respect TUnitImplicitUsings set in Directory.Build.props by
@​thomhurst in thomhurst/TUnit#5225
* feat: covariant assertions for interfaces and non-sealed classes by
@​thomhurst in thomhurst/TUnit#5226
* feat: support string-to-parseable type conversions in [Arguments] by
@​thomhurst in thomhurst/TUnit#5227
* feat: add string length range assertions by @​thomhurst in
thomhurst/TUnit#4935
* Fix BeforeEvery/AfterEvery hooks for Class and Assembly not being
executed by @​Copilot in thomhurst/TUnit#5239
### Dependencies
* chore(deps): update tunit to 1.21.6 by @​thomhurst in
thomhurst/TUnit#5228
* chore(deps): update dependency gitversion.msbuild to 6.7.0 by
@​thomhurst in thomhurst/TUnit#5229
* chore(deps): update dependency gitversion.tool to v6.7.0 by
@​thomhurst in thomhurst/TUnit#5230
* chore(deps): update aspire to 13.2.0 - autoclosed by @​thomhurst in
thomhurst/TUnit#5232
* chore(deps): update dependency typescript to v6 by @​thomhurst in
thomhurst/TUnit#5233
* chore(deps): update dependency polyfill to 9.23.0 by @​thomhurst in
thomhurst/TUnit#5235
* chore(deps): update dependency polyfill to 9.23.0 by @​thomhurst in
thomhurst/TUnit#5236


**Full Changelog**:
thomhurst/TUnit@v1.21.6...v1.21.20

Commits viewable in [compare
view](thomhurst/TUnit@v1.21.6...v1.23.7).
</details>

[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=TUnit.Core&package-manager=nuget&previous-version=1.21.6&new-version=1.23.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: Save HTML report in expected test results directory

2 participants