Mecha.xUnit 2.1.102

There is a newer version of this package available.
See the version list below for details.
dotnet add package Mecha.xUnit --version 2.1.102                
NuGet\Install-Package Mecha.xUnit -Version 2.1.102                
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.102" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Mecha.xUnit --version 2.1.102                
#r "nuget: Mecha.xUnit, 2.1.102"                
#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.102

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

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
3.0.0 0 11/25/2024
2.1.124 718 11/12/2024
2.1.123 228 11/11/2024
2.1.122 412 11/5/2024
2.1.121 211 11/4/2024
2.1.120 404 10/30/2024
2.1.119 220 10/29/2024
2.1.118 165 10/29/2024
2.1.117 1,150 10/10/2024
2.1.116 263 10/9/2024
2.1.115 208 10/8/2024
2.1.114 405 10/1/2024
2.1.113 217 9/30/2024
2.1.112 335 9/27/2024
2.1.111 321 9/24/2024
2.1.110 235 9/23/2024
2.1.109 394 9/17/2024
2.1.108 420 9/9/2024
2.1.107 256 9/6/2024
2.1.106 374 9/2/2024
2.1.105 266 8/29/2024
2.1.104 282 8/27/2024
2.1.103 194 8/26/2024
2.1.102 330 8/23/2024
2.1.101 260 8/22/2024
2.1.100 292 8/21/2024
2.1.99 589 8/20/2024
2.1.98 243 8/19/2024
2.1.97 327 8/15/2024
2.1.96 239 8/14/2024
2.1.95 252 8/13/2024
2.1.94 335 8/5/2024
2.1.93 139 8/2/2024
2.1.92 154 8/1/2024
2.1.91 222 7/31/2024
2.1.90 437 7/25/2024
2.1.89 573 7/11/2024
2.1.88 208 7/10/2024
2.1.87 188 7/10/2024
2.1.86 589 7/1/2024
2.1.85 332 6/27/2024
2.1.84 206 6/26/2024
2.1.83 266 6/25/2024
2.1.82 258 6/22/2024
2.1.81 163 6/21/2024
2.1.80 164 6/21/2024
2.1.79 233 6/19/2024
2.1.78 248 6/18/2024
2.1.77 248 6/17/2024
2.1.76 264 6/14/2024
2.1.75 235 6/13/2024
2.1.74 246 6/12/2024
2.1.73 597 5/31/2024
2.1.72 243 5/30/2024
2.1.71 230 5/29/2024
2.1.70 287 5/27/2024
2.1.69 533 5/20/2024
2.1.68 225 5/17/2024
2.1.67 222 5/16/2024
2.1.66 245 5/15/2024
2.1.65 246 5/13/2024
2.1.64 282 5/8/2024
2.1.63 243 5/7/2024
2.1.62 272 5/6/2024
2.1.61 355 5/3/2024
2.1.60 147 5/2/2024
2.1.59 160 5/1/2024
2.1.58 196 4/30/2024
2.1.57 323 4/29/2024
2.1.56 606 4/15/2024
2.1.55 239 4/12/2024
2.1.54 222 4/11/2024
2.1.53 236 4/10/2024
2.1.52 344 4/2/2024
2.1.51 213 4/1/2024
2.1.50 252 3/29/2024
2.1.49 362 3/28/2024
2.1.48 487 3/19/2024
2.1.47 209 3/18/2024
2.1.46 192 3/15/2024
2.1.45 227 3/14/2024
2.1.44 264 3/13/2024
2.1.43 262 3/12/2024
2.1.42 232 3/11/2024
2.1.41 211 3/8/2024
2.1.40 259 3/7/2024
2.1.39 238 3/6/2024
2.1.38 261 3/5/2024
2.1.37 452 3/4/2024
2.1.36 306 3/1/2024
2.1.35 220 2/29/2024
2.1.34 233 2/28/2024
2.1.33 224 2/27/2024
2.1.32 149 2/27/2024
2.1.31 262 2/23/2024
2.1.30 131 2/23/2024
2.1.29 255 2/22/2024
2.1.28 257 2/21/2024
2.1.27 258 2/20/2024
2.1.26 202 2/19/2024
2.1.25 116 2/16/2024
2.1.24 210 2/15/2024
2.1.23 382 2/14/2024
2.1.22 225 2/13/2024
2.1.21 210 2/12/2024
2.1.20 221 2/9/2024
2.1.19 234 2/8/2024
2.1.18 213 2/7/2024
2.1.17 137 2/6/2024
2.1.16 284 2/5/2024
2.1.15 308 2/1/2024
2.1.14 980 1/31/2024
2.1.13 180 1/30/2024
2.1.12 248 1/29/2024
2.1.11 253 1/26/2024
2.1.10 229 1/25/2024
2.1.9 181 1/24/2024
2.1.8 219 1/23/2024
2.1.7 181 1/22/2024
2.1.6 284 1/16/2024
2.1.5 200 1/12/2024
2.1.4 227 1/11/2024
2.1.3 223 1/10/2024
2.1.2 234 1/9/2024
2.1.1 210 1/7/2024
2.1.0 604 12/28/2023
2.0.74 173 12/27/2023
2.0.73 376 12/21/2023
2.0.72 232 12/20/2023
2.0.71 221 12/19/2023
2.0.70 217 12/18/2023
2.0.69 221 12/15/2023
2.0.68 244 12/14/2023
2.0.67 321 12/13/2023
2.0.66 882 12/5/2023
2.0.65 276 11/24/2023
2.0.64 212 11/23/2023
2.0.63 196 11/22/2023
2.0.62 188 11/21/2023
2.0.61 200 11/20/2023
2.0.60 494 11/17/2023
2.0.59 233 11/16/2023
2.0.58 274 11/15/2023
2.0.57 175 11/13/2023
2.0.56 206 11/9/2023
2.0.55 179 11/8/2023
2.0.54 191 11/7/2023
2.0.53 235 11/6/2023
2.0.52 267 11/3/2023
2.0.51 293 11/1/2023
2.0.50 206 10/31/2023
2.0.49 237 10/30/2023
2.0.48 251 10/27/2023
2.0.47 253 10/26/2023
2.0.46 220 10/25/2023
2.0.45 250 10/17/2023
2.0.44 246 10/13/2023
2.0.43 252 10/11/2023
2.0.42 321 10/4/2023
2.0.41 231 9/26/2023
2.0.40 208 9/25/2023
2.0.39 247 9/21/2023
2.0.38 216 9/20/2023
2.0.37 210 9/19/2023
2.0.36 218 9/18/2023
2.0.35 286 9/15/2023
2.0.34 226 9/14/2023
2.0.33 244 9/13/2023
2.0.32 284 9/12/2023
2.0.31 260 9/11/2023
2.0.30 353 9/8/2023
2.0.29 258 9/7/2023
2.0.28 235 9/6/2023
2.0.27 252 9/5/2023
2.0.26 296 9/4/2023
2.0.25 310 9/1/2023
2.0.24 263 8/31/2023
2.0.23 280 8/30/2023
2.0.22 293 8/29/2023
2.0.21 293 8/28/2023
2.0.20 301 8/25/2023
2.0.19 256 8/24/2023
2.0.18 234 8/23/2023
2.0.17 244 8/22/2023
2.0.16 279 8/18/2023
2.0.15 231 8/17/2023
2.0.14 244 8/16/2023
2.0.13 1,438 8/10/2023
2.0.12 230 8/9/2023
2.0.11 287 8/8/2023
2.0.10 177 8/7/2023
2.0.9 172 8/3/2023
2.0.8 161 8/2/2023
2.0.7 188 7/27/2023
2.0.6 147 7/26/2023
2.0.5 195 7/25/2023
2.0.4 184 7/20/2023
2.0.3 172 7/19/2023
2.0.2 215 7/17/2023
2.0.1 1,661 12/28/2022
2.0.0 395 12/12/2022
1.0.41 347 12/9/2022
1.0.40 520 6/10/2022
1.0.38 645 4/12/2022
1.0.37 510 1/11/2022
1.0.35 488 9/14/2021
1.0.34 401 8/24/2021
1.0.33 414 7/26/2021
1.0.32 521 6/1/2021
1.0.30 450 5/20/2021
1.0.26 362 5/20/2021
1.0.25 390 5/20/2021
1.0.24 357 5/20/2021
1.0.22 376 5/19/2021
1.0.21 365 5/19/2021
1.0.20 352 5/18/2021
1.0.17 366 5/18/2021
1.0.16 395 5/3/2021
1.0.15 388 4/30/2021
1.0.14 375 4/29/2021
1.0.10 377 4/26/2021
1.0.9 371 4/26/2021
1.0.8 375 4/26/2021
1.0.7 385 4/26/2021
1.0.6 423 4/24/2021
1.0.5 367 4/24/2021