Awesome
fsharp-hedgehog
<img src="https://github.com/hedgehogqa/fsharp-hedgehog/raw/master/img/hedgehog-logo.png" width="307" align="right"/>Hedgehog will eat all your bugs.
Hedgehog is a modern property-based testing system, in the spirit of QuickCheck. Hedgehog uses integrated shrinking, so shrinks obey the invariants of generated values by construction.
Features
- Integrated shrinking, shrinks obey invariants by construction.
- Convenient syntax for generators and properties with
gen
andproperty
expressions. - Range combinators for full control over the scope of generated numbers and collections.
Example
The root namespace, Hedgehog
, includes almost
everything you need to get started writing property tests with Hedgehog.
open Hedgehog
Once you have your import declaration set up, you can write a simple property:
let propReverse : Property<bool> =
property {
let! xs = Gen.list (Range.linear 0 100) Gen.alpha
return xs |> List.rev |> List.rev = xs
}
You can then load the module in F# Interactive, and run it:
> Property.render propReverse |> printfn "%s"
+++ OK, passed 100 tests.
More examples can be found in the tutorial.
👉 For auto-generators (à la AutoFixture) and other convenience generators, check out fsharp-hedgehog-experimental.
C#/LINQ Example
Hedgehog provides an alternative namespace, meant to provide compatibility with other .NET languages. To use this, simply import the Hedgehog.Linq
namespace. The base Hedgehog
namespace isn't necessary in this scenario.
Generators are then built with a more comfortable fluent API.
using Hedgehog.Linq;
class Generators
{
static void Example()
{
// This creates a generator for 10 character strings, with only alphabetical characters.
var stringLength = 10;
var stringGen = Gen.Alpha.String(Range.FromValue(stringLength));
// This creates a property..
var property =
from str in Property.ForAll(stringGen)
select str.Length == stringLength;
// ..that can be checked, rechecked or rendered.
property.Check();
}
}
Building from source
To build Hedgehog from source, you will need either the .NET Core SDK or Visual Studio.
Building & running tests
With Visual Studio you can build Hedgehog and run the tests
from inside the IDE, otherwise with the dotnet
command-line
tool you can execute:
dotnet build
To run the tests, you can execute:
dotnet test tests/Hedgehog.Tests/Hedgehog.Tests.fsproj
dotnet test tests/Hedgehog.Linq.Tests/Hedgehog.Linq.Tests.csproj
Building the NuGet package
As of https://github.com/hedgehogqa/fsharp-hedgehog/pull/253/ a NuGet package is created automatically during build.
If you want to manually create a NuGet package you can run:
dotnet pack src/Hedgehog/Hedgehog.fsproj -c Release
This will produce Hedgehog-x.y.z.nupkg
in src/Hedgehog/bin/Release
.
Development Environments
Visual Studio
Hedgehog can be developed in Visual Studio, once these requirements are met:
- .NET Core (2.1+) and .NET Framework (4.5.1+) are installed.
Visual Studio Code
Hedgehog can be developed in Visual Studio Code, with a couple of scenarios supported.
Bare Metal
Developing on bare metal is essentially the same as developing in Visual Studio, install the appropriate .NET SDK then open the project folder.
Remote Containers
Development can also be done using Remote Development.
The steps to get this up and running are as follows:
- Install Docker.
- Install the Remote Containers extension.
- Open the project folder, then run the
Remote-Containers: Reopen in Container
command.