xunit.v3.extensions.ordering
0.3.0
dotnet add package xunit.v3.extensions.ordering --version 0.3.0
NuGet\Install-Package xunit.v3.extensions.ordering -Version 0.3.0
<PackageReference Include="xunit.v3.extensions.ordering" Version="0.3.0" />
<PackageVersion Include="xunit.v3.extensions.ordering" Version="0.3.0" />
<PackageReference Include="xunit.v3.extensions.ordering" />
paket add xunit.v3.extensions.ordering --version 0.3.0
#r "nuget: xunit.v3.extensions.ordering, 0.3.0"
#:package xunit.v3.extensions.ordering@0.3.0
#addin nuget:?package=xunit.v3.extensions.ordering&version=0.3.0
#tool nuget:?package=xunit.v3.extensions.ordering&version=0.3.0
xunit.v3.extensions.ordering
Deterministic ordering for xUnit.net v3.
Inspired by Xunit.Extensions.Ordering, but built specifically for xUnit v3.
Why?
xUnit does not guarantee execution order between tests, classes, or collections.
This package provides a simple and consistent way to control test execution order of test methods, test classes, and test collections using a single [Order] attribute.
Installation
dotnet add package xunit.v3.extensions.ordering
Setup
Register once in your test project (for example in TestSetup.cs):
using Xunit;
using Xunit.v3.Extensions.Ordering;
[assembly: TestFramework(typeof(OrderedTestFramework))]
[assembly: CollectionBehavior(DisableTestParallelization = true)]
[assembly: TestCaseOrderer(typeof(OrderedTestCaseOrderer))]
[assembly: TestCollectionOrderer(typeof(OrderedTestCollectionOrderer))]
Note: The
[Order]attribute lives in theXunitnamespace — no extrausingneeded in test files. Theusing Xunit.v3.Extensions.Orderingimport is only required in the setup file for the infrastructure classes (OrderedTestFramework,OrderedTestCaseOrderer,OrderedTestCollectionOrderer).
OrderedTestFrameworkreplaces xUnit's default execution pipeline to enable class ordering. If you only need method and collection ordering, you can omit theTestFrameworkline.
If collection or class order matters, parallelization should be disabled. Otherwise xUnit may run collections in parallel and ignore ordering.
Usage
Order test methods
using Xunit;
public class CheckoutTests
{
[Fact, Order(1)]
public void AddItemToCart() { }
[Fact, Order(2)]
public void ApplyDiscount() { }
[Fact, Order(3)]
public void CompletePayment() { }
}
Runs in order:
AddItemToCart -> ApplyDiscount -> CompletePayment
Order test classes within a collection
Class ordering applies only within the same test collection.
Apply [Order] to test classes that share a collection:
[CollectionDefinition("Integration")]
public class IntegrationDefinition;
[Collection("Integration")]
[Order(1)]
public class SetupTests
{
[Fact, Order(1)]
public void CreateSchema() { }
}
[Collection("Integration")]
[Order(2)]
public class BusinessLogicTests
{
[Fact, Order(1)]
public void ValidateOrder() { }
}
[Collection("Integration")]
[Order(3)]
public class CleanupTests
{
[Fact, Order(1)]
public void DropTempData() { }
}
Execution order:
SetupTests -> BusinessLogicTests -> CleanupTests
Requires
[assembly: TestFramework(typeof(OrderedTestFramework))]to be registered.
Order test collections
Apply [Order] to collection definitions:
[CollectionDefinition("Setup")]
[Order(1)]
public class SetupCollection;
[CollectionDefinition("Tests")]
[Order(2)]
public class TestsCollection;
[CollectionDefinition("Cleanup")]
[Order(3)]
public class CleanupCollection;
Behavior
- ordering is ascending (
Order(1)runs beforeOrder(2)) - negative values are allowed
- tests without
[Order]default to0 - same order values are resolved by name (deterministic)
[Order]works on methods, classes, and collection definitions
How it works
The package provides:
| Component | Purpose |
|---|---|
[Order(n)] |
Attribute for methods, classes, and collection definitions |
OrderedTestCaseOrderer |
Orders test methods within a class |
OrderedTestCollectionOrderer |
Orders collections by [Order] on their definition |
OrderedTestFramework |
Custom test framework that enables class ordering |
The OrderedTestFramework replaces xUnit's default execution pipeline with a custom chain:
OrderedTestFramework -> OrderedTestFrameworkExecutor -> OrderedTestAssemblyRunner -> OrderedTestCollectionRunner
The OrderedTestCollectionRunner overrides RunTestClasses() to sort test classes by their [Order] attribute before execution.
Migration notes
If you used Xunit.Extensions.Ordering (v2):
[Order]works the same way- registration now uses
typeof(...)instead of strings - class ordering requires
[assembly: TestFramework(typeof(OrderedTestFramework))] - assembly fixtures are handled natively by xUnit v3
| Before (v2) | After (v3) |
|---|---|
[Order(1)] on methods/classes |
[Order(1)] — same |
[assembly: TestCaseOrderer("...", "...")] |
[assembly: TestCaseOrderer(typeof(OrderedTestCaseOrderer))] |
[assembly: TestCollectionOrderer("...", "...")] |
[assembly: TestCollectionOrderer(typeof(OrderedTestCollectionOrderer))] |
[assembly: TestFramework("...", "...")] |
[assembly: TestFramework(typeof(OrderedTestFramework))] |
| Custom assembly fixtures | Use xUnit v3 native assembly fixtures |
License
MIT
Links
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- xunit.v3.extensibility.core (>= 3.2.2)
-
net8.0
- xunit.v3.core (>= 3.2.2)
- xunit.v3.extensibility.core (>= 3.2.2)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.