Description
NFluent will make your tests:
fluent to write: with a super-duper-happy auto-completion 'dot' experience. Indeed, just type the Check.That( followed by one of your objects and a dot, and your IDE will show you all the checks available for the type of the given object to verify. No more, no less (i.e. no auto completion flooding).
fluent to read: very close to plain English, making it easier for non-technical people to read test code.
fluent to troubleshoot: every failing check of the NFluent library throws an Exception with a crystal-clear message status to ease your TDD experience (see examples below). Thus, no need to set a breakpoint and to debug in order to be able to figure out what went wrong.
helpful to reverse engineer legacy code: indeed, temporarily write an on-purpose failing assert on a legacy method, so you can understand it and leverage on the "ready-to-be-copied-and-paste-for-arrays-or-collections-initialization-purpose" NFluent assert failure messages.
less error-prone: indeed, no more confusion about the order of the "expected" and "actual" values you can find in the classical .NET unit tests frameworks.
NFluent is directly inspired by the awesome Java FEST Fluent check/reflection library (http://fest.easytesting.org/) which had been recently forked (by one of its most active contributor) to create the more prolific AssertJ library.
NFluent alternatives and similar packages
Based on the "Testing" category.
Alternatively, view NFluent 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). -
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. -
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. -
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. -
NetArchTest
A fluent API for .Net that can enforce architectural rules in unit tests. -
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) -
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) -
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. -
ExpressionToCode
Generates valid, readable C# from an Expression Tree. -
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. -
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 NFluent or a related project?
README
Chat
NFluent is an assertion library which aims to fluent your .NET TDD experience.
Official site: http://www.n-fluent.net/
NFluent will make your tests:
- fluent to write: with a super-duper-happy auto-completion 'dot' experience. Indeed, just type the Check.That( followed by one of your objects and a dot, and your IDE will show you all the checks available for the type of the given object to verify. No more, no less (i.e. no auto completion flooding).
- fluent to read: very close to plain English, making it easier for non-technical people to read test code.
- fluent to troubleshoot: every failing check of the NFluent library throws an Exception with a crystal-clear message status to ease your TDD experience (see examples below). Thus, no need to set a breakpoint and to debug in order to be able to figure out what went wrong.
- helpful to reverse engineer legacy code: indeed, temporarily write an on-purpose failing assert on a legacy method, so you can understand it and leverage on the "ready-to-be-copied-and-paste-for-arrays-or-collections-initialization-purpose" NFluent assert failure messages.
- less error-prone: indeed, no more confusion about the order of the "expected" and "actual" values you can find in the classical .NET unit tests frameworks.
NFluent is directly inspired by the awesome Java FEST Fluent check/reflection library (http://fest.easytesting.org/) which had been recently forked (by one of its most active contributor) to create the more prolific AssertJ library.
NFluent & unit test frameworks
NFluent is not coupled to any .NET unit test framework. It is fully designed to work in collaboration with your favorite one.
Your favorite unit test framework (e.g. NUnit, xUnit, ...) will still handle the test identification, execution & Co. All you have to do is to replace your usage of its Assert
or Assert.That()
statements, by the Check.That()
NFluent statement form. That's all!
Indeed, we decided to use the Check.That()
syntax to avoid collisions and name ambiguity with the traditional Assert
class you can find in most of your .NET unit test frameworks (therefore, no need to declare an alias in your test fixtures).
In fact, test runners and check libraries are two orthogonal topics and concerns.
As simple as possible
With Nfluent check libraries:
All you've got to remember is: Check.That
, 'cause every check is then provided via a super-duper-auto-completion-dot-experience ;-)
Usage sample
With NFluent, you can write simple checks like this:
var integers = new int[] { 1, 2, 3, 4, 5, 666 };
Check.That(integers).Contains(3, 5, 666);
integers = new int[] { 1, 2, 3 };
Check.That(integers).IsOnlyMadeOf(3, 2, 1);
var guitarHeroes = new[] { "Hendrix", "Paco de Lucia", "Django Reinhardt", "Baden Powell" };
Check.That(guitarHeroes).ContainsExactly("Hendrix", "Paco de Lucia", "Django Reinhardt", "Baden Powell");
var camus = new Person() { Name = "Camus" };
var sartre = new Person() { Name = "Sartre" };
Check.That(camus).IsNotEqualTo(sartre).And.IsInstanceOf<Person>();
var heroes = "Batman and Robin";
Check.That(heroes).Not.Contains("Joker").And.StartsWith("Bat").And.Contains("Robin");
int? one = 1;
Check.That(one).HasAValue().Which.IsStrictlyPositive().And.IsEqualTo(1);
const Nationality FrenchNationality = Nationality.French;
Check.ThatEnum(FrenchNationality).IsNotEqualTo(Nationality.Korean);
string motivationalSaying = "Failure is the mother of success.";
Check.That(motivationalSaying).IsNotInstanceOf<int>();
with NFluent, you can also write checks like this:
var persons = new List<Person>
{
new Person { Name = "Thomas", Age = 38 },
new Person { Name = "Achille", Age = 10, Nationality = Nationality.French },
new Person { Name = "Anton", Age = 7, Nationality = Nationality.French },
new Person { Name = "Arjun", Age = 7, Nationality = Nationality.Indian }
};
Check.That(persons.Extracting(nameof(Person.Name))).ContainsExactly("Thomas", "Achille", "Anton", "Arjun");
Check.That(persons.Extracting(nameof(Person.Age))).ContainsExactly(38, 10, 7, 7);
Check.That(persons.Extracting(nameof(Person.Nationality))).ContainsExactly(Nationality.Unknown, Nationality.French, Nationality.French, Nationality.Indian);
// more fluent than the following classical NUnit way, isn't it?
// CollectionAssert.AreEquivalent(persons.Properties(nameof(Person.Age)), new[] { 38, 10, 7, 7 });
// it's maybe even more fluent than the java versions
// FEST fluent assert v 2.x:
// assertThat(extractProperty("name" , String.class).from(inn.getItems())).containsExactly("+5 Dexterity Vest", "Aged Brie", "Elixir of the Mongoose", "Sulfuras, Hand of Ragnaros", "Backstage passes to a TAFKAL80ETC concert", "Conjured Mana Cake");
// FEST fluent assert v 1.x:
// assertThat(inn.getItems()).onProperty("name").containsExactly("+5 Dexterity Vest", "Aged Brie", "Elixir of the Mongoose", "Sulfuras, Hand of Ragnaros", "Backstage passes to a TAFKAL80ETC concert", "Conjured Mana Cake");
or like this:
// Works also with lambda for exception checking
Check.ThatCode(() => { throw new InvalidOperationException(); }).Throws<InvalidOperationException>();
// or execution duration checking
Check.ThatCode(() => Thread.Sleep(30)).LastsLessThan(60, TimeUnit.Milliseconds);
Why NFluent, and not another .NET fluent check framework?
- Because you think like us that writing a lambda expression within a check statement is not really a fluent experience (for reading as well as writing).
- Because NFluent is completely driven by the super-duper-happy-path principle to fluent your TDD experience. For instance, we consider the 'dot' autocompletion experience as crucial. Thus, it should not be polluted by things not related to the current unit testing context (which occurs with extension methods on classical .NET types - intellisense flooding).
- Because you think that those other check libraries have not chosen the proper vocabulary (
<subjectUnderTest>.Should().
... why don't they chooseMust
instead?!?). And thus, you'd rather rely on a stronger semantic for your checks (i.e. NFluent'sCheck.That
). - Because you like killing features and extra bonus, such as the Properties() extension method for IEnumerable for instance (as showed within the usage sample above).
- And because it's awesome pal. Try it, you will see!
Samples of crystal-clear error messages
Wanna try NFluent?
Can't be more easy: NFluent is available on nuget.org
Use cases
[NFluent use cases are available here](./UseCases.md).
Newsgroup
For any comment, remark or question about the library, please use the NFluent-Discuss google group.
BackLog
Nfluent backlog is now available as github issues
New feature to be added?
- If you want to join the project and contribute: [check this out before](./CONTRIBUTING.md), but be our guest.
- If you don't want to contribute to the library, but you need a feature not yet implemented, don't hesitate to request it on the NFluent-Discuss google group. In any case: you are welcome!
Other resources
- Rui has published a great article about the NFluent extensibility model. Available here on CodeDistillers
Many thanks
To the other amazing contributors: Marc-Antoine LATOUR, Rui CARVALHO & Cyrille DUPUYDAUBY.
To Rui CARVALHO, for the nice NFluent logo he has designed.
To the mates that gave me ideas and feedbacks to make this lib as fluent as possible: Joel COSTIGLIOLA (former active contributor of Java FEST Assert, which now works on his AssertJ fork), Rui CARVALHO, Cyrille DUPUYDAUBY, Benoit LABAERE, ...
To Omer RAVIV, which supports the NFluent project by offering us some free licenses for the nice BugAid Visual Studio extensions.
To AppVeyor CI, which now supports NFluent builds.
[email protected] / September 2016
*Note that all licence references and agreements mentioned in the NFluent README section above
are relevant to that project's source code only.