| # FuzzTest | |
| ## What is FuzzTest? | |
| FuzzTest is a C++ testing framework for writing and executing *fuzz tests*, | |
| which are property-based tests executed using coverage-guided fuzzing under the | |
| hood. Fuzz tests are like regular unit tests, but more generic and more | |
| powerful. Instead of saying: "for this specific input, we expect this specific | |
| output", we can say: "for these types of input, we expect this generic property | |
| to be true". For example: | |
| ```c++ | |
| void MyApiAlwaysSucceedsOnPositiveIntegers(int i) { | |
| bool success = MyApi(i); | |
| EXPECT_TRUE(success); | |
| } | |
| FUZZ_TEST(MyApiTest, MyApiAlwaysSucceedsOnPositiveIntegers) | |
| .WithDomains(/*i:*/fuzztest::Positive<int>()); | |
| ``` | |
| It is our latest fuzz testing technology and the successor of previously used | |
| fuzzing tools, such as [libFuzzer](https://llvm.org/docs/LibFuzzer.html). It | |
| allows you to write powerful fuzz tests more easily than with previously used | |
| [fuzz targets](https://llvm.org/docs/LibFuzzer.html#fuzz-target). You can use it | |
| together with [GoogleTest](https://google.github.io/googletest/), or other unit | |
| testing frameworks, allowing you to write fuzz test side by side with regular | |
| unit tests, and just as easily. | |
| It is a first-of-its-kind tool that bridges the gap between fuzzing and | |
| property-based testing, as it is both: | |
| 1. a testing framework with a rich [API](doc/domains-reference.md) (akin to | |
| property-based testing libraries), and | |
| 2. a coverage-guided fuzzing engine (akin to | |
| [AFL](https://github.com/google/AFL) or | |
| [libFuzzer](https://llvm.org/docs/LibFuzzer.html)). | |
| ## Who is it for? | |
| FuzzTest is for *everyone* who writes C++ code. (Currently, only C++ is | |
| supported.) Fuzz testing is a proven testing technique that has found | |
| [tens of thousands of bugs](https://github.com/google/oss-fuzz#trophies). With | |
| the FuzzTest framework writing these tests becomes a breeze. Because fuzz tests | |
| are more generic, they are more powerful than regular unit tests. They can find | |
| tricky edge cases automatically for us, edge cases that most likely we would | |
| never think of. | |
| You can write fuzz tests as easily as you write unit tests using GoogleTest for | |
| example. Simply use the [`FUZZ_TEST`](doc/fuzz-test-macro.md) macro like you | |
| would use GoogleTest's `TEST` macro. | |
| ## Who uses it? | |
| At Google, FuzzTest is widely used and software engineers love it. It has | |
| replaced the old style of writing | |
| [fuzz targets](https://llvm.org/docs/LibFuzzer.html#fuzz-target). | |
| ## How do I use it? | |
| To get started, read the [Quickstart with Bazel](doc/quickstart-bazel.md) or | |
| [Quickstart with CMake](doc/quickstart-cmake.md), then take a look at the | |
| [Overview](doc/overview.md) and the [Codelab](doc/tutorial.md). | |
| Once you have a high level understanding about fuzz tests, consider reading the | |
| rest of the documentation, including the: | |
| * [Use Cases](doc/use-cases.md) | |
| * [FUZZ_TEST Macro Reference](doc/fuzz-test-macro.md) | |
| * [Domains Reference](doc/domains-reference.md) | |
| ## I need help! | |
| If you have a question or encounter a bug, please file an | |
| [issue on GitHub](https://github.com/google/fuzztest/issues). |