Comments (1)
I can certainly follow you.
In a sense, the folklore of "the tester needs to be mindful of testing corner cases" translates to
"the PBT tester needs to be mindful of generating corner cases".
A personal pet-peeve here is https://github.com/jmid/qc-ptrees where changing the int
generator to the following made a difference between finding a bug and not finding it: https://github.com/jmid/qc-ptrees/blob/f3c01664e76bc3944f48e155cb410db8317baf06/qctest.ml#L84-L89
I admit this situation is not particularly satisfactory though.
That said, I'm very hesitant about making such a change as it makes generators stateful by default.
This means that simple generator transformations such as:
utop # let g = QCheck2.Gen.small_int;;
val g : int QCheck2.Gen.t = <abstr>
utop # QCheck2.Gen.(generate1 ~rand:(Random.State.make [|123|]) (pair g g));;
- : int * int = (6, 3)
utop # QCheck2.Gen.(generate1 ~rand:(Random.State.make [|123|]) (pair g g));;
- : int * int = (6, 3)
will no longer hold in the default case:
utop # let g = QCheck2.Gen.small_int_corners ();;
val g : int QCheck2.Gen.t = <abstr>
utop # QCheck2.Gen.(generate1 ~rand:(Random.State.make [|123|]) (pair g g));;
- : int * int = (1, 0)
utop # QCheck2.Gen.(generate1 ~rand:(Random.State.make [|123|]) (pair g g));;
- : int * int = (4611686018427387903, 2)
This will hurt QCheck/QCheck2's ability to reproduce pseudo-random runs, as behaviour now depends on both the random seed and the internal state of all involved generators.
A less invasive option is compose a non-stateful int
-generator like above.
Here's an example of less trivial one - which I learned from @jlouis some years ago.
This has a greater chance of producing corner cases (and can be further composed with Gen.oneof
):
(* sign * pow(2, k) + [-3;3] *)
let int_gen =
(Gen.map3
(fun sign expo addition ->
let n = 1 lsl expo in
let n = if sign then -n else n in
n+addition)
Gen.bool (Gen.int_range 0 63) (Gen.int_range (-3) 3));;
from qcheck.
Related Issues (20)
- Disable QCheck2 shrinker with a parameter HOT 3
- Generator reproducability with function generators
- Add range_subset, pos_split2, nat_split2, pos_split, nat_split to QCheck2
- QCheck int shrinker produces duplicates
- Share some code between QCheck and QCheck2
- Missing QCheck.Shrink.bool HOT 1
- Extend expect tests to OCaml 5.0
- count cannot be zero HOT 4
- custom stopping criteria for tests HOT 1
- QCheck.numeral_string may shrink to non-numerals HOT 1
- Rename default branch HOT 1
- Add warning to Gen.generate* functions
- Add opam package descriptions
- Non-minimal list counter examples HOT 2
- ppx_deriving_qcheck cannot derive a generator from a recursive type declaration with containers HOT 4
- missing usage with dune HOT 5
- Lower ppx_deriving_qcheck's qcheck dependency
- Switch to ocaml-ci
- Less exhaustive string shrinking HOT 7
- Documentation - role of `Gen.t` vs. `arbitrary` HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from qcheck.