Merge #16645: doc: initial RapidCheck property-based testing documentation
8616c81f08
doc: initial RapidCheck property-based testing documentation (Jon Atack) Pull request description: This commit proposes documentation that would have been helpful to me when setting up RapidCheck to work correctly with Bitcoin Core. I tested these instructions repeatedly with Linux (Debian 4.19 / GCC 8.3) and macOS (10.14.6 / AppleClang 10). The markdown version can be seen at https://github.com/jonatack/bitcoin/blob/rapidcheck-documentation/doc/rapidcheck.md. ACKs for top commit: fanquake: ACK8616c81f08
- Thanks for updating. Tree-SHA512: 9c2a65f0eb99f59e9adfea82855f217727a8a9d30618c1c0bdd2a73ae9c1ee61bc7efd59fc8703a666d182ad4220e22d6034ac3109311e6573dad00dfa4b06ea
This commit is contained in:
commit
bd62f8d6ee
1 changed files with 84 additions and 0 deletions
84
doc/rapidcheck.md
Normal file
84
doc/rapidcheck.md
Normal file
|
@ -0,0 +1,84 @@
|
|||
# RapidCheck property-based testing for Bitcoin Core
|
||||
|
||||
## Concept
|
||||
|
||||
Property-based testing is experimentally being added to Bitcoin Core with
|
||||
[RapidCheck](https://github.com/emil-e/rapidcheck), a C++ framework for
|
||||
property-based testing inspired by the Haskell library
|
||||
[QuickCheck](https://hackage.haskell.org/package/QuickCheck).
|
||||
|
||||
RapidCheck performs random testing of program properties. A specification of the
|
||||
program is given in the form of properties which functions should satisfy, and
|
||||
RapidCheck tests that the properties hold in a large number of randomly
|
||||
generated cases.
|
||||
|
||||
If an exception is found, RapidCheck tries to find the smallest case, for some
|
||||
definition of smallest, for which the property is still false and displays it as
|
||||
a counter-example. For example, if the input is an integer, RapidCheck tries to
|
||||
find the smallest integer for which the property is false.
|
||||
|
||||
## Running
|
||||
|
||||
If RapidCheck is installed, Bitcoin Core will automatically run the
|
||||
property-based tests with the unit tests during `make check`, unless the
|
||||
`--without-rapidcheck` flag is passed when configuring.
|
||||
|
||||
For more information, run `./configure --help` and see `--with-rapidcheck` under
|
||||
Optional Packages.
|
||||
|
||||
## Setup
|
||||
|
||||
The following instructions have been tested with Linux Debian and macOS.
|
||||
|
||||
1. Clone the RapidCheck source code and cd into the repository.
|
||||
|
||||
```shell
|
||||
git clone https://github.com/emil-e/rapidcheck.git
|
||||
cd rapidcheck
|
||||
```
|
||||
|
||||
2. Build RapidCheck (requires CMake to be installed).
|
||||
|
||||
```shell
|
||||
cmake -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true -DRC_ENABLE_BOOST_TEST=ON $(pwd)
|
||||
make && make install
|
||||
```
|
||||
|
||||
3. Configure Bitcoin Core with RapidCheck.
|
||||
|
||||
`cd` to the directory of your local bitcoin repository and run
|
||||
`./configure`. In the output you should see:
|
||||
|
||||
```shell
|
||||
checking rapidcheck.h usability... yes
|
||||
checking rapidcheck.h presence... yes
|
||||
checking for rapidcheck.h... yes
|
||||
[...]
|
||||
Options used to compile and link:
|
||||
[...]
|
||||
with test = yes
|
||||
with prop = yes
|
||||
```
|
||||
|
||||
4. Build Bitcoin Core with RapidCheck.
|
||||
|
||||
Now you can run `make` and should see the property-based tests compiled with
|
||||
the unit tests:
|
||||
|
||||
```shell
|
||||
Making all in src
|
||||
[...]
|
||||
CXX test/gen/test_bitcoin-crypto_gen.o
|
||||
CXX test/test_bitcoin-key_properties.o
|
||||
```
|
||||
|
||||
5. Run the unit tests with `make check`. The property-based tests will be run
|
||||
with the unit tests.
|
||||
|
||||
```shell
|
||||
Running tests: crypto_tests from test/crypto_tests.cpp
|
||||
[...]
|
||||
Running tests: key_properties from test/key_properties.cpp
|
||||
```
|
||||
|
||||
That's it! You are now running property-based tests in Bitcoin Core.
|
Loading…
Reference in a new issue