-
Notifications
You must be signed in to change notification settings - Fork 74
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add a check
submodule that provides a mini property-based testing framework
#191
Comments
Yes please! I’d be delighted to not have to maintain arbtest, especially given that porting it to Zig for TigerBeetle is on my todo list! I guess my only concern here is that there’s ecosystem pressure to add macros as an entry point to property tests, and to also pass The macro-less API of arbtest that takes a raw unstructured is very intentional. This is required if you do distributed-systems-like testing where you don’t generate input up-front, but rather, in a loop, react to the current state of the system. So, I would strongly prefer if this peculiarity of the API is preserved (but even if it isn`t no big deal, I can write some code of mine to that effect). |
One other thing here: the shrinking in arbtest is criminally dumb (the input stream of bytes is just discarded, there’s no attempt to tweak it locally), so it might be good to spend some effort investigating whether it can be made 10x more efficient with little effort. https://github.com/jlink/shrinking-challenge is one set of benchmarks there (hat tip to @stevana for that!) |
You'd be very welcome to continue helping out with
I think maintaining a macro-less API is very doable. We should be able to do something like pub fn check_raw(property: impl Fn(&mut Unstructured) -> Result<()>) {
// ...
}
pub fn check<A>(property: impl Fn(A) -> Result<()>)
where
A: Arbitrary,
{
check_raw(|u| property(u.arbitrary_take_rest()?));
} Although, at the risk of opening the bike shedding, I think we want to use a
Would be neat if someone could investigate this, but I personally don't have the cycles for it. |
This module should be gated behind a
check
cargo feature.It should provide a really simple property-based testing framework for combining
Arbitrary
-based generators with your oracles/property functions that can be used as smoke tests in local development and on CI, where it is often not always feasible to run the fullcargo fuzz
targets for a while due to various constraints (build time, length of time required to run, etc...). It would not be intended to replace long-running fuzzers leveraging coverage-guided feedback in the background, it would be a compliment to them for the local quick-test and CI uses previously described.This is something I've wanted for a while, because I'm tired of doing it crappily by hand, but have obviously never gotten around to.
But, at some point, @matklad made the
arbtest
crate which is exactly what I'd been imagining, it's fantastic. Thank you very much for creating this, @matklad!So my purposes for opening this issue are to gauge two things:
arbitrary
maintainers: how do you feel about having such a feature/module in this crate?arbtest
into this crate, asarbitrary::check
?The primary advantages I see of moving
arbtest
intoarbitrary::check
, instead of maintaining the current state with separate crates are:arbitrary
arbitrary
features are properly taken advantage of byarbtest
/arbitrary::check
and can make sure that as we develop newarbitrary
features they are designed in such a way thatarbtest
/arbitrary::check
can actually leverage them, resulting in better designs and features overallSo, what do y'all think?
The text was updated successfully, but these errors were encountered: