Some good links here:

https://github.com/clojure/test.check

But related communities like QuickCheck, ScalaCheck, etc are probably good 
places to look.

Someone should start making something great for test.check on the wiki:

https://github.com/clojure/test.check

Hint hint hint!


On Wednesday, April 30, 2014 3:10:34 PM UTC-5, Tim Visher wrote:
>
> As an aside to the discussion at hand, what papers/books/online 
> articles are good to read to learn about how to come up with good 
> properties and generators? 
>
> On Wed, Apr 30, 2014 at 3:36 PM, Alex Miller 
> <al...@puredanger.com<javascript:>> 
> wrote: 
> > The only hard parts about property based testing are the properties and 
> the 
> > generators. ;) 
> > 
> > On Wednesday, April 30, 2014 6:38:19 AM UTC-5, henry w wrote: 
> >> 
> >> Hi, I wanted to get started with clojure.test.check (formerly 
> >> simple-check) and I am new to property based testing. 
> >> 
> >> I plucked clojure.core/group-by for no particular reason as a function 
> to 
> >> test. 
> >> 
> >> I started by stating some properties i think should hold: 
> >> 
> >> ;; 1. applying the grouping key function to each member in a grouping 
> >> should result in the grouping key 
> >> ;; 2. flattening the vals of the group-by result should give back the 
> >> contents of the original collection. 
> >> ;; 3. no element appears in more than one grouping. 
> > 
> > 
> > those seem good 
> > 
> >> 
> >> 
> >> so far so good I think. there may be others but this seems ok for now. 
> >> 
> >> now, how to generate some data. 
> >> 
> >> for group-by we need two params: 
> >> 1) a grouping function 
> >> 2) a collection of items to be grouped 
> >> 
> >> If I start by naively generating collections of maps (containing 
> keyword 
> >> keys and int vals, for example), the data is of the right shape to use 
> in 
> >> group by, but there is no guarantee that: 
> >> 1) any of the maps share a key that I could use for grouping 
> >> 2) the values under a common key are shared 
> >> 
> >> This is really the crux of my problem.... ideally I would have the 
> >> generator *mostly* produce data which is actually doing to result in 
> the 
> >> sort of collection i might want to call group-by on in real life (ie 
> not 
> >> have everything grouped under nil on each generation). So should i 
> create a 
> >> generator that creates keywords (which i will want to use as grouping 
> >> function) then have another generator that produces what are going to 
> be the 
> >> values under this grouping key, then a generator that uses both of 
> these to 
> >> create collections of maps from these. then i would have to find out 
> what 
> >> the grouping keyword was that was generated.... this could all work, I 
> have 
> >> read enough about generators to have a stab at this... but is it the 
> right 
> >> approach? 
> > 
> > 
> > You don't seem to be leveraging the possibilities of the grouping 
> function. 
> > If you create a grouping function that maps many random values into a 
> small 
> > number of groups, then everything may get easier. Some candidate 
> functions: 
> > first character of the keyword, length of the keyword, etc. 
> > 
> > Or working backwards is often useful with a generator - generate the 
> > grouping values first, then use the inverse of the grouping function to 
> > generate data that maps to that group and populate the input with that. 
> > 
> >> 
> >> 
> >> as far as implementing tests for the properties so far, I have done 
> >> property 2 above, using a basic generator and yanking out an arbitrary 
> key 
> >> from it.... clearly a flawed approach as not much 'realistic' grouping 
> is 
> >> going to happen here. 
> >> 
> >> (def vector-of-maps (gen/such-that not-empty (gen/vector (gen/such-that 
> >> not-empty (gen/map gen/keyword gen/int))))) 
> >> 
> >> (def all-elements-are-grouped 
> >>   (prop/for-all [group-by-input vector-of-maps] 
> >>                 (let [a-map-key (-> group-by-input first keys first)] 
> ;; 
> >> hmm, seems far from ideal 
> >>                   (= (set group-by-input) (-> (group-by a-map-key 
> >> group-by-input) vals flatten set))))) 
> >> 
> >> help appreciated... perhaps I need to learn more about the paradigm 
> first, 
> >> but resources linked from the readme are all a bit more basic than 
> this. so 
> >> if you know of some more advanced tutorials please let me know. 
> >> 
> >> Thanks 
> > 
> > -- 
> > You received this message because you are subscribed to the Google 
> > Groups "Clojure" group. 
> > To post to this group, send email to clo...@googlegroups.com<javascript:> 
> > Note that posts from new members are moderated - please be patient with 
> your 
> > first post. 
> > To unsubscribe from this group, send email to 
> > clojure+u...@googlegroups.com <javascript:> 
> > For more options, visit this group at 
> > http://groups.google.com/group/clojure?hl=en 
> > --- 
> > You received this message because you are subscribed to the Google 
> Groups 
> > "Clojure" group. 
> > To unsubscribe from this group and stop receiving emails from it, send 
> an 
> > email to clojure+u...@googlegroups.com <javascript:>. 
> > For more options, visit https://groups.google.com/d/optout. 
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to