Mecha.xUnit 2.1.82

dotnet add package Mecha.xUnit --version 2.1.82
NuGet\Install-Package Mecha.xUnit -Version 2.1.82
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Mecha.xUnit" Version="2.1.82" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Mecha.xUnit --version 2.1.82
#r "nuget: Mecha.xUnit, 2.1.82"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Mecha.xUnit as a Cake Addin
#addin nuget:?package=Mecha.xUnit&version=2.1.82

// Install Mecha.xUnit as a Cake Tool
#tool nuget:?package=Mecha.xUnit&version=2.1.82

Mecha Logo

.NET Publish Coverage Status

I try to make idiot proof software but the world keeps making better idiots.

Or at least that's how it seems to us much of the time. You post a new application feature and the user's find a way to break it. In reality it's because we didn't think of an edge case that they found. I mean who can possibly think up all of these possibilities? A cracked out squirrel? Perhaps a raccoon with ADHD? Neither really work out in the long run as eventually they rise up against society to overthrow it. They're trained with computers at that point so there is no stopping them. And personally I'm too lazy to do this myself so I guess that leaves writing some code to do it, but thankfully I've already done that for you.

Mecha is a library to automatically test classes with the ultimate goal being to find ways to break the code. It can help with unit testing, security testing via data fuzzing, testing for concurrency issues, and check for fault tolerance. With one line of code, you can test every method in a class automatically. Best part is it ties into the testing framework that you're already using.

The Code and What It's Doing

Mech.BreakAsync<MyClass>();

Seriously, that's it. With that Mecha searches for any public methods and properties, loops through them, finds interesting inputs for the methods, and runs them looking for exceptions to be thrown. Once an exception is thrown, it then uses the input to find the smallest possible value that still results in an issue. It then saves these issues as test cases for the future.

Ok, so it breaks my method and does what? Mecha uses a concept borrowed from property testing known as shrinking. For instance you generate a list of 100 items for the method and it breaks. Mecha then removes some of the values and sees if it continues to break. It then continues to do this until it finds a list as small as possible that still breaks.

Supported Types and Object Generation

Mostly everything. It will generate inputs for all value types, enums, and even complete classes. It will give your methods FileStreams, HttpClients, Streams, etc. that throw exceptions themselves to see if your code can handle edge cases. Stubs/substitutes are automatically generated and fed through depending on the parameters of your method. It checks bounds, null, etc. as well. On top of that it takes into account any ValidationAttributes that it finds. So if you specify a range for a parameter, it will keep the values inside that range.

Non Ninja Mutants

On a successful run where no exception is thrown the input values are potentially mutated in ways that are known to cause issues. For instance adding \0 in the middle of a string, etc. These are then run through the system to see if they can break the code. If they do, they're added to the set of results. If not, we mutate again and rerun up until the max number of mutations that you set in the options.

Shrinking All the Things

On a run where an exception is thrown, the input values are "shrunk". This involves taking a value and making it smaller in some way. For instance if a list of 100 values throws an exception, the system will remove 20 of them and try again. If it throws an exception, we shrink it again and again until it passes or we hit the max number of shrinks set in the options.

Getting Started

All you need to do is install the framework specific library from NuGet:

Framework Library
xUnit.Net Mecha.xUnit
All other frameworks Mecha.Core

This list should grow as new supported frameworks are added. If your library isn't supported, you can get access to the Mech class itself by adding the Mecha.Core library to your project. And if you like the library and would like to support your framework of choice, we'll gladly accept pull requests to add it. Anyway, what does the framework specific libraries give you?

xUnit.Net

[Property]
public void MyTest(int value1,int value2, ...)
{
    ...
}

The above code adds the Property attribute which lets xUnit.Net know that you want to assign values for value1, value2, etc. using the library. It then aggregates all of the failed tests in one result in the Test Explorer window with details about what values broke the test.

Everything Else

Mech.BreakAsync<MyClass>();

There are variations of the above method depending on your needs. Also note that you can specify various options including how long it should attempt to generate values, the number of shrinks to attempt, and the number of test cases to run from the generated values.

FAQ

  1. What if I have a method that I don't want the library to run?

    1. The library comes with a DoNotBreak Attribute. Any method marked with this will be skipped by the library.
  2. Where is it saving the failed runs for later?

    1. By default the system places the failed runs in a directory called Mecha under the test library's bin directory. It's possible to override this and store the information somewhere else by implementing the Mecha.Core.Datasources.Interfaces.IDatasource interface.
  3. Can I create my own data generators?

    1. Yes by implementing the Mecha.Core.Generator.Interfaces.IGenerator interface. The system should automatically pick them up and use them.
  4. Can I create my own data shrinker?

    1. Yes by implementing the Mecha.Core.Shrinker.Interfaces.IShrinker interface. The system should automatically pick them up and use them.
  5. Can I create my own data mutator?

    1. Yes by implementing the Mecha.Core.Mutator.Interfaces.IMutator interface. The system should automatically pick them up and use them.
Product 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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
2.1.82 0 6/22/2024
2.1.81 41 6/21/2024
2.1.80 80 6/21/2024
2.1.79 172 6/19/2024
2.1.78 206 6/18/2024
2.1.77 212 6/17/2024
2.1.76 230 6/14/2024
2.1.75 205 6/13/2024
2.1.74 217 6/12/2024
2.1.73 506 5/31/2024
2.1.72 203 5/30/2024
2.1.71 199 5/29/2024
2.1.70 260 5/27/2024
2.1.69 503 5/20/2024
2.1.68 204 5/17/2024
2.1.67 200 5/16/2024
2.1.66 219 5/15/2024
2.1.65 221 5/13/2024
2.1.64 253 5/8/2024
2.1.63 222 5/7/2024
2.1.62 254 5/6/2024
2.1.61 328 5/3/2024
2.1.60 115 5/2/2024
2.1.59 125 5/1/2024
2.1.58 164 4/30/2024
2.1.57 295 4/29/2024
2.1.56 585 4/15/2024
2.1.55 211 4/12/2024
2.1.54 196 4/11/2024
2.1.53 213 4/10/2024
2.1.52 323 4/2/2024
2.1.51 186 4/1/2024
2.1.50 234 3/29/2024
2.1.49 341 3/28/2024
2.1.48 459 3/19/2024
2.1.47 175 3/18/2024
2.1.46 166 3/15/2024
2.1.45 200 3/14/2024
2.1.44 241 3/13/2024
2.1.43 240 3/12/2024
2.1.42 203 3/11/2024
2.1.41 181 3/8/2024
2.1.40 236 3/7/2024
2.1.39 218 3/6/2024
2.1.38 232 3/5/2024
2.1.37 428 3/4/2024
2.1.36 278 3/1/2024
2.1.35 202 2/29/2024
2.1.34 203 2/28/2024
2.1.33 205 2/27/2024
2.1.32 137 2/27/2024
2.1.31 224 2/23/2024
2.1.30 83 2/23/2024
2.1.29 233 2/22/2024
2.1.28 227 2/21/2024
2.1.27 224 2/20/2024
2.1.26 174 2/19/2024
2.1.25 91 2/16/2024
2.1.24 186 2/15/2024
2.1.23 350 2/14/2024
2.1.22 206 2/13/2024
2.1.21 182 2/12/2024
2.1.20 195 2/9/2024
2.1.19 197 2/8/2024
2.1.18 187 2/7/2024
2.1.17 101 2/6/2024
2.1.16 254 2/5/2024
2.1.15 275 2/1/2024
2.1.14 765 1/31/2024
2.1.13 156 1/30/2024
2.1.12 222 1/29/2024
2.1.11 222 1/26/2024
2.1.10 200 1/25/2024
2.1.9 154 1/24/2024
2.1.8 195 1/23/2024
2.1.7 149 1/22/2024
2.1.6 255 1/16/2024
2.1.5 177 1/12/2024
2.1.4 199 1/11/2024
2.1.3 201 1/10/2024
2.1.2 203 1/9/2024
2.1.1 187 1/7/2024
2.1.0 573 12/28/2023
2.0.74 150 12/27/2023
2.0.73 350 12/21/2023
2.0.72 191 12/20/2023
2.0.71 196 12/19/2023
2.0.70 189 12/18/2023
2.0.69 192 12/15/2023
2.0.68 224 12/14/2023
2.0.67 303 12/13/2023
2.0.66 847 12/5/2023
2.0.65 251 11/24/2023
2.0.64 202 11/23/2023
2.0.63 171 11/22/2023
2.0.62 171 11/21/2023
2.0.61 169 11/20/2023
2.0.60 377 11/17/2023
2.0.59 207 11/16/2023
2.0.58 252 11/15/2023
2.0.57 150 11/13/2023
2.0.56 171 11/9/2023
2.0.55 153 11/8/2023
2.0.54 165 11/7/2023
2.0.53 205 11/6/2023
2.0.52 241 11/3/2023
2.0.51 267 11/1/2023
2.0.50 189 10/31/2023
2.0.49 217 10/30/2023
2.0.48 217 10/27/2023
2.0.47 227 10/26/2023
2.0.46 200 10/25/2023
2.0.45 230 10/17/2023
2.0.44 220 10/13/2023
2.0.43 232 10/11/2023
2.0.42 295 10/4/2023
2.0.41 204 9/26/2023
2.0.40 179 9/25/2023
2.0.39 229 9/21/2023
2.0.38 182 9/20/2023
2.0.37 190 9/19/2023
2.0.36 198 9/18/2023
2.0.35 263 9/15/2023
2.0.34 201 9/14/2023
2.0.33 214 9/13/2023
2.0.32 259 9/12/2023
2.0.31 234 9/11/2023
2.0.30 327 9/8/2023
2.0.29 238 9/7/2023
2.0.28 215 9/6/2023
2.0.27 226 9/5/2023
2.0.26 265 9/4/2023
2.0.25 290 9/1/2023
2.0.24 234 8/31/2023
2.0.23 258 8/30/2023
2.0.22 260 8/29/2023
2.0.21 270 8/28/2023
2.0.20 267 8/25/2023
2.0.19 223 8/24/2023
2.0.18 211 8/23/2023
2.0.17 215 8/22/2023
2.0.16 253 8/18/2023
2.0.15 202 8/17/2023
2.0.14 218 8/16/2023
2.0.13 1,124 8/10/2023
2.0.12 200 8/9/2023
2.0.11 266 8/8/2023
2.0.10 157 8/7/2023
2.0.9 143 8/3/2023
2.0.8 131 8/2/2023
2.0.7 164 7/27/2023
2.0.6 135 7/26/2023
2.0.5 162 7/25/2023
2.0.4 162 7/20/2023
2.0.3 144 7/19/2023
2.0.2 189 7/17/2023
2.0.1 1,637 12/28/2022
2.0.0 367 12/12/2022
1.0.41 327 12/9/2022
1.0.40 483 6/10/2022
1.0.38 605 4/12/2022
1.0.37 487 1/11/2022
1.0.35 445 9/14/2021
1.0.34 364 8/24/2021
1.0.33 390 7/26/2021
1.0.32 495 6/1/2021
1.0.30 428 5/20/2021
1.0.26 341 5/20/2021
1.0.25 357 5/20/2021
1.0.24 321 5/20/2021
1.0.22 352 5/19/2021
1.0.21 348 5/19/2021
1.0.20 322 5/18/2021
1.0.17 339 5/18/2021
1.0.16 368 5/3/2021
1.0.15 353 4/30/2021
1.0.14 351 4/29/2021
1.0.10 342 4/26/2021
1.0.9 342 4/26/2021
1.0.8 350 4/26/2021
1.0.7 355 4/26/2021
1.0.6 392 4/24/2021
1.0.5 340 4/24/2021