DrillSergeant 0.0.14-alpha
See the version list below for details.
dotnet add package DrillSergeant --version 0.0.14-alpha
NuGet\Install-Package DrillSergeant -Version 0.0.14-alpha
<PackageReference Include="DrillSergeant" Version="0.0.14-alpha" />
paket add DrillSergeant --version 0.0.14-alpha
#r "nuget: DrillSergeant, 0.0.14-alpha"
// Install DrillSergeant as a Cake Addin #addin nuget:?package=DrillSergeant&version=0.0.14-alpha&prerelease // Install DrillSergeant as a Cake Tool #tool nuget:?package=DrillSergeant&version=0.0.14-alpha&prerelease
DrillSergeant
.net behavior driven testing written by developers, for developers.
Introduction
DrillSergeant
is a behavior testing library that empowers developers to apply BDD practices with minimal amount of friction. Simply import the package and write your behaviors in familiar C# syntax.
Getting Started
For a complete example of a feature, see the following example.
A Basic Calculator Service
Lets say we have a Calculator
service. For this example we'll define it as a simple class.
public class Calculator
{
public int Add(int a, int b) => a + b;
public int Sub(int a, int b) => a - b;
}
We can write a behavior test like so:
public class CalculatorTests
{
private readonly Calculator _calculator = new();
[Behavior]
[InlineData(1,2,3)]
[InlineData(2,3,5)]
public Behavior TestAdditionBehavior(int a, int b, int expected)
{
var input = new
{
A = a,
B = b,
Expected = expected
};
return new Behavior(input)
.Given(SetFirstNumber)
.Given(SetSecondNumber)
.When(AddNumbers)
.Then(CheckResult);
}
[Behavior]
[InlineData(3,2,1)]
[InlineData(5,2,3)]
public Behavior TestSubtractionBehavior(int a, int b, int expected)
{
var input = new
{
A = a,
B = b,
Expected = expected
};
return new Behavior(input)
.Given(SetFirstNumber)
.Given(SetSecondNumber)
.When(SubtractNumbers)
.Then(CheckResult);
}
// Given Steps.
private void SetFirstNumber(dynamic context, dynamic input) => context.A = input.A;
private void SetSecondNumber(dynamic context, dynamic input) => context.B = input.B;
// When Steps.
private void AddNumbers(dynamic context) => context.Result = _calculator.Add(context.A, context.B);
private void SubtractNumbers(dynamic context) => context.Result = _calculator.Sub(context.A, context.B);
// Then Steps.
private void CheckResult(dynamic context, dynamic input) => Assert.Equal(input.Expected, context.Result);
}
Behaviors are written in same fashion as a normal xunit [Fact]
or [Theory]
test. The only difference is that it is marked using the [Behavior]
attribute and must return an instance of type Behavior
.
Why Write Tests This Way?
Unlike in normal unit tests, which are intended to test the correctness of individual methods, behaviors tests validate whether one or more components actually behave in the way expected when given "normal" inputs. Because of this, behaviors are composed of a series of pluggable steps that can be re-used in different scenarios. See the Cucumber documentation for an introduction into behavior testing.
Why Not Use A 3rd Party Acceptance Testing Tool (e.g. SpecFlow, Fitnesse, Guage)?
DrillSergeant
was borne out of frustration of using 3rd party testing tools. While tools such as SpecFlow and Guage have gotten easier to use over time, they require installing 3rd party plugins/runners in the developer environment. Additionally they require separate files for authoring the tests themselves (.feature
for Specflow, and .md
for Gauge). This relies on a mixture of code generation and reflection magic in order to bind the test specifications with the code that actually runs them, which adds a layer of complexity.
DrillSergeant
takes a different approach to this problem. Rather than rely on DSLs and complex translation layers, it engrafts additional capabilities to the xunit framework to make it easy to write behavior-driven with familiar C# syntax. No new DSLs to learn, no build-time generated C# code, no reflection shenanigans. Just a simple API written 100% in C# code that can be tested/debugged the exact same way as all of your other unit tests.
For a longer-winded explanation, see the following blog post.
Current Limitations
Currently DrillSergeant
is only compatible with xunit
2.4.x. Support for nunit
and mstest
is planned for future releases.
More Information
For more information, please see the wikis.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net6.0 is compatible. 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 is compatible. 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 was computed. 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. |
-
net6.0
- Newtonsoft.Json (>= 13.0.3)
- xunit.extensibility.execution (>= 2.4.2)
-
net7.0
- Newtonsoft.Json (>= 13.0.3)
- xunit.extensibility.execution (>= 2.4.2)
NuGet packages (3)
Showing the top 3 NuGet packages that depend on DrillSergeant:
Package | Downloads |
---|---|
DrillSergeant.MSTest
Write behavior tests in pure C#. |
|
DrillSergeant.NUnit3
Write behavior tests in pure C#. |
|
DrillSergeant.Xunit2
Write behavior tests in pure C#. |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
1.2.2 | 59 | 4/21/2024 |
1.2.1 | 45 | 4/21/2024 |
1.2.0 | 66 | 2/20/2024 |
1.2.0-alpha.40 | 78 | 1/20/2024 |
1.2.0-alpha.39 | 54 | 1/20/2024 |
1.2.0-alpha.38 | 54 | 1/20/2024 |
1.2.0-alpha.37 | 51 | 1/20/2024 |
1.2.0-alpha.35 | 142 | 11/19/2023 |
1.2.0-alpha.34 | 64 | 11/19/2023 |
1.2.0-alpha.33 | 69 | 11/13/2023 |
1.1.8 | 52 | 2/20/2024 |
1.1.2 | 80 | 1/20/2024 |
1.1.1 | 255 | 11/12/2023 |
1.1.0-alpha.42 | 68 | 11/12/2023 |
1.1.0-alpha.41 | 66 | 11/12/2023 |
1.1.0-alpha.39 | 60 | 11/12/2023 |
1.1.0-alpha.38 | 68 | 11/12/2023 |
1.1.0-alpha.37 | 69 | 11/12/2023 |
1.1.0-alpha.35 | 67 | 11/12/2023 |
1.0.3 | 203 | 10/21/2023 |
1.0.1 | 183 | 10/12/2023 |
1.0.0-beta.53 | 78 | 9/30/2023 |
1.0.0-beta.52 | 70 | 9/29/2023 |
0.6.2 | 194 | 8/20/2023 |
0.6.1-beta | 149 | 8/20/2023 |
0.6.0-beta | 152 | 8/20/2023 |
0.5.0 | 208 | 7/20/2023 |
0.4.0 | 204 | 7/16/2023 |
0.3.0-beta | 181 | 7/12/2023 |
0.2.0-beta | 178 | 7/9/2023 |
0.1.0-beta | 99 | 7/4/2023 |
0.0.17-alpha | 119 | 7/3/2023 |
0.0.16-alpha | 118 | 6/30/2023 |
0.0.15-alpha | 128 | 6/29/2023 |
0.0.14-alpha | 116 | 6/23/2023 |
0.0.13-alpha | 114 | 6/23/2023 |
0.0.12-alpha | 112 | 6/16/2023 |
0.0.11-alpha | 118 | 6/14/2023 |
0.0.10-alpha | 115 | 6/10/2023 |
0.0.9-alpha | 108 | 5/28/2023 |
0.0.8-alpha | 106 | 5/25/2023 |
0.0.7-alpha | 105 | 5/23/2023 |
0.0.6-alpha | 114 | 5/20/2023 |
0.0.5-alpha | 118 | 5/20/2023 |
0.0.4-alpha | 111 | 5/17/2023 |
0.0.3-alpha | 104 | 5/14/2023 |
0.0.2-alpha | 112 | 5/12/2023 |