Tips and Best Practices

Performance

Setting opt-level

Both the proptest crate and the random number generator it uses can be CPU intensive. If you are generating a lot of cases you may see a significant performance improvement by setting the opt-level to 3 in your Cargo.toml file:

[profile.test.package.proptest]
opt-level = 3

[profile.test.package.rand_chacha]
opt-level = 3

Reusing mutable resources

Sometimes you may want to reuse mutable resources across individual cases. For example, you may want to reuse a database connection or a file handle to avoid the overhead of opening and closing it for each case. Because the proptest! macro (when used with closure-style invocation) requires a Fn, you need to wrap your state in a RefCell:

#![allow(unused)]
fn main() {
extern crate proptest;
use std::cell::RefCell;
use proptest::proptest;

struct ConnectionPool {};
struct MyConnection {};
impl ConnectionPool {
   fn new() -> Self { Self {} }
   fn connect(&mut self) -> MyConnection { MyConnection {} }
}
#[test]
fn dummy() {}; // This is here to make the doctest work
fn test_with_shared_connection() {
    let mut my_conn = RefCell::new(ConnectionPool::new().connect());
    proptest!(|(x in 0..42)| {
        let mut conn = my_conn.borrow_mut();
        // Use state
    });
}
}