NetArchTest alternatives and similar packages
Based on the "Testing" category.
Alternatively, view NetArchTest alternatives based on common mentions on social networks and blogs.
-
Bogus
:card_index: A simple fake data generator for C#, F#, and VB.NET. Based on and ported from the famed faker.js. -
xUnit
xUnit.net is a free, open source, community-focused unit testing tool for .NET. -
Fluent Assertions
A very extensive set of extension methods that allow you to more naturally specify the expected outcome of a TDD or BDD-style unit tests. Targets .NET Framework 4.7, as well as .NET Core 2.1, .NET Core 3.0, .NET 6, .NET Standard 2.0 and 2.1. Supports the unit test frameworks MSTest2, NUnit3, XUnit2, MSpec, and NSpec3. -
SpecFlow
#1 .NET BDD Framework. SpecFlow automates your testing & works with your existing code. Find Bugs before they happen. Behavior Driven Development helps developers, testers, and business representatives to get a better understanding of their collaboration -
AutoFixture
AutoFixture is an open source library for .NET designed to minimize the 'Arrange' phase of your unit tests in order to maximize maintainability. Its primary goal is to allow developers to focus on what is being tested rather than how to setup the test scenario, by making it easier to create object graphs containing test data. -
Testcontainers
A library to support tests with throwaway instances of Docker containers for all compatible .NET Standard versions. -
Verify
Verify is a snapshot tool that simplifies the assertion of complex data models and documents. -
NBomber
Modern and flexible load testing framework for Pull and Push scenarios, designed to test any system regardless a protocol (HTTP/WebSockets/AMQP etc) or a semantic model (Pull/Push). -
WireMock.Net
WireMock.Net is a flexible product for stubbing and mocking web HTTP responses using advanced request matching and response templating. Based on the functionality from http://WireMock.org, but extended with more functionality. -
Compare-Net-Objects
What you have been waiting for :+1: Perform a deep compare of any two .NET objects using reflection. Shows the differences between the two objects. -
Machine.Specifications
Machine.Specifications is a Context/Specification framework for .NET that removes language noise and simplifies tests. -
GenFu
GenFu is a library you can use to generate realistic test data. It is composed of several property fillers that can populate commonly named properties through reflection using an internal database of values or randomly created data. You can override any of the fillers, give GenFu hints on how to fill them. -
Expecto
A smooth testing lib for F#. APIs made for humans! Strong testing methodologies for everyone! -
Canopy
f# web automation and testing library, built on top of Selenium (friendly to c# also) -
ArchUnitNET
A C# architecture test library to specify and assert architecture rules in C# for automated testing. -
Fine Code Coverage
Visualize unit test code coverage easily for free in Visual Studio Community Edition (and other editions too) -
NFluent
Smooth your .NET TDD experience with NFluent! NFluent is an ergonomic assertion library which aims to fluent your .NET TDD experience (based on simple Check.That() assertion statements). NFluent aims your tests to be fluent to write (with a super-duper-happy 'dot' auto-completion experience), fluent to read (i.e. as close as possible to plain English expression), but also fluent to troubleshoot, in a less-error-prone way comparing to the classical .NET test frameworks. NFluent is also directly inspired by the awesome Java FEST Fluent assertion/reflection library (http://fest.easytesting.org/) -
xBehave.net
✖ An xUnit.net extension for describing each step in a test with natural language. -
SpecsFor
SpecsFor is a light-weight Behavior-Driven Development framework that focuses on ease of use for *developers* by minimizing testing friction. -
NSpec
A battle hardened testing framework for C# that's heavily inspired by Mocha and RSpec. -
LightBDD
BDD framework allowing to create easy to read and maintain tests. -
snapshooter
Snapshooter is a snapshot testing tool for .NET Core and .NET Framework -
Xunit.Gherkin.Quick
BDD in .NET Core - using Xunit and Gherkin (compatible with both .NET Core and .NET) -
ExpressionToCode
Generates valid, readable C# from an Expression Tree. -
SimpleStubs
*SimpleStubs* is a simple mocking framework that supports Universal Windows Platform (UWP), .NET Core and .NET framework. SimpleStubs is currently developed and maintained by Microsoft BigPark Studios in Vancouver. -
Moq.Contrib.HttpClient
A set of extension methods for mocking HttpClient and IHttpClientFactory with Moq. -
NScenario
Dead simple library for annotating steps of test case scenarios. -
TestContainers dotnet
dotnet port of testcontainers-java -
SecTester
SecTester is a new tool that integrates our enterprise-grade scan engine directly into your unit tests.
Clean code begins in your IDE with SonarLint
* Code Quality Rankings and insights are calculated and provided by Lumnify.
They vary from L1 to L5 with "L5" being the highest.
Do you think we are missing an alternative of NetArchTest or a related project?
README
NetArchTest
A fluent API for .Net Standard that can enforce architectural rules in unit tests.
Inspired by the ArchUnit library for Java.
Rationale
This project allows you create tests that enforce conventions for class design, naming and dependency in .Net code bases. These can be used with any unit test framework and incorporated into a build pipeline. It uses a fluid API that allows you to string together readable rules that can be used in test assertions.
There are plenty of static analysis tools that can evaluate application structure, but they are aimed more at enforcing generic best practice rather than application-specific conventions. The better tools in this space can be press-ganged into creating custom rules for a specific architecture, but the intention here is to incorporate rules into a test suite and create a self-testing architecture.
The project is inspired by ArchUnit, a java-based library that attempts to address the difficulties of preserving architectural design patterns in code bases over the long term. Many patterns can only be enforced by convention, which tends to rely on a rigorous and consistent process of code review. This discipline often breaks down as projects grow, use cases become more complex and developers come and go.
Examples
// Classes in the presentation should not directly reference repositories
var result = Types.InCurrentDomain()
.That()
.ResideInNamespace("NetArchTest.SampleLibrary.Presentation")
.ShouldNot()
.HaveDependencyOn("NetArchTest.SampleLibrary.Data")
.GetResult()
.IsSuccessful;
// Classes in the "data" namespace should implement IRepository
result = Types.InCurrentDomain()
.That().HaveDependencyOn("System.Data")
.And().ResideInNamespace(("ArchTest"))
.Should().ResideInNamespace(("NetArchTest.SampleLibrary.Data"))
.GetResult()
.IsSuccessful;
// All the service classes should be sealed
result = Types.InCurrentDomain()
.That().ImplementInterface(typeof(IWidgetService))
.Should().BeSealed()
.GetResult()
.IsSuccessful;
Getting started
The main rules library is available as a package on NuGet: NetArchTest.Rules.
It is a .Net Standard 2.0 library that is compatible with .Net Framework 4.6.1 or better and .Net Core 2.0 or better.
Writing rules
The fluent API should direct you in building up a rule based on a combination of predicates, conditions and conjunctions.
The starting point for any rule is the static Types
class, where you load a set of types from a path, assembly or namespace.
var types = Types.InAssembly(typeof(MyClass).Assembly);
Once you have selected the types you can filter them using one or more predicates. These can be chained together using And()
or Or()
conjunctions:
types.That().ResideInNamespace(“MyProject.Data”);
Once the set of classes have been filtered you can apply a set of conditions using the Should()
or ShouldNot()
methods, e.g.
types.That().ResideInNamespace(“MyProject.Data”).Should().BeSealed();
Finally, you obtain a result from the rule by using an executor, i.e. use GetTypes()
to return the types that match the rule or GetResult()
to determine whether the rule has been met. Note that the result will also return a list of types that failed to meet the conditions.
var isValid = types.That().ResideInNamespace(“MyProject.Data”).Should().BeSealed().GetResult().IsSuccessful;
Custom rules
You can extend the library by writing custom rules that implement the ICustomRule
interface. These can be applied as both predicates and conditions using a MeetsCustomRule()
method, e.g.
var myRule = new CustomRule();
// Write your own custom rules that can be used as both predicates and conditions
result = Types.InCurrentDomain()
.That().AreClasses()
.Should()
.MeetCustomRule(myRule)
.GetResult().IsSuccessful;
Grouping rules into Policies
Rules can be grouped into policies using the fluent interface exposed by the Policy
class, e.g.
var architecturePolicy = Policy.Define("Example Policy", "This is an example policy")
.For(Types.InCurrentDomain)
.Add(t =>
t.That()
.ResideInNamespace("NetArchTest.SampleLibrary.Presentation")
.ShouldNot()
.HaveDependencyOn("NetArchTest.SampleLibrary.Data"),
"Enforcing layered architecture", "Controllers should not directly reference repositories"
)
...
.Add(t =>
t.That()
.AreInterfaces()
.Should()
.HaveNameStartingWith("I"),
"Generic implementation rules", "Interface names should start with an 'I'"
);
The rules are loaded lazily and executed when the Evaluate()
method is called. This method returns a PolicyResults
instance that can be passed to a reporting mechanism.
The ExamplePolicies class in the samples demonstrates how to do this.
Source code
I welcome contributions. Please refer to the [contributing guidelines](CONTRIBUTING.md).
The solution contains projects in three directories:
- src: The main Rules library that is available as a package on NuGet. The main dependency is Mono.Cecil.
- test: A set of unit tests for the rules based on XUnit.
- samples: A couple of sample projects that demonstrate some of the possible usage scenarios.
Further reading
A more extensive blog post describing the implementation detail is available in my blog.