Skip to main content
Version: 1.22

Test Runners

While Playwright for .NET isn't tied to a particular test runner or testing framework, in our experience it works best with the built-in .NET test runner, and using NUnit as the test framework. NUnit is also what we use internally for our tests.

Playwright and Browser instances can be reused between tests for better performance. We recommend running each test case in a new BrowserContext, this way browser state will be isolated between the tests.

Creating an NUnit project

# Create a new project
dotnet new nunit -n PlaywrightTests
cd PlaywrightTests
# Add the required reference
dotnet add package Microsoft.Playwright.NUnit
dotnet build
# Install the required pre-requisites
playwright install

Create a PageTests.cs file.

using System;
using System.Threading.Tasks;
using Microsoft.Playwright.NUnit;
using NUnit.Framework;

namespace PlaywrightTests;

[Parallelizable(ParallelScope.Self)]
public class MyTest : PageTest
{
[Test]
public async Task ShouldAdd()
{
int result = await Page.EvaluateAsync<int>("() => 7 + 3");
Assert.AreEqual(10, result);
}

[Test]
public async Task ShouldMultiply()
{
int result = await Page.EvaluateAsync<int>("() => 7 * 3");
Assert.AreEqual(21, result);
}
}

Run your tests against Chromium

dotnet test

Run your tests against WebKit

Windows

set BROWSER=webkit
dotnet test

Linux & Mac

BROWSER=webkit dotnet test

Run your tests with GUI

Window

set HEADED=1
dotnet test

Linux & Mac

HEADED=1 dotnet test

You can also choose specifically which tests to run, using the filtering capabilities:

dotnet test --filter "Name~ShouldAdd"

Running NUnit tests in Parallel

By default NUnit will run all test files in parallel, while running tests inside each file sequentially. It will create as many processes as there are cores on the host system. You can adjust this behavior using the NUnit.NumberOfTestWorkers parameter.

For CPU-bound tests, we recommend using as many workers as there are cores on your system, divided by 2. For IO-bound tests you can use as many workers as you have cores.

Using Verbose API Logs with NUnit

When you have enabled the verbose API log, via the DEBUG environment variable, you will see the messages in the standard error stream. In NUnit, within Visual Studio, that will be the Tests pane of the Output window. It will also be displayed in the Test Log for each test.

Using the .runsettings file

When running tests from Visual Studio, you can take advantage of the .runsettings file.

For example, to specify the amount of workers (NUnit.NumberOfTestWorkers), you can use the following snippet:

<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
<NUnit>
<NumberOfTestWorkers>24</NumberOfTestWorkers>
</NUnit>
</RunSettings>

If you want to enable debugging, you can set the DEBUG variable to pw:api as documented, by doing:

<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
<RunConfiguration>
<EnvironmentVariables>
<DEBUG>pw:api</DEBUG>
</EnvironmentVariables>
</RunConfiguration>
</RunSettings>

Base NUnit classes for Playwright

There are few base classes available to you in Microsoft.Playwright.NUnit namespace:

TestDescription
PageTestEach test gets a fresh copy of a web Page created in its own unique BrowserContext. Extending this class is the simplest way of writing a fully-functional Playwright test.

Note: You can override the ContextOptions method in each test file to control context options, the ones typically passed into the Browser.NewContextAsync(options) method. That way you can specify all kinds of emulation options for your test file individually.
ContextTestEach test will get a fresh copy of a BrowserContext. You can create as many pages in this context as you'd like. Using this test is the easiest way to test multi-page scenarios where you need more than one tab.

Note: You can override the ContextOptions method in each test file to control context options, the ones typically passed into the Browser.NewContextAsync(options) method. That way you can specify all kinds of emulation options for your test file individually.
BrowserTestEach test will get a browser and can create as many contexts as it likes. Each test is responsible for cleaning up all the contexts it created.
PlaywrightTestThis gives each test a Playwright object so that the test could start and stop as many browsers as it likes.

xUnit support

While using xUnit is also supported, we do not support running parallel tests. This is a well known problem/design limitation outlined by the maintainers across several issues.