Mecha.xUnit 2.1.56

dotnet add package Mecha.xUnit --version 2.1.56
NuGet\Install-Package Mecha.xUnit -Version 2.1.56
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.56" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Mecha.xUnit --version 2.1.56
#r "nuget: Mecha.xUnit, 2.1.56"
#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.56

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

Mecha Logo

.NET Publish

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.56 108 4/15/2024
2.1.55 168 4/12/2024
2.1.54 158 4/11/2024
2.1.53 168 4/10/2024
2.1.52 310 4/2/2024
2.1.51 177 4/1/2024
2.1.50 164 3/29/2024
2.1.49 217 3/28/2024
2.1.48 420 3/19/2024
2.1.47 168 3/18/2024
2.1.46 160 3/15/2024
2.1.45 188 3/14/2024
2.1.44 235 3/13/2024
2.1.43 234 3/12/2024
2.1.42 198 3/11/2024
2.1.41 176 3/8/2024
2.1.40 232 3/7/2024
2.1.39 208 3/6/2024
2.1.38 228 3/5/2024
2.1.37 424 3/4/2024
2.1.36 274 3/1/2024
2.1.35 197 2/29/2024
2.1.34 199 2/28/2024
2.1.33 195 2/27/2024
2.1.32 133 2/27/2024
2.1.31 221 2/23/2024
2.1.30 80 2/23/2024
2.1.29 230 2/22/2024
2.1.28 224 2/21/2024
2.1.27 220 2/20/2024
2.1.26 171 2/19/2024
2.1.25 88 2/16/2024
2.1.24 177 2/15/2024
2.1.23 324 2/14/2024
2.1.22 202 2/13/2024
2.1.21 175 2/12/2024
2.1.20 187 2/9/2024
2.1.19 191 2/8/2024
2.1.18 184 2/7/2024
2.1.17 98 2/6/2024
2.1.16 251 2/5/2024
2.1.15 272 2/1/2024
2.1.14 504 1/31/2024
2.1.13 153 1/30/2024
2.1.12 219 1/29/2024
2.1.11 219 1/26/2024
2.1.10 196 1/25/2024
2.1.9 150 1/24/2024
2.1.8 191 1/23/2024
2.1.7 144 1/22/2024
2.1.6 249 1/16/2024
2.1.5 173 1/12/2024
2.1.4 195 1/11/2024
2.1.3 198 1/10/2024
2.1.2 198 1/9/2024
2.1.1 177 1/7/2024
2.1.0 570 12/28/2023
2.0.74 145 12/27/2023
2.0.73 348 12/21/2023
2.0.72 183 12/20/2023
2.0.71 194 12/19/2023
2.0.70 187 12/18/2023
2.0.69 190 12/15/2023
2.0.68 216 12/14/2023
2.0.67 301 12/13/2023
2.0.66 840 12/5/2023
2.0.65 248 11/24/2023
2.0.64 194 11/23/2023
2.0.63 169 11/22/2023
2.0.62 169 11/21/2023
2.0.61 167 11/20/2023
2.0.60 318 11/17/2023
2.0.59 205 11/16/2023
2.0.58 241 11/15/2023
2.0.57 148 11/13/2023
2.0.56 169 11/9/2023
2.0.55 151 11/8/2023
2.0.54 163 11/7/2023
2.0.53 203 11/6/2023
2.0.52 239 11/3/2023
2.0.51 265 11/1/2023
2.0.50 186 10/31/2023
2.0.49 209 10/30/2023
2.0.48 215 10/27/2023
2.0.47 225 10/26/2023
2.0.46 198 10/25/2023
2.0.45 222 10/17/2023
2.0.44 218 10/13/2023
2.0.43 230 10/11/2023
2.0.42 293 10/4/2023
2.0.41 201 9/26/2023
2.0.40 177 9/25/2023
2.0.39 227 9/21/2023
2.0.38 180 9/20/2023
2.0.37 188 9/19/2023
2.0.36 196 9/18/2023
2.0.35 253 9/15/2023
2.0.34 193 9/14/2023
2.0.33 206 9/13/2023
2.0.32 257 9/12/2023
2.0.31 232 9/11/2023
2.0.30 326 9/8/2023
2.0.29 230 9/7/2023
2.0.28 213 9/6/2023
2.0.27 224 9/5/2023
2.0.26 263 9/4/2023
2.0.25 288 9/1/2023
2.0.24 231 8/31/2023
2.0.23 256 8/30/2023
2.0.22 257 8/29/2023
2.0.21 268 8/28/2023
2.0.20 265 8/25/2023
2.0.19 221 8/24/2023
2.0.18 209 8/23/2023
2.0.17 213 8/22/2023
2.0.16 251 8/18/2023
2.0.15 200 8/17/2023
2.0.14 216 8/16/2023
2.0.13 986 8/10/2023
2.0.12 198 8/9/2023
2.0.11 264 8/8/2023
2.0.10 155 8/7/2023
2.0.9 141 8/3/2023
2.0.8 129 8/2/2023
2.0.7 156 7/27/2023
2.0.6 133 7/26/2023
2.0.5 160 7/25/2023
2.0.4 160 7/20/2023
2.0.3 142 7/19/2023
2.0.2 187 7/17/2023
2.0.1 1,629 12/28/2022
2.0.0 359 12/12/2022
1.0.41 322 12/9/2022
1.0.40 482 6/10/2022
1.0.38 598 4/12/2022
1.0.37 480 1/11/2022
1.0.35 444 9/14/2021
1.0.34 363 8/24/2021
1.0.33 389 7/26/2021
1.0.32 494 6/1/2021
1.0.30 427 5/20/2021
1.0.26 341 5/20/2021
1.0.25 357 5/20/2021
1.0.24 316 5/20/2021
1.0.22 352 5/19/2021
1.0.21 342 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 352 4/30/2021
1.0.14 345 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 339 4/24/2021