From ed1e896884917a6e8b2a80401ebb4b33248ad832 Mon Sep 17 00:00:00 2001 From: Brad Wilson Date: Sun, 28 Sep 2025 20:41:53 -0700 Subject: [PATCH 01/24] Bump up to 3.1.6-pre --- version.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.json b/version.json index 6fea7d9..212ed38 100644 --- a/version.json +++ b/version.json @@ -1,6 +1,6 @@ { "$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json", - "version": "3.1.5", + "version": "3.1.6-pre.{height}", "nuGetPackageVersion": { "semVer": 2.0 }, From 3a5ebe7ff466e7b55cd93a04bc6428d758f7c17d Mon Sep 17 00:00:00 2001 From: Brad Wilson Date: Sun, 28 Sep 2025 20:45:46 -0700 Subject: [PATCH 02/24] Move Azure Login closer to signing, and collect MSBuild binlogs --- .github/workflows/ci-signed.yaml | 15 +++++++++++++-- tools/builder/common | 2 +- tools/builder/targets/Build.cs | 5 ++++- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci-signed.yaml b/.github/workflows/ci-signed.yaml index 656bc36..0d992bc 100644 --- a/.github/workflows/ci-signed.yaml +++ b/.github/workflows/ci-signed.yaml @@ -36,6 +36,9 @@ jobs: - name: Get .NET information run: dotnet --info + - name: "Build target: BuildAll" + run: dotnet run --project tools/builder --no-launch-profile -- BuildAll --timing + - name: Login to Azure CLI uses: azure/login@v2 with: @@ -43,7 +46,7 @@ jobs: tenant-id: ${{ vars.KEYVAULT_TENANT_ID }} subscription-id: ${{ vars.KEYVAULT_SUBSCRIPTION_ID }} - - name: "Build target: BuildAll & PublishPackages" + - name: "Build target: PublishPackages" env: PUSH_APIKEY: ${{ secrets.FEEDZ_PUSH_KEY }} PUSH_URI: ${{ vars.FEEDZ_PUSH_URL }} @@ -51,7 +54,15 @@ jobs: SIGN_CERT_NAME: ${{ vars.KEYVAULT_CERT_NAME }} SIGN_TIMESTAMP_URI: ${{ vars.KEYVAULT_TIMESTAMP_URL }} SIGN_VAULT_URI: ${{ vars.KEYVAULT_URL }} - run: dotnet run --project tools/builder --no-launch-profile -- BuildAll PublishPackages --timing + run: dotnet run --project tools/builder --no-launch-profile -- PublishPackages --timing + + - name: "Upload artifact: build" + uses: actions/upload-artifact@v4 + with: + name: build + path: artifacts/build + compression-level: 9 + if: always() - name: "Upload artifact: test" uses: actions/upload-artifact@v4 diff --git a/tools/builder/common b/tools/builder/common index 25fb006..cf9de4b 160000 --- a/tools/builder/common +++ b/tools/builder/common @@ -1 +1 @@ -Subproject commit 25fb0069dae1bd435470880d9a0ae3686bd04227 +Subproject commit cf9de4ba75d558070499d4c83e7f3d6348dfcda2 diff --git a/tools/builder/targets/Build.cs b/tools/builder/targets/Build.cs index 376f91c..1936d72 100644 --- a/tools/builder/targets/Build.cs +++ b/tools/builder/targets/Build.cs @@ -1,3 +1,4 @@ +using System.IO; using System.Threading.Tasks; using Xunit.BuildTools.Models; @@ -9,6 +10,8 @@ public static partial Task PerformBuild(BuildContext context) { context.BuildStep("Compiling binaries"); - return context.Exec("dotnet", $"msbuild -nologo -maxCpuCount -restore:False -verbosity:{context.Verbosity} -p:Configuration={context.ConfigurationText} -p:PackageOutputPath={context.PackageOutputFolder}"); + var buildLog = Path.Combine(context.BuildArtifactsFolder, "build.binlog"); + + return context.Exec("dotnet", $"msbuild -nologo -maxCpuCount -restore:False -verbosity:{context.Verbosity} -property:Configuration={context.ConfigurationText} -p:PackageOutputPath={context.PackageOutputFolder} -binaryLogger:{buildLog}"); } } From 553e0a921575aec259d18669df1e3e29126dcdca Mon Sep 17 00:00:00 2001 From: Brad Wilson Date: Thu, 13 Nov 2025 17:23:36 -0800 Subject: [PATCH 03/24] Update to .NET 10 SDK --- .github/workflows/ci-signed.yaml | 2 +- .github/workflows/ci-unsigned.yaml | 2 +- .github/workflows/pull-request.yaml | 2 +- Versions.props | 6 +++--- global.json | 2 +- tools/builder/build.csproj | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/ci-signed.yaml b/.github/workflows/ci-signed.yaml index 0d992bc..cac3cc8 100644 --- a/.github/workflows/ci-signed.yaml +++ b/.github/workflows/ci-signed.yaml @@ -31,7 +31,7 @@ jobs: with: dotnet-version: | 8.0.x - 9.0.x + 10.0.x - name: Get .NET information run: dotnet --info diff --git a/.github/workflows/ci-unsigned.yaml b/.github/workflows/ci-unsigned.yaml index aa7f4c0..7ee8dcd 100644 --- a/.github/workflows/ci-unsigned.yaml +++ b/.github/workflows/ci-unsigned.yaml @@ -28,7 +28,7 @@ jobs: with: dotnet-version: | 8.0.x - 9.0.x + 10.0.x - name: Get .NET information run: dotnet --info diff --git a/.github/workflows/pull-request.yaml b/.github/workflows/pull-request.yaml index d4d85fd..f13a765 100644 --- a/.github/workflows/pull-request.yaml +++ b/.github/workflows/pull-request.yaml @@ -25,7 +25,7 @@ jobs: with: dotnet-version: | 8.0.x - 9.0.x + 10.0.x - name: Get .NET information run: dotnet --info diff --git a/Versions.props b/Versions.props index 4603171..4731d38 100644 --- a/Versions.props +++ b/Versions.props @@ -7,11 +7,11 @@ 17.13.0 8.0.0 $(Microsoft_NET_Test_Sdk_Version) - 3.8.118 + 3.9.50 5.3.0 1.0.0-alpha.160 - 1.24.0 - 3.1.0 + 1.26.0-pre.4 + 3.2.1-pre.5 2.9.3 diff --git a/global.json b/global.json index 2bc13e8..1e7fdfa 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "9.0.100", + "version": "10.0.100", "rollForward": "latestMinor" } } diff --git a/tools/builder/build.csproj b/tools/builder/build.csproj index cdcbd22..b525af4 100644 --- a/tools/builder/build.csproj +++ b/tools/builder/build.csproj @@ -3,7 +3,7 @@ enable Exe - net9.0 + net10.0 true @@ -12,7 +12,7 @@ - + From 2c5fa922a13de5b8d21afeb1c93c52bd4e3188e6 Mon Sep 17 00:00:00 2001 From: Brad Wilson Date: Thu, 20 Nov 2025 08:16:55 -0800 Subject: [PATCH 04/24] Bump to LangVersion 14 --- src/Directory.Build.props | 2 +- test/Directory.Build.props | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 4452be7..272d290 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -4,7 +4,7 @@ embedded true - 12.0 + 14.0 false enable diff --git a/test/Directory.Build.props b/test/Directory.Build.props index ecbe8a3..89f005f 100644 --- a/test/Directory.Build.props +++ b/test/Directory.Build.props @@ -7,7 +7,7 @@ true false - 12.0 + 14.0 $(MSBuildProjectName) 99.99.99-dev true From 10dad85dc7af1ef551e148b394747fec106b6ce3 Mon Sep 17 00:00:00 2001 From: Brad Wilson Date: Thu, 27 Nov 2025 13:05:18 -0800 Subject: [PATCH 05/24] Rely on the default logger to log fatal error messages --- src/xunit.runner.visualstudio/Sinks/VsExecutionSink.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/xunit.runner.visualstudio/Sinks/VsExecutionSink.cs b/src/xunit.runner.visualstudio/Sinks/VsExecutionSink.cs index 4ca62a5..51f2d00 100644 --- a/src/xunit.runner.visualstudio/Sinks/VsExecutionSink.cs +++ b/src/xunit.runner.visualstudio/Sinks/VsExecutionSink.cs @@ -122,8 +122,6 @@ void HandleErrorMessage(MessageHandlerArgs args) { ExecutionSummary.Errors++; - logger.LogError("Catastrophic failure: {0}", ExceptionUtility.CombineMessages(args.Message)); - HandleCancellation(args); } From d693866207d8c1b3269d1b7f4f62211b82ba7835 Mon Sep 17 00:00:00 2001 From: Brad Wilson Date: Mon, 8 Dec 2025 19:22:29 -0800 Subject: [PATCH 06/24] Create FUNDING.yml --- .github/FUNDING.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..0a99d30 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: xunit From 5e58b6a8138b54d651d4b495e8e048f9faaa0096 Mon Sep 17 00:00:00 2001 From: Brad Wilson Date: Wed, 14 Jan 2026 10:06:02 -0800 Subject: [PATCH 07/24] Remove unnecessary MSBuild requirement on Windows --- .github/workflows/ci-signed.yaml | 3 --- .github/workflows/ci-unsigned.yaml | 3 --- .github/workflows/pull-request.yaml | 3 --- build | 4 +--- build.ps1 | 4 ---- 5 files changed, 1 insertion(+), 16 deletions(-) diff --git a/.github/workflows/ci-signed.yaml b/.github/workflows/ci-signed.yaml index cac3cc8..f7ff856 100644 --- a/.github/workflows/ci-signed.yaml +++ b/.github/workflows/ci-signed.yaml @@ -23,9 +23,6 @@ jobs: fetch-depth: 0 submodules: true - - name: Add MSBuild to PATH - uses: microsoft/setup-msbuild@v2 - - name: Install .NET SDK uses: actions/setup-dotnet@v4 with: diff --git a/.github/workflows/ci-unsigned.yaml b/.github/workflows/ci-unsigned.yaml index 7ee8dcd..24f69c6 100644 --- a/.github/workflows/ci-unsigned.yaml +++ b/.github/workflows/ci-unsigned.yaml @@ -20,9 +20,6 @@ jobs: fetch-depth: 0 submodules: true - - name: Add MSBuild to PATH - uses: microsoft/setup-msbuild@v2 - - name: Install .NET SDK uses: actions/setup-dotnet@v4 with: diff --git a/.github/workflows/pull-request.yaml b/.github/workflows/pull-request.yaml index f13a765..1e54a3a 100644 --- a/.github/workflows/pull-request.yaml +++ b/.github/workflows/pull-request.yaml @@ -17,9 +17,6 @@ jobs: fetch-depth: 0 submodules: true - - name: Add MSBuild to PATH - uses: microsoft/setup-msbuild@v2 - - name: Install .NET SDK uses: actions/setup-dotnet@v4 with: diff --git a/build b/build index 0023587..8e68c66 100755 --- a/build +++ b/build @@ -13,9 +13,7 @@ function guard_bin { guard_bin git "please install the Git CLI from https://git-scm.com/" guard_bin dotnet "please install the .NET SDK from https://dot.net/" -if [ `uname -o` = Msys ]; then - guard_bin msbuild.exe "please run this from a Visual Studio developer shell" -else +if [ `uname -o` != Msys ]; then guard_bin mono "please install Mono from https://www.mono-project.com/" fi diff --git a/build.ps1 b/build.ps1 index f3f8e6a..fb3b4d6 100644 --- a/build.ps1 +++ b/build.ps1 @@ -25,10 +25,6 @@ if ($version.Major -lt 9) { throw ".NET SDK version ($version) is too low; please install version 9.0 or later" } -if ($null -eq (Get-Command "msbuild.exe" -ErrorAction Ignore)) { - throw "Could not find 'msbuild.exe'; please run this from a Visual Studio developer shell" -} - Push-Location (Split-Path $MyInvocation.MyCommand.Definition) try { From 44f3f2a03f9190ccd53e80e55c3300ceaabaca81 Mon Sep 17 00:00:00 2001 From: Brad Wilson Date: Wed, 14 Jan 2026 14:44:57 -0800 Subject: [PATCH 08/24] Latest dependencies --- Versions.props | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Versions.props b/Versions.props index 4731d38..04ca515 100644 --- a/Versions.props +++ b/Versions.props @@ -5,13 +5,13 @@ 9.0.7 1.0.3 17.13.0 - 8.0.0 + 10.0.102 $(Microsoft_NET_Test_Sdk_Version) 3.9.50 5.3.0 1.0.0-alpha.160 - 1.26.0-pre.4 - 3.2.1-pre.5 + 1.27.0 + [3.2.2, 3.99.0) 2.9.3 From 033cf4c2e75aa859eef21d71e0b68545a9df0b10 Mon Sep 17 00:00:00 2001 From: Brad Wilson Date: Wed, 14 Jan 2026 14:45:33 -0800 Subject: [PATCH 09/24] Updated shields.io links --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 16083c5..247f778 100644 --- a/README.md +++ b/README.md @@ -19,12 +19,12 @@ For project documentation, please visit the [xUnit.net project home](https://xun ## Latest Builds -| | Latest stable | Latest CI ([how to use](https://xunit.net/docs/using-ci-builds)) | Build status -| --------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------ -| `xunit.v3` | [![](https://img.shields.io/nuget/v/xunit.v3.svg?logo=nuget)](https://www.nuget.org/packages/xunit.v3) | [![](https://img.shields.io/badge/endpoint.svg?url=https://f.feedz.io/xunit/xunit/shield/xunit.v3/latest&color=f58142)](https://feedz.io/org/xunit/repository/xunit/packages/xunit.v3) | [![](https://img.shields.io/endpoint.svg?url=https://actions-badge.atrox.dev/xunit/xunit/badge%3Fref%3Dmain&label=build)](https://actions-badge.atrox.dev/xunit/xunit/goto?ref=main) -| `xunit` | [![](https://img.shields.io/nuget/v/xunit.svg?logo=nuget)](https://www.nuget.org/packages/xunit) | [![](https://img.shields.io/badge/endpoint.svg?url=https://f.feedz.io/xunit/xunit/shield/xunit/latest&color=f58142)](https://feedz.io/org/xunit/repository/xunit/packages/xunit) | [![](https://img.shields.io/endpoint.svg?url=https://actions-badge.atrox.dev/xunit/xunit/badge%3Fref%3Dv2&label=build)](https://actions-badge.atrox.dev/xunit/xunit/goto?ref=v2) -| `xunit.analyzers` | [![](https://img.shields.io/nuget/v/xunit.analyzers.svg?logo=nuget)](https://www.nuget.org/packages/xunit.analyzers) | [![](https://img.shields.io/badge/endpoint.svg?url=https://f.feedz.io/xunit/xunit/shield/xunit.analyzers/latest&color=f58142)](https://feedz.io/org/xunit/repository/xunit/packages/xunit.analyzers) | [![](https://img.shields.io/endpoint.svg?url=https://actions-badge.atrox.dev/xunit/xunit.analyzers/badge%3Fref%3Dmain&label=build)](https://actions-badge.atrox.dev/xunit/xunit.analyzers/goto?ref=main) -| `xunit.runner.visualstudio` | [![](https://img.shields.io/nuget/v/xunit.runner.visualstudio.svg?logo=nuget)](https://www.nuget.org/packages/xunit.runner.visualstudio) | [![](https://img.shields.io/badge/endpoint.svg?url=https://f.feedz.io/xunit/xunit/shield/xunit.runner.visualstudio/latest&color=f58142)](https://feedz.io/org/xunit/repository/xunit/packages/xunit.runner.visualstudio) | [![](https://img.shields.io/endpoint.svg?url=https://actions-badge.atrox.dev/xunit/visualstudio.xunit/badge%3Fref%3Dmain&label=build)](https://actions-badge.atrox.dev/xunit/visualstudio.xunit/goto?ref=main) +| | Latest stable | Latest CI ([how to use](https://xunit.net/docs/using-ci-builds)) | Build status +| --------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ +| `xunit.v3` | [![](https://img.shields.io/nuget/v/xunit.v3.svg?logo=nuget)](https://www.nuget.org/packages/xunit.v3) | [![](https://img.shields.io/feedz/vpre/xunit/xunit/xunit.v3?logo=nuget&color=f58142)](https://feedz.io/org/xunit/repository/xunit/packages/xunit.v3) | [![](https://img.shields.io/endpoint.svg?url=https://actions-badge.atrox.dev/xunit/xunit/badge%3Fref%3Dmain&label=build)](https://actions-badge.atrox.dev/xunit/xunit/goto?ref=main) +| `xunit` | [![](https://img.shields.io/nuget/v/xunit.svg?logo=nuget)](https://www.nuget.org/packages/xunit) | [![](https://img.shields.io/feedz/vpre/xunit/xunit/xunit?logo=nuget&color=f58142)](https://feedz.io/org/xunit/repository/xunit/packages/xunit) | [![](https://img.shields.io/endpoint.svg?url=https://actions-badge.atrox.dev/xunit/xunit/badge%3Fref%3Dv2&label=build)](https://actions-badge.atrox.dev/xunit/xunit/goto?ref=v2) +| `xunit.analyzers` | [![](https://img.shields.io/nuget/v/xunit.analyzers.svg?logo=nuget)](https://www.nuget.org/packages/xunit.analyzers) | [![](https://img.shields.io/feedz/vpre/xunit/xunit/xunit.analyzers?logo=nuget&color=f58142)](https://feedz.io/org/xunit/repository/xunit/packages/xunit.analyzers) | [![](https://img.shields.io/endpoint.svg?url=https://actions-badge.atrox.dev/xunit/xunit.analyzers/badge%3Fref%3Dmain&label=build)](https://actions-badge.atrox.dev/xunit/xunit.analyzers/goto?ref=main) +| `xunit.runner.visualstudio` | [![](https://img.shields.io/nuget/v/xunit.runner.visualstudio.svg?logo=nuget)](https://www.nuget.org/packages/xunit.runner.visualstudio) | [![](https://img.shields.io/feedz/vpre/xunit/xunit/xunit.runner.visualstudio?logo=nuget&color=f58142)](https://feedz.io/org/xunit/repository/xunit/packages/xunit.runner.visualstudio) | [![](https://img.shields.io/endpoint.svg?url=https://actions-badge.atrox.dev/xunit/visualstudio.xunit/badge%3Fref%3Dmain&label=build)](https://actions-badge.atrox.dev/xunit/visualstudio.xunit/goto?ref=main) *For complete CI package lists, please visit the [feedz.io package search](https://feedz.io/org/xunit/repository/xunit/search). A free login is required.* From b4fced24209c1d8de0e8fe8e00e7d2e447576712 Mon Sep 17 00:00:00 2001 From: Brad Wilson Date: Wed, 14 Jan 2026 14:57:30 -0800 Subject: [PATCH 10/24] Latest build tools --- tools/builder/common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/builder/common b/tools/builder/common index cf9de4b..9f62fa4 160000 --- a/tools/builder/common +++ b/tools/builder/common @@ -1 +1 @@ -Subproject commit cf9de4ba75d558070499d4c83e7f3d6348dfcda2 +Subproject commit 9f62fa49d36d2f36502b44942458078880ccdfb4 From 401331a85d433acbc69623c72339cbbe72b22fb1 Mon Sep 17 00:00:00 2001 From: Brad Wilson Date: Tue, 20 Jan 2026 10:49:20 -0800 Subject: [PATCH 11/24] Update shields.io badges to properly show pre-release versions --- README.md | 12 ++++++------ tools/builder/common | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 247f778..c29a1e1 100644 --- a/README.md +++ b/README.md @@ -19,12 +19,12 @@ For project documentation, please visit the [xUnit.net project home](https://xun ## Latest Builds -| | Latest stable | Latest CI ([how to use](https://xunit.net/docs/using-ci-builds)) | Build status -| --------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ -| `xunit.v3` | [![](https://img.shields.io/nuget/v/xunit.v3.svg?logo=nuget)](https://www.nuget.org/packages/xunit.v3) | [![](https://img.shields.io/feedz/vpre/xunit/xunit/xunit.v3?logo=nuget&color=f58142)](https://feedz.io/org/xunit/repository/xunit/packages/xunit.v3) | [![](https://img.shields.io/endpoint.svg?url=https://actions-badge.atrox.dev/xunit/xunit/badge%3Fref%3Dmain&label=build)](https://actions-badge.atrox.dev/xunit/xunit/goto?ref=main) -| `xunit` | [![](https://img.shields.io/nuget/v/xunit.svg?logo=nuget)](https://www.nuget.org/packages/xunit) | [![](https://img.shields.io/feedz/vpre/xunit/xunit/xunit?logo=nuget&color=f58142)](https://feedz.io/org/xunit/repository/xunit/packages/xunit) | [![](https://img.shields.io/endpoint.svg?url=https://actions-badge.atrox.dev/xunit/xunit/badge%3Fref%3Dv2&label=build)](https://actions-badge.atrox.dev/xunit/xunit/goto?ref=v2) -| `xunit.analyzers` | [![](https://img.shields.io/nuget/v/xunit.analyzers.svg?logo=nuget)](https://www.nuget.org/packages/xunit.analyzers) | [![](https://img.shields.io/feedz/vpre/xunit/xunit/xunit.analyzers?logo=nuget&color=f58142)](https://feedz.io/org/xunit/repository/xunit/packages/xunit.analyzers) | [![](https://img.shields.io/endpoint.svg?url=https://actions-badge.atrox.dev/xunit/xunit.analyzers/badge%3Fref%3Dmain&label=build)](https://actions-badge.atrox.dev/xunit/xunit.analyzers/goto?ref=main) -| `xunit.runner.visualstudio` | [![](https://img.shields.io/nuget/v/xunit.runner.visualstudio.svg?logo=nuget)](https://www.nuget.org/packages/xunit.runner.visualstudio) | [![](https://img.shields.io/feedz/vpre/xunit/xunit/xunit.runner.visualstudio?logo=nuget&color=f58142)](https://feedz.io/org/xunit/repository/xunit/packages/xunit.runner.visualstudio) | [![](https://img.shields.io/endpoint.svg?url=https://actions-badge.atrox.dev/xunit/visualstudio.xunit/badge%3Fref%3Dmain&label=build)](https://actions-badge.atrox.dev/xunit/visualstudio.xunit/goto?ref=main) +| | Latest stable | Latest CI ([how to use](https://xunit.net/docs/using-ci-builds)) | Build status +| --------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ +| `xunit.v3` | [![](https://img.shields.io/nuget/v/xunit.v3.svg?logo=nuget)](https://www.nuget.org/packages/xunit.v3) | [![](https://img.shields.io/endpoint.svg?url=https://f.feedz.io/xunit/xunit/shield/xunit.v3/latest&logo=nuget&color=f58142)](https://feedz.io/org/xunit/repository/xunit/packages/xunit.v3) | [![](https://img.shields.io/endpoint.svg?url=https://actions-badge.atrox.dev/xunit/xunit/badge%3Fref%3Dmain&label=build)](https://actions-badge.atrox.dev/xunit/xunit/goto?ref=main) +| `xunit` | [![](https://img.shields.io/nuget/v/xunit.svg?logo=nuget)](https://www.nuget.org/packages/xunit) | [![](https://img.shields.io/endpoint.svg?url=https://f.feedz.io/xunit/xunit/shield/xunit/latest&logo=nuget&color=f58142)](https://feedz.io/org/xunit/repository/xunit/packages/xunit) | [![](https://img.shields.io/endpoint.svg?url=https://actions-badge.atrox.dev/xunit/xunit/badge%3Fref%3Dv2&label=build)](https://actions-badge.atrox.dev/xunit/xunit/goto?ref=v2) +| `xunit.analyzers` | [![](https://img.shields.io/nuget/v/xunit.analyzers.svg?logo=nuget)](https://www.nuget.org/packages/xunit.analyzers) | [![](https://img.shields.io/endpoint.svg?url=https://f.feedz.io/xunit/xunit/shield/xunit.analyzers/latest&logo=nuget&color=f58142)](https://feedz.io/org/xunit/repository/xunit/packages/xunit.analyzers) | [![](https://img.shields.io/endpoint.svg?url=https://actions-badge.atrox.dev/xunit/xunit.analyzers/badge%3Fref%3Dmain&label=build)](https://actions-badge.atrox.dev/xunit/xunit.analyzers/goto?ref=main) +| `xunit.runner.visualstudio` | [![](https://img.shields.io/nuget/v/xunit.runner.visualstudio.svg?logo=nuget)](https://www.nuget.org/packages/xunit.runner.visualstudio) | [![](https://img.shields.io/endpoint.svg?url=https://f.feedz.io/xunit/xunit/shield/xunit.runner.visualstudio/latest&logo=nuget&color=f58142)](https://feedz.io/org/xunit/repository/xunit/packages/xunit.runner.visualstudio) | [![](https://img.shields.io/endpoint.svg?url=https://actions-badge.atrox.dev/xunit/visualstudio.xunit/badge%3Fref%3Dmain&label=build)](https://actions-badge.atrox.dev/xunit/visualstudio.xunit/goto?ref=main) *For complete CI package lists, please visit the [feedz.io package search](https://feedz.io/org/xunit/repository/xunit/search). A free login is required.* diff --git a/tools/builder/common b/tools/builder/common index 9f62fa4..7b87ff4 160000 --- a/tools/builder/common +++ b/tools/builder/common @@ -1 +1 @@ -Subproject commit 9f62fa49d36d2f36502b44942458078880ccdfb4 +Subproject commit 7b87ff462a7dd058e777d87ba8121f9bfe97e5de From 1bdf8b8db2cb8f8300aa5ca5dfc69af8faff4c2e Mon Sep 17 00:00:00 2001 From: Brad Wilson Date: Fri, 13 Mar 2026 09:48:26 -0700 Subject: [PATCH 12/24] Bump up to 4.0.0-pre --- version.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.json b/version.json index 212ed38..f471020 100644 --- a/version.json +++ b/version.json @@ -1,6 +1,6 @@ { "$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json", - "version": "3.1.6-pre.{height}", + "version": "4.0.0-pre.{height}", "nuGetPackageVersion": { "semVer": 2.0 }, From dec1a5357c555fb62fea779b98ef2b1ebaf323b8 Mon Sep 17 00:00:00 2001 From: Brad Wilson Date: Fri, 13 Mar 2026 10:51:13 -0700 Subject: [PATCH 13/24] Add support for Native AOT --- Versions.props | 2 +- src/xunit.runner.visualstudio/VsTestRunner.cs | 30 +++++--- test/test.v3.aot/Tests.cs | 13 ++++ test/test.v3.aot/test.v3.aot.csproj | 24 ++++++ test/test.v3/test.v3.csproj | 2 +- .../test.xunit.runner.visualstudio.csproj | 2 +- tools/builder/targets/TestCore.cs | 1 + visualstudio.xunit.sln | 76 ------------------- visualstudio.xunit.slnx | 34 +++++++++ 9 files changed, 95 insertions(+), 89 deletions(-) create mode 100644 test/test.v3.aot/Tests.cs create mode 100644 test/test.v3.aot/test.v3.aot.csproj delete mode 100644 visualstudio.xunit.sln create mode 100644 visualstudio.xunit.slnx diff --git a/Versions.props b/Versions.props index 04ca515..b75f73a 100644 --- a/Versions.props +++ b/Versions.props @@ -11,7 +11,7 @@ 5.3.0 1.0.0-alpha.160 1.27.0 - [3.2.2, 3.99.0) + [4.0.0-pre.25,4.99.99] 2.9.3 diff --git a/src/xunit.runner.visualstudio/VsTestRunner.cs b/src/xunit.runner.visualstudio/VsTestRunner.cs index 415b984..22374f5 100644 --- a/src/xunit.runner.visualstudio/VsTestRunner.cs +++ b/src/xunit.runner.visualstudio/VsTestRunner.cs @@ -311,7 +311,7 @@ async Task DiscoverTestsInAssembly( internal static IReadOnlyList GetAvailableRunnerReporters(LoggerHelper? logger) { - var result = RegisteredRunnerReporters.Get(typeof(VsTestRunner).Assembly, out var messages); + var result = RegisteredRunnerConfig.GetRunnerReporters(typeof(VsTestRunner).Assembly, out var messages); if (logger is not null) foreach (var message in messages) @@ -519,6 +519,7 @@ async Task RunTestsInAssembly( return; var testCasesMap = new ConcurrentDictionary(); + var testCaseUniqueIDs = new ConcurrentBag(); var testCaseSerializations = new ConcurrentBag(); if (runInfo.TestCases is null || runInfo.TestCases.Count == 0) { @@ -557,12 +558,16 @@ await DiscoverTestsInAssembly( foreach (var filteredTestCase in filteredTestCases) { var uniqueID = filteredTestCase.UniqueID; - if (string.IsNullOrEmpty(filteredTestCase.TestCase.Serialization)) - logger.LogWarningWithSource(assemblyFileName, "Skipping test case '{0}' (ID '{1}') without serialization", filteredTestCase.TestCase.TestCaseDisplayName, filteredTestCase.TestCase.TestCaseUniqueID); - else if (filteredTestCase.VSTestCase is not null) + var serialization = filteredTestCase.TestCase.Serialization; + + if (filteredTestCase.VSTestCase is not null) { if (testCasesMap.TryAdd(uniqueID, filteredTestCase.VSTestCase)) - testCaseSerializations.Add(filteredTestCase.TestCase.Serialization); + { + testCaseUniqueIDs.Add(uniqueID); + if (serialization is not null) + testCaseSerializations.Add(serialization); + } else logger.LogWarningWithSource(assemblyFileName, "Skipping test case with duplicate ID '{0}' ('{1}' and '{2}')", uniqueID, testCasesMap[uniqueID].DisplayName, filteredTestCase.VSTestCase?.DisplayName); } @@ -580,12 +585,14 @@ await DiscoverTestsInAssembly( if (uniqueID is null) logger.LogWarningWithSource(assemblyFileName, "VSTestCase {0} did not have an associated unique ID", testCase.DisplayName); - else if (string.IsNullOrEmpty(serialization)) - logger.LogWarningWithSource(assemblyFileName, "Skipping test case '{0}' (ID '{1}') without serialization", testCase.DisplayName, uniqueID); else { if (testCasesMap.TryAdd(uniqueID, testCase)) - testCaseSerializations.Add(serialization); + { + testCaseUniqueIDs.Add(uniqueID); + if (serialization is not null) + testCaseSerializations.Add(serialization); + } else logger.LogWarningWithSource(assemblyFileName, "Skipping test case with duplicate ID '{0}' ('{1}' and '{2}')", uniqueID, testCasesMap[uniqueID].DisplayName, testCase.DisplayName); } @@ -593,7 +600,7 @@ await DiscoverTestsInAssembly( } // https://github.com/xunit/visualstudio.xunit/issues/417 - if (testCaseSerializations.IsEmpty) + if (testCaseUniqueIDs.IsEmpty) { if (configuration.InternalDiagnosticMessagesOrDefault) logger.LogWarning("Skipping '{0}': no tests passed the filter", assemblyFileName); @@ -622,7 +629,10 @@ await DiscoverTestsInAssembly( bool shadowCopy = configuration.ShadowCopyOrDefault; var resultsSink = new ExecutionSink(runInfo.Assembly, discoveryOptions, executionOptions, appDomainOption, shadowCopy, vsExecutionSink, executionSinkOptions); - var frontControllerSettings = new FrontControllerRunSettings(executionOptions, testCaseSerializations); + var frontControllerSettings = + testCaseSerializations.IsEmpty + ? FrontControllerRunSettings.WithTestCaseIDs(executionOptions, testCaseUniqueIDs) + : FrontControllerRunSettings.WithSerializedTestCases(executionOptions, testCaseSerializations); if (testProcessLauncher is not null) frontControllerSettings.LaunchOptions.WaitForDebugger = true; diff --git a/test/test.v3.aot/Tests.cs b/test/test.v3.aot/Tests.cs new file mode 100644 index 0000000..ec94f7d --- /dev/null +++ b/test/test.v3.aot/Tests.cs @@ -0,0 +1,13 @@ +using Xunit; + +public class Tests +{ + [Fact] + public void Passing() { } + + [Fact(Skip = "Unconditionally skipped")] + public void Skipped() => Assert.Fail("This does not run"); + + [Fact(Explicit = true)] + public void Explicit() => Assert.Fail("This only runs explicitly."); +} diff --git a/test/test.v3.aot/test.v3.aot.csproj b/test/test.v3.aot/test.v3.aot.csproj new file mode 100644 index 0000000..2020729 --- /dev/null +++ b/test/test.v3.aot/test.v3.aot.csproj @@ -0,0 +1,24 @@ + + + + Exe + net10.0 + + + + + + + + + + + <_RunnerAssemblies Include="$(MSBuildThisFileDirectory)..\..\src\xunit.runner.visualstudio\bin\$(Configuration)\net8.0\*.dll" /> + + + + + diff --git a/test/test.v3/test.v3.csproj b/test/test.v3/test.v3.csproj index 7c315e0..d4acdc7 100644 --- a/test/test.v3/test.v3.csproj +++ b/test/test.v3/test.v3.csproj @@ -7,7 +7,7 @@ - + diff --git a/test/test.xunit.runner.visualstudio/test.xunit.runner.visualstudio.csproj b/test/test.xunit.runner.visualstudio/test.xunit.runner.visualstudio.csproj index fe98c2f..f27d152 100644 --- a/test/test.xunit.runner.visualstudio/test.xunit.runner.visualstudio.csproj +++ b/test/test.xunit.runner.visualstudio/test.xunit.runner.visualstudio.csproj @@ -10,7 +10,7 @@ - + diff --git a/tools/builder/targets/TestCore.cs b/tools/builder/targets/TestCore.cs index 7f29c1f..839118c 100644 --- a/tools/builder/targets/TestCore.cs +++ b/tools/builder/targets/TestCore.cs @@ -26,6 +26,7 @@ public static async Task OnExecute(BuildContext context) context.BuildStep("Running .NET VSTest integration tests"); await context.Exec("dotnet", $"test test/test.v3 -tl:off --configuration {context.Configuration} --no-build --framework net8.0 --verbosity {context.Verbosity}"); + await context.Exec("dotnet", $"test test/test.v3.aot -tl:off --configuration {context.Configuration} --no-build --framework net10.0 --verbosity {context.Verbosity}"); await context.Exec("dotnet", $"test test/test.v2 -tl:off --configuration {context.Configuration} --no-build --framework net8.0 --verbosity {context.Verbosity}"); } } diff --git a/visualstudio.xunit.sln b/visualstudio.xunit.sln deleted file mode 100644 index b38a5f0..0000000 --- a/visualstudio.xunit.sln +++ /dev/null @@ -1,76 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.2.32207.482 -MinimumVisualStudioVersion = 15.0.26228.4 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{BA799592-92C2-40AD-9FB2-623E94A427F3}" - ProjectSection(SolutionItems) = preProject - src\Directory.Build.props = src\Directory.Build.props - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{88AA0DC3-2723-4E7D-A89E-A977F319B3AA}" - ProjectSection(SolutionItems) = preProject - test\Directory.Build.props = test\Directory.Build.props - test\Directory.Build.targets = test\Directory.Build.targets - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "xunit.runner.visualstudio", "src\xunit.runner.visualstudio\xunit.runner.visualstudio.csproj", "{6FBF46BB-C136-4587-B121-0B7F1DB02A18}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "test.xunit.runner.visualstudio", "test\test.xunit.runner.visualstudio\test.xunit.runner.visualstudio.csproj", "{24D04B23-4E06-4214-89EB-96BF5EAA1C72}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "meta", "meta", "{A8EAFB53-8C80-4FD4-AE90-09DD6606D6CB}" - ProjectSection(SolutionItems) = preProject - .editorconfig = .editorconfig - BUILDING.md = BUILDING.md - NuGet.Config = NuGet.Config - README.md = README.md - version.json = version.json - Versions.props = Versions.props - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "test.v1", "test\test.v1\test.v1.csproj", "{EF484F76-7526-4C07-A2DF-DD11424FC353}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "test.v2", "test\test.v2\test.v2.csproj", "{33554997-4FF6-4B10-BC98-DB0F26146289}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "test.v3", "test\test.v3\test.v3.csproj", "{A035E990-78D7-4132-8E36-5DBD5137E063}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {6FBF46BB-C136-4587-B121-0B7F1DB02A18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6FBF46BB-C136-4587-B121-0B7F1DB02A18}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6FBF46BB-C136-4587-B121-0B7F1DB02A18}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6FBF46BB-C136-4587-B121-0B7F1DB02A18}.Release|Any CPU.Build.0 = Release|Any CPU - {24D04B23-4E06-4214-89EB-96BF5EAA1C72}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {24D04B23-4E06-4214-89EB-96BF5EAA1C72}.Debug|Any CPU.Build.0 = Debug|Any CPU - {24D04B23-4E06-4214-89EB-96BF5EAA1C72}.Release|Any CPU.ActiveCfg = Release|Any CPU - {24D04B23-4E06-4214-89EB-96BF5EAA1C72}.Release|Any CPU.Build.0 = Release|Any CPU - {EF484F76-7526-4C07-A2DF-DD11424FC353}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EF484F76-7526-4C07-A2DF-DD11424FC353}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EF484F76-7526-4C07-A2DF-DD11424FC353}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EF484F76-7526-4C07-A2DF-DD11424FC353}.Release|Any CPU.Build.0 = Release|Any CPU - {33554997-4FF6-4B10-BC98-DB0F26146289}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {33554997-4FF6-4B10-BC98-DB0F26146289}.Debug|Any CPU.Build.0 = Debug|Any CPU - {33554997-4FF6-4B10-BC98-DB0F26146289}.Release|Any CPU.ActiveCfg = Release|Any CPU - {33554997-4FF6-4B10-BC98-DB0F26146289}.Release|Any CPU.Build.0 = Release|Any CPU - {A035E990-78D7-4132-8E36-5DBD5137E063}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A035E990-78D7-4132-8E36-5DBD5137E063}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A035E990-78D7-4132-8E36-5DBD5137E063}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A035E990-78D7-4132-8E36-5DBD5137E063}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {6FBF46BB-C136-4587-B121-0B7F1DB02A18} = {BA799592-92C2-40AD-9FB2-623E94A427F3} - {24D04B23-4E06-4214-89EB-96BF5EAA1C72} = {88AA0DC3-2723-4E7D-A89E-A977F319B3AA} - {EF484F76-7526-4C07-A2DF-DD11424FC353} = {88AA0DC3-2723-4E7D-A89E-A977F319B3AA} - {33554997-4FF6-4B10-BC98-DB0F26146289} = {88AA0DC3-2723-4E7D-A89E-A977F319B3AA} - {A035E990-78D7-4132-8E36-5DBD5137E063} = {88AA0DC3-2723-4E7D-A89E-A977F319B3AA} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {D98C9775-3F13-458F-A382-1BD82A380073} - EndGlobalSection -EndGlobal diff --git a/visualstudio.xunit.slnx b/visualstudio.xunit.slnx new file mode 100644 index 0000000..a8f1517 --- /dev/null +++ b/visualstudio.xunit.slnx @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 7b0f8cb07b1b41c638c6fdb8b96185ba4a785665 Mon Sep 17 00:00:00 2001 From: Brad Wilson Date: Tue, 24 Mar 2026 19:19:37 -0700 Subject: [PATCH 14/24] Latest dependencies --- Versions.props | 4 ++-- src/Directory.Build.props | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Versions.props b/Versions.props index b75f73a..8c09c2b 100644 --- a/Versions.props +++ b/Versions.props @@ -5,13 +5,13 @@ 9.0.7 1.0.3 17.13.0 - 10.0.102 + 10.0.105 $(Microsoft_NET_Test_Sdk_Version) 3.9.50 5.3.0 1.0.0-alpha.160 1.27.0 - [4.0.0-pre.25,4.99.99] + [4.0.0-pre.32,4.99.99] 2.9.3 diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 272d290..c03f5bd 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -14,7 +14,8 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all - + + From 89176d7f8ddea09bf9b939ea5c8dc06e302204d0 Mon Sep 17 00:00:00 2001 From: Brad Wilson Date: Fri, 10 Apr 2026 19:24:52 -0700 Subject: [PATCH 15/24] Latest dependencies --- Versions.props | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Versions.props b/Versions.props index 8c09c2b..4eab4ff 100644 --- a/Versions.props +++ b/Versions.props @@ -10,8 +10,8 @@ 3.9.50 5.3.0 1.0.0-alpha.160 - 1.27.0 - [4.0.0-pre.32,4.99.99] + [2.0.0-pre.40,3.0.0) + [4.0.0-pre.80,5.0.0) 2.9.3 From dc0b8c7af02130ec4479672769063f84d5f395b9 Mon Sep 17 00:00:00 2001 From: Brad Wilson Date: Fri, 17 Jul 2026 12:57:54 -0700 Subject: [PATCH 16/24] Latest dependencies (and remove NSubstitute) --- Versions.props | 9 ++--- .../Utility/DebuggerProcessLauncher.cs | 5 ++- .../Utility/RunSettings.cs | 2 +- src/xunit.runner.visualstudio/VsTestRunner.cs | 5 +-- .../RunnerReporterTests.cs | 6 +-- .../TestCaseFilterTests.cs | 40 ++++++++----------- .../Utility/MockDiscoveryContext.cs | 6 +++ .../Utility/MockRunContext.cs | 21 ++++++++++ .../Utility/MockTestCaseFilterExpression.cs | 14 +++++++ .../test.xunit.runner.visualstudio.csproj | 1 - tools/builder/targets/TestCore.cs | 2 +- tools/builder/targets/TestFx.cs | 2 +- 12 files changed, 70 insertions(+), 43 deletions(-) create mode 100644 test/test.xunit.runner.visualstudio/Utility/MockDiscoveryContext.cs create mode 100644 test/test.xunit.runner.visualstudio/Utility/MockRunContext.cs create mode 100644 test/test.xunit.runner.visualstudio/Utility/MockTestCaseFilterExpression.cs diff --git a/Versions.props b/Versions.props index 4eab4ff..07d20b3 100644 --- a/Versions.props +++ b/Versions.props @@ -1,17 +1,16 @@ - 2.0.44 + 2.0.46 9.0.7 1.0.3 17.13.0 10.0.105 $(Microsoft_NET_Test_Sdk_Version) - 3.9.50 - 5.3.0 + 3.10.91 1.0.0-alpha.160 - [2.0.0-pre.40,3.0.0) - [4.0.0-pre.80,5.0.0) + [2.0.0-pre.60,3.0.0) + [4.0.0-pre.153,5.0.0) 2.9.3 diff --git a/src/xunit.runner.visualstudio/Utility/DebuggerProcessLauncher.cs b/src/xunit.runner.visualstudio/Utility/DebuggerProcessLauncher.cs index c623446..e1de6c0 100644 --- a/src/xunit.runner.visualstudio/Utility/DebuggerProcessLauncher.cs +++ b/src/xunit.runner.visualstudio/Utility/DebuggerProcessLauncher.cs @@ -11,9 +11,10 @@ internal class DebuggerProcessLauncher(IFrameworkHandle2 frameworkHandle2) : protected override ITestProcess? StartTestProcess( string executable, string executableArguments, - string? responseFile) + string? responseFile, + int shutdownProcessWaitSeconds) { - var testProcess = LocalTestProcess.Start(executable, executableArguments, responseFile); + var testProcess = LocalTestProcess.Start(executable, executableArguments, responseFile, shutdownProcessWaitSeconds); if (testProcess is null) return null; diff --git a/src/xunit.runner.visualstudio/Utility/RunSettings.cs b/src/xunit.runner.visualstudio/Utility/RunSettings.cs index 2c885dd..2167956 100644 --- a/src/xunit.runner.visualstudio/Utility/RunSettings.cs +++ b/src/xunit.runner.visualstudio/Utility/RunSettings.cs @@ -76,7 +76,7 @@ public void CopyTo(TestAssemblyConfiguration configuration) if (ParallelizeAssembly.HasValue) configuration.ParallelizeAssembly = ParallelizeAssembly; if (ParallelizeTestCollections.HasValue) - configuration.ParallelizeTestCollections = ParallelizeTestCollections; + configuration.ParallelMode ??= ParallelizeTestCollections.Value ? ParallelMode.Collections : ParallelMode.None; if (PreEnumerateTheories.HasValue) configuration.PreEnumerateTheories = PreEnumerateTheories; if (PrintMaxEnumerableLength.HasValue) diff --git a/src/xunit.runner.visualstudio/VsTestRunner.cs b/src/xunit.runner.visualstudio/VsTestRunner.cs index 22374f5..ce5c0c2 100644 --- a/src/xunit.runner.visualstudio/VsTestRunner.cs +++ b/src/xunit.runner.visualstudio/VsTestRunner.cs @@ -610,11 +610,8 @@ await DiscoverTestsInAssembly( // Execute tests var executionOptions = TestFrameworkOptions.ForExecution(configuration); - if (!configuration.ParallelizeTestCollectionsOrDefault) - { + if (configuration.ParallelModeOrDefault == ParallelMode.None) executionOptions.SetSynchronousMessageReporting(true); - executionOptions.SetDisableParallelization(true); - } var vsExecutionSink = new VsExecutionSink(reporterMessageHandler, frameworkHandle, logger, testCasesMap, () => cancelled); var executionSinkOptions = new ExecutionSinkOptions diff --git a/test/test.xunit.runner.visualstudio/RunnerReporterTests.cs b/test/test.xunit.runner.visualstudio/RunnerReporterTests.cs index 04d3856..83bd61f 100644 --- a/test/test.xunit.runner.visualstudio/RunnerReporterTests.cs +++ b/test/test.xunit.runner.visualstudio/RunnerReporterTests.cs @@ -3,7 +3,6 @@ using System; using System.Diagnostics; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Logging; -using NSubstitute; using Xunit; using Xunit.Runner.Common; using LoggerHelper = VSTestAdapter.Xunit.Runner.VisualStudio.LoggerHelper; @@ -51,13 +50,12 @@ public void WhenRequestedReporterDoesntExist_LogsAndFallsBack() { using var _ = EnvironmentHelper.NullifyEnvironmentalReporters(); var settings = new RunSettings { NoAutoReporters = true, ReporterSwitch = "thisnotavalidreporter" }; - var logger = Substitute.For(); + var logger = new SpyMessageLogger(); var loggerHelper = new LoggerHelper(logger, new Stopwatch()); var runnerReporter = VsTestRunner.GetRunnerReporter(loggerHelper, settings); - Assert.Equal(typeof(DefaultRunnerReporter).AssemblyQualifiedName, runnerReporter.GetType().AssemblyQualifiedName); - logger.Received(1).SendMessage(TestMessageLevel.Warning, "[xUnit.net 00:00:00.00] Could not find requested reporter 'thisnotavalidreporter'"); + Assert.Contains("[Warning] [xUnit.net 00:00:00.00] Could not find requested reporter 'thisnotavalidreporter'", logger.Messages); } } diff --git a/test/test.xunit.runner.visualstudio/TestCaseFilterTests.cs b/test/test.xunit.runner.visualstudio/TestCaseFilterTests.cs index 789f35c..bd7e1c9 100644 --- a/test/test.xunit.runner.visualstudio/TestCaseFilterTests.cs +++ b/test/test.xunit.runner.visualstudio/TestCaseFilterTests.cs @@ -7,7 +7,6 @@ using Microsoft.VisualStudio.TestPlatform.ObjectModel; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Adapter; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Logging; -using NSubstitute; using Xunit; using Constants = VSTestAdapter.Xunit.Runner.VisualStudio.Constants; using LoggerHelper = VSTestAdapter.Xunit.Runner.VisualStudio.LoggerHelper; @@ -38,7 +37,7 @@ static TestCase GetDummyTestCaseWithTraits() static LoggerHelper GetLoggerHelper(IMessageLogger? messageLogger = null) { - return new LoggerHelper(messageLogger ?? Substitute.For(), new Stopwatch()); + return new LoggerHelper(messageLogger ?? new SpyMessageLogger(), new Stopwatch()); } [Fact] @@ -46,11 +45,9 @@ public void TestCaseFilter_SingleMatch() { var dummyTestCaseList = GetDummyTestCases(); var dummyTestCaseDisplayNamefilterString = "Test4"; - var context = Substitute.For(); - var filterExpression = Substitute.For(); // The matching should return a single testcase - filterExpression.MatchTestCase(null!, null!).ReturnsForAnyArgs(x => ((TestCase)x[0]).FullyQualifiedName.Equals(dummyTestCaseDisplayNamefilterString)); - context.GetTestCaseFilter(null, null!).ReturnsForAnyArgs(filterExpression); + var filterExpression = new MockTestCaseFilterExpression(tc => tc.FullyQualifiedName.Equals(dummyTestCaseDisplayNamefilterString)); + var context = new MockRunContext(() => filterExpression); var filter = new TestCaseFilter(context, GetLoggerHelper(), "dummyTestAssembly", dummyKnownTraits); var results = dummyTestCaseList.Where(filter.MatchTestCase); @@ -63,41 +60,36 @@ public void TestCaseFilter_SingleMatch() public void TestCaseFilter_NoFilterString() { var dummyTestCaseList = GetDummyTestCases(); - var context = Substitute.For(); - context.GetTestCaseFilter(null, null!).ReturnsForAnyArgs(default(ITestCaseFilterExpression)); + var context = new MockRunContext(); var filter = new TestCaseFilter(context, GetLoggerHelper(), "dummyTestAssembly", dummyKnownTraits); var results = dummyTestCaseList.Where(filter.MatchTestCase); // Make sure we run the whole set since there is not filtering string specified - Assert.Equal(dummyTestCaseList.Count(), results.Count()); + Assert.Equal(dummyTestCaseList.Count, results.Count()); } [Fact] public void TestCaseFilter_ErrorParsingFilterString() { - var messageLogger = Substitute.For(); + var messageLogger = new SpyMessageLogger(); var dummyTestCaseList = GetDummyTestCases(); - var context = Substitute.For(); - context.GetTestCaseFilter(null, null!).ReturnsForAnyArgs(x => { throw new TestPlatformFormatException("Hello from the exception"); }); + var context = new MockRunContext(() => throw new TestPlatformFormatException("Hello from the exception")); var filter = new TestCaseFilter(context, GetLoggerHelper(messageLogger), "dummyTestAssembly", dummyKnownTraits); var results = dummyTestCaseList.Where(filter.MatchTestCase); // Make sure we don't run anything due to the filtering string parse error Assert.Empty(results); - var args = messageLogger.ReceivedCalls().Single().GetArguments(); - Assert.Collection(args, - arg => Assert.Equal(TestMessageLevel.Warning, arg), - arg => Assert.EndsWith("dummyTestAssembly: Exception filtering tests: Hello from the exception", (string)arg!) - ); + var msg = Assert.Single(messageLogger.Messages); + Assert.Equal("[Warning] [xUnit.net 00:00:00.00] dummyTestAssembly: Exception filtering tests: Hello from the exception", msg); } [Fact] public void TestCaseFilter_TestPropertyProviderWithDiscoveryContextForTraits() { var dummyTestCase = GetDummyTestCaseWithTraits(); - var context = Substitute.For(); + var context = new MockDiscoveryContext(); var filter = new TestCaseFilter(context, GetLoggerHelper()); var targetTraitKey = "Category"; @@ -105,14 +97,14 @@ public void TestCaseFilter_TestPropertyProviderWithDiscoveryContextForTraits() Assert.NotNull(propertyResult); Assert.IsType(propertyResult); - Assert.Equal(dummyTestCase.Traits.Where(t => t.Name.Equals(targetTraitKey, StringComparison.OrdinalIgnoreCase)).Count(), ((string[])propertyResult).Count()); + Assert.Equal(dummyTestCase.Traits.Count(t => t.Name.Equals(targetTraitKey, StringComparison.OrdinalIgnoreCase)), ((string[])propertyResult).Count()); } [Fact] public void TestCaseFilter_TestPropertyProviderWithDiscoveryContextForFullyQualifiedName() { var dummyTestCase = GetDummyTestCaseWithTraits(); - var context = Substitute.For(); + var context = new MockDiscoveryContext(); var filter = new TestCaseFilter(context, GetLoggerHelper()); var targetName = "FullyQualifiedName"; @@ -127,7 +119,7 @@ public void TestCaseFilter_TestPropertyProviderWithDiscoveryContextForFullyQuali public void TestCaseFilter_TestPropertyProviderWithDiscoveryContextForDisplayName() { var dummyTestCase = GetDummyTestCaseWithTraits(); - var context = Substitute.For(); + var context = new MockDiscoveryContext(); var filter = new TestCaseFilter(context, GetLoggerHelper()); var targetName = "DisplayName"; @@ -142,7 +134,7 @@ public void TestCaseFilter_TestPropertyProviderWithDiscoveryContextForDisplayNam public void TestCaseFilter_TestPropertyProviderWithRunContextForTraits() { var dummyTestCase = GetDummyTestCaseWithTraits(); - var context = Substitute.For(); + var context = new MockRunContext(); var filter = new TestCaseFilter(context, GetLoggerHelper(), "dummyTestAssembly", dummyKnownTraits); var targetTraitKey = "Priority"; @@ -157,7 +149,7 @@ public void TestCaseFilter_TestPropertyProviderWithRunContextForTraits() public void TestCaseFilter_TestPropertyProviderWithRunContextForFullyQualifiedName() { var dummyTestCase = GetDummyTestCaseWithTraits(); - var context = Substitute.For(); + var context = new MockRunContext(); var filter = new TestCaseFilter(context, GetLoggerHelper(), "dummyTestAssembly", dummyKnownTraits); var targetName = "FullyQualifiedName"; @@ -172,7 +164,7 @@ public void TestCaseFilter_TestPropertyProviderWithRunContextForFullyQualifiedNa public void TestCaseFilter_TestPropertyProviderWithRunContextForDisplayName() { var dummyTestCase = GetDummyTestCaseWithTraits(); - var context = Substitute.For(); + var context = new MockRunContext(); var filter = new TestCaseFilter(context, GetLoggerHelper(), "dummyTestAssembly", dummyKnownTraits); var targetName = "DisplayName"; diff --git a/test/test.xunit.runner.visualstudio/Utility/MockDiscoveryContext.cs b/test/test.xunit.runner.visualstudio/Utility/MockDiscoveryContext.cs new file mode 100644 index 0000000..d542a3d --- /dev/null +++ b/test/test.xunit.runner.visualstudio/Utility/MockDiscoveryContext.cs @@ -0,0 +1,6 @@ +namespace Microsoft.VisualStudio.TestPlatform.ObjectModel.Adapter; + +public class MockDiscoveryContext : IDiscoveryContext +{ + public IRunSettings? RunSettings { get; set; } +} diff --git a/test/test.xunit.runner.visualstudio/Utility/MockRunContext.cs b/test/test.xunit.runner.visualstudio/Utility/MockRunContext.cs new file mode 100644 index 0000000..e522d76 --- /dev/null +++ b/test/test.xunit.runner.visualstudio/Utility/MockRunContext.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; + +namespace Microsoft.VisualStudio.TestPlatform.ObjectModel.Adapter; + +public class MockRunContext(Func? getTestCaseFilterSelector = null) : + IRunContext +{ + public bool InIsolation { get; set; } + public bool IsDataCollectionEnabled { get; set; } + public bool IsBeingDebugged { get; set; } + public bool KeepAlive { get; set; } + public IRunSettings? RunSettings { get; set; } + public string? SolutionDirectory { get; set; } + public string? TestRunDirectory { get; set; } + + public ITestCaseFilterExpression? GetTestCaseFilter( + IEnumerable? supportedProperties, + Func propertyProvider) => + getTestCaseFilterSelector?.Invoke(); +} diff --git a/test/test.xunit.runner.visualstudio/Utility/MockTestCaseFilterExpression.cs b/test/test.xunit.runner.visualstudio/Utility/MockTestCaseFilterExpression.cs new file mode 100644 index 0000000..b0c816a --- /dev/null +++ b/test/test.xunit.runner.visualstudio/Utility/MockTestCaseFilterExpression.cs @@ -0,0 +1,14 @@ +using System; + +namespace Microsoft.VisualStudio.TestPlatform.ObjectModel.Adapter; + +public class MockTestCaseFilterExpression(Func? matchSelector = null) : + ITestCaseFilterExpression +{ + public string TestCaseFilterValue { get; set; } = ""; + + public bool MatchTestCase( + TestCase testCase, + Func propertyValueProvider) => + matchSelector?.Invoke(testCase) ?? false; +} diff --git a/test/test.xunit.runner.visualstudio/test.xunit.runner.visualstudio.csproj b/test/test.xunit.runner.visualstudio/test.xunit.runner.visualstudio.csproj index f27d152..ca1d514 100644 --- a/test/test.xunit.runner.visualstudio/test.xunit.runner.visualstudio.csproj +++ b/test/test.xunit.runner.visualstudio/test.xunit.runner.visualstudio.csproj @@ -9,7 +9,6 @@ - diff --git a/tools/builder/targets/TestCore.cs b/tools/builder/targets/TestCore.cs index 839118c..67b1e69 100644 --- a/tools/builder/targets/TestCore.cs +++ b/tools/builder/targets/TestCore.cs @@ -21,7 +21,7 @@ public static async Task OnExecute(BuildContext context) var reportPath = Path.Combine(context.TestOutputFolder, "test.xunit.runner.visualstudio-netcore.ctrf"); File.Delete(reportPath); - await context.Exec("dotnet", $"exec {testPath} -ctrf {reportPath}"); + await context.Exec("dotnet", $"exec {testPath} -result-ctrf {reportPath}"); context.BuildStep("Running .NET VSTest integration tests"); diff --git a/tools/builder/targets/TestFx.cs b/tools/builder/targets/TestFx.cs index e04ee5d..02a7b77 100644 --- a/tools/builder/targets/TestFx.cs +++ b/tools/builder/targets/TestFx.cs @@ -21,7 +21,7 @@ public static async Task OnExecute(BuildContext context) var reportPath = Path.Combine(context.TestOutputFolder, "test.xunit.runner.visualstudio-netfx.ctrf"); File.Delete(reportPath); - await context.Exec(testPath, $"-ctrf {reportPath}", testFolder); + await context.Exec(testPath, $"-result-ctrf {reportPath}", testFolder); if (context.NeedMono) return; From 0684ff59ea6e8357d73fb663a8887d4660d4de02 Mon Sep 17 00:00:00 2001 From: Brad Wilson Date: Mon, 27 Jul 2026 11:54:46 -0700 Subject: [PATCH 17/24] Remove Mono dependency (plus latest dependencies) --- Versions.props | 2 +- build | 6 +----- build.ps1 | 4 ++-- tools/builder/common | 2 +- tools/builder/targets/TestFx.cs | 2 +- 5 files changed, 6 insertions(+), 10 deletions(-) diff --git a/Versions.props b/Versions.props index 07d20b3..796f6c7 100644 --- a/Versions.props +++ b/Versions.props @@ -10,7 +10,7 @@ 3.10.91 1.0.0-alpha.160 [2.0.0-pre.60,3.0.0) - [4.0.0-pre.153,5.0.0) + [4.0.0-pre.154,5.0.0) 2.9.3 diff --git a/build b/build index 8e68c66..d2ac7c8 100755 --- a/build +++ b/build @@ -13,11 +13,7 @@ function guard_bin { guard_bin git "please install the Git CLI from https://git-scm.com/" guard_bin dotnet "please install the .NET SDK from https://dot.net/" -if [ `uname -o` != Msys ]; then - guard_bin mono "please install Mono from https://www.mono-project.com/" -fi - -[ $(dotnet --version | cut -d. -f1) -ge 9 ] || write_error ".NET SDK version $(dotnet --version) is too low; please install version 9.0 or later from https://dot.net/" +[ $(dotnet --version | cut -d. -f1) -ge 10 ] || write_error ".NET SDK version $(dotnet --version) is too low; please install version 10.0 or later from https://dot.net/" git submodule status | while read line; do if [ "$(echo $line | cut -b1)" == "-" ]; then diff --git a/build.ps1 b/build.ps1 index fb3b4d6..6aed392 100644 --- a/build.ps1 +++ b/build.ps1 @@ -21,8 +21,8 @@ if ($null -eq (Get-Command "dotnet" -ErrorAction Ignore)) { } $version = [Version]$([regex]::matches((&dotnet --version), '^(\d+\.)?(\d+\.)?(\*|\d+)').value) -if ($version.Major -lt 9) { - throw ".NET SDK version ($version) is too low; please install version 9.0 or later" +if ($version.Major -lt 10) { + throw ".NET SDK version ($version) is too low; please install version 10.0 or later" } Push-Location (Split-Path $MyInvocation.MyCommand.Definition) diff --git a/tools/builder/common b/tools/builder/common index 7b87ff4..f774fd3 160000 --- a/tools/builder/common +++ b/tools/builder/common @@ -1 +1 @@ -Subproject commit 7b87ff462a7dd058e777d87ba8121f9bfe97e5de +Subproject commit f774fd34505bac281d38a861908bbd0c20cfed85 diff --git a/tools/builder/targets/TestFx.cs b/tools/builder/targets/TestFx.cs index 02a7b77..e832219 100644 --- a/tools/builder/targets/TestFx.cs +++ b/tools/builder/targets/TestFx.cs @@ -23,7 +23,7 @@ public static async Task OnExecute(BuildContext context) await context.Exec(testPath, $"-result-ctrf {reportPath}", testFolder); - if (context.NeedMono) + if (!context.IsWindows) return; context.BuildStep("Running .NET Framework VSTest integration tests"); From 948eca74fd66e500d3f181f042fc1a618f85e5ec Mon Sep 17 00:00:00 2001 From: Brad Wilson Date: Mon, 27 Jul 2026 11:57:53 -0700 Subject: [PATCH 18/24] Hoist up the .NET Framework skip --- tools/builder/targets/TestFx.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/tools/builder/targets/TestFx.cs b/tools/builder/targets/TestFx.cs index e832219..a558617 100644 --- a/tools/builder/targets/TestFx.cs +++ b/tools/builder/targets/TestFx.cs @@ -1,3 +1,4 @@ +using System; using System.IO; using System.Threading.Tasks; using Xunit.BuildTools.Models; @@ -14,6 +15,13 @@ public static async Task OnExecute(BuildContext context) { context.BuildStep("Running .NET Framework tests"); + if (!context.IsWindows) + { + context.WriteLineColor(ConsoleColor.Yellow, "Skipping .NET Framework tests on non-Windows OS"); + Console.WriteLine(); + return; + } + Directory.CreateDirectory(context.TestOutputFolder); var testFolder = Path.Combine(context.BaseFolder, "test", "test.xunit.runner.visualstudio", "bin", context.ConfigurationText, "net472"); @@ -23,9 +31,6 @@ public static async Task OnExecute(BuildContext context) await context.Exec(testPath, $"-result-ctrf {reportPath}", testFolder); - if (!context.IsWindows) - return; - context.BuildStep("Running .NET Framework VSTest integration tests"); await context.Exec("dotnet", $"test test/test.v3 -tl:off --configuration {context.Configuration} --no-build --framework net472 --verbosity {context.Verbosity}"); From 0ebc8488e25587cbd45d7aa0bf346dc9e936bb3d Mon Sep 17 00:00:00 2001 From: Brad Wilson Date: Fri, 31 Jul 2026 15:11:48 -0700 Subject: [PATCH 19/24] Remove unnecessary assembly attribute from NSubstitute --- test/GlobalTestAssemblyInfo.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/GlobalTestAssemblyInfo.cs b/test/GlobalTestAssemblyInfo.cs index 20678a3..7126373 100644 --- a/test/GlobalTestAssemblyInfo.cs +++ b/test/GlobalTestAssemblyInfo.cs @@ -1,5 +1,3 @@ using System.Reflection; -using System.Runtime.CompilerServices; [assembly: AssemblyVersion("99.99.99.0")] -[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] From 93b9f2c129f0e61dd31d3812a532de4a118a578c Mon Sep 17 00:00:00 2001 From: Brad Wilson Date: Fri, 31 Jul 2026 15:11:56 -0700 Subject: [PATCH 20/24] xunit/xunit#3601: Runner reporter diagnostic information doesn't reflection test assembly overrides --- Versions.props | 2 +- src/xunit.runner.visualstudio/VsTestRunner.cs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Versions.props b/Versions.props index 796f6c7..fa50e3a 100644 --- a/Versions.props +++ b/Versions.props @@ -10,7 +10,7 @@ 3.10.91 1.0.0-alpha.160 [2.0.0-pre.60,3.0.0) - [4.0.0-pre.154,5.0.0) + [4.0.0-pre.156,5.0.0) 2.9.3 diff --git a/src/xunit.runner.visualstudio/VsTestRunner.cs b/src/xunit.runner.visualstudio/VsTestRunner.cs index ce5c0c2..2504925 100644 --- a/src/xunit.runner.visualstudio/VsTestRunner.cs +++ b/src/xunit.runner.visualstudio/VsTestRunner.cs @@ -624,7 +624,8 @@ await DiscoverTestsInAssembly( var appDomain = configuration.AppDomain ?? AppDomainDefaultBehavior; var appDomainOption = controller.CanUseAppDomains && appDomain != AppDomainSupport.Denied ? AppDomainOption.Enabled : AppDomainOption.Disabled; bool shadowCopy = configuration.ShadowCopyOrDefault; - var resultsSink = new ExecutionSink(runInfo.Assembly, discoveryOptions, executionOptions, appDomainOption, shadowCopy, vsExecutionSink, executionSinkOptions); + var executionSinkExecutionOptions = executionOptions.WithOverrides(controller.MaxParallelThreads, controller.ParallelAlgorithm, controller.ParallelMode); + var resultsSink = new ExecutionSink(runInfo.Assembly, discoveryOptions, executionSinkExecutionOptions, appDomainOption, shadowCopy, vsExecutionSink, executionSinkOptions); var frontControllerSettings = testCaseSerializations.IsEmpty From e5a7bc4135419e53d2e4aedfaf7be80a9a719521 Mon Sep 17 00:00:00 2001 From: Brad Wilson Date: Mon, 3 Aug 2026 17:14:05 -0700 Subject: [PATCH 21/24] Enable parallelMode all --- test/test.xunit.runner.visualstudio/RunnerReporterTests.cs | 1 + test/xunit.runner.json | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/test/test.xunit.runner.visualstudio/RunnerReporterTests.cs b/test/test.xunit.runner.visualstudio/RunnerReporterTests.cs index 83bd61f..76e1af4 100644 --- a/test/test.xunit.runner.visualstudio/RunnerReporterTests.cs +++ b/test/test.xunit.runner.visualstudio/RunnerReporterTests.cs @@ -9,6 +9,7 @@ using RunSettings = VSTestAdapter.Xunit.Runner.VisualStudio.RunSettings; using VsTestRunner = VSTestAdapter.Xunit.Runner.VisualStudio.VsTestRunner; +[TestClass(DisableParallelization = true)] public class RunnerReporterTests { [Fact] diff --git a/test/xunit.runner.json b/test/xunit.runner.json index 6c0d1e4..89d4342 100644 --- a/test/xunit.runner.json +++ b/test/xunit.runner.json @@ -1,4 +1,5 @@ { "$schema": "https://xunit.net/schema/current/xunit.runner.schema.json", - "diagnosticMessages": true + "diagnosticMessages": true, + "parallelMode": "all" } From 025348a3d1b034d077e8eab30dbf6324f7b807ae Mon Sep 17 00:00:00 2001 From: Brad Wilson Date: Fri, 7 Aug 2026 13:40:47 -0700 Subject: [PATCH 22/24] Latest dependencies (including fix for xunit/xunit#3603) --- Versions.props | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Versions.props b/Versions.props index fa50e3a..34da282 100644 --- a/Versions.props +++ b/Versions.props @@ -9,8 +9,8 @@ $(Microsoft_NET_Test_Sdk_Version) 3.10.91 1.0.0-alpha.160 - [2.0.0-pre.60,3.0.0) - [4.0.0-pre.156,5.0.0) + [2.0.0-pre.64,3.0.0) + [4.0.0-pre.158,5.0.0) 2.9.3 From 48e427909096a4caa1790576a6b7598e4162a553 Mon Sep 17 00:00:00 2001 From: Brad Wilson Date: Fri, 7 Aug 2026 14:27:10 -0700 Subject: [PATCH 23/24] (Temporarily?) Disable 'parallelMode: all' due to Linux failures --- test/xunit.runner.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/xunit.runner.json b/test/xunit.runner.json index 89d4342..6c0d1e4 100644 --- a/test/xunit.runner.json +++ b/test/xunit.runner.json @@ -1,5 +1,4 @@ { "$schema": "https://xunit.net/schema/current/xunit.runner.schema.json", - "diagnosticMessages": true, - "parallelMode": "all" + "diagnosticMessages": true } From 05679a7ab5ca2461d06880faaefe26770e0fdf77 Mon Sep 17 00:00:00 2001 From: Brad Wilson Date: Fri, 14 Aug 2026 13:08:21 -0700 Subject: [PATCH 24/24] v4.0.0 --- Versions.props | 4 ++-- version.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Versions.props b/Versions.props index 34da282..2b2c44b 100644 --- a/Versions.props +++ b/Versions.props @@ -9,8 +9,8 @@ $(Microsoft_NET_Test_Sdk_Version) 3.10.91 1.0.0-alpha.160 - [2.0.0-pre.64,3.0.0) - [4.0.0-pre.158,5.0.0) + 2.0.0 + 4.0.0 2.9.3 diff --git a/version.json b/version.json index f471020..e59b05c 100644 --- a/version.json +++ b/version.json @@ -1,6 +1,6 @@ { "$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json", - "version": "4.0.0-pre.{height}", + "version": "4.0.0", "nuGetPackageVersion": { "semVer": 2.0 },