Skip to main content

Command Palette

Search for a command to run...

How to get XUnit v3 to work with Test Explorer in VS Code

Updated
3 min read
How to get XUnit v3 to work with Test Explorer in VS Code

I recently upgraded some xUnit v2 test projects to v3 because I needed two awesome features that v3 introduced:

  • Assembly Fixtures: These allow a fixture instance to be shared between all tests in multiple classes, rather than between tests in a single class as IClassFixture had allowed up until v2.

  • Automatically serialization of test case objects in TheoryData classes. This means that this unbelievable clunk:

     public class TestCase_ValidProduct : IXunitSerializable
     {
        public required string TestCaseName { get; set; }
        public required CreateProductArgs NewProduct { get; set; }
    
        public void Deserialize(IXunitSerializationInfo info)
        {
            XUnitSerializationHelper.Deserialize(this, info);
        }
    
        public void Serialize(IXunitSerializationInfo info)
        {
            XUnitSerializationHelper.Serialize(this, info);
        }
     }
    

    reduces to:

    public class TestCase_ValidProduct : IXunitSerializable
    {
        public required string TestCaseName { get; set; }
        public required CreateProductArgs NewProduct { get; set; }
    }
    

The price of this upgrade was that Test Explorer in VS Code either couldn't discover tests, or would show them as "Skipped" and refuse to run them:

Image description

Exactly the same thing happens when I scaffold a new XUnit 3 project using dotnet new xunit3.

These problems seem to stem from the fact that xUnit v3 uses the new Microsoft Test Platform (MTP) which is a replacement for the older VS Test platform, but C# Dev Kit extension in VS Code - which is responsible for discovering tests in a C# test project and providing these to the Test Explorer window - does not work properly with MTP (yet!).

It is worth mentioning that both VS Test and the newer MTP are test execution platforms - they are agnostic to the test harness used in test projects and works with any test harness e.g. MS Test, xUnit and NUnit.

I fixed the issues by making the test projects use the older VS Test platform instead that C# Dev Kit does work with.

These are the steps that you can take to make an xUnit v3 project - whether upgraded from v2 or newly scaffolded - work in Test Explorer in VS Code:

  • Delete <PackageReference> to xunit.v3.mtp-v2 or just comment it out in the .csproj of your test project:

    <!--<PackageReference Include="xunit.v3.mtp-v2" Version="3.2.2" />-->
    
  • Then add the following references:

    dotnet add package xunit.v3.mtp-off
    dotnet add package Microsoft.NET.Test.Sdk
    dotnet add package xunit.runner.visualstudio
    

    xunit.v3.mtp-off is a version of xUnit v3 package that has MTP support disabled and is a replacement for xunit.v3.mtp-v2 that I deleted above.

    Microsoft.NET.Test.Sdk provides targets and properties for building .NET test projects, regardless of the test harness - xUnit, NUnit, MS Test etc. - that they use. It is required for integrating the project with the VS Test platform.

    xunit.runner.visualstudio is the xUnit-specific adapter for VS Test

Then reload the window (bring up the Command Palette using shortcut key Ctrl+Shift+P or F12, then type Reload Window and press Enter), and press Refresh Tests button in Test Explorer:

Image description

You should now be able to see and run your tests.

The slight caveat is that individual TheoryData tests cases in a [Theory] test do not appear as separate tests cases like they used in the Test Explorer with xUnit v2. But I am happy to sacrifice this granularity for being able to use the shiny new features in xUnit v3.