假设我正在为视频分析编写一些代码.以下是Video类的简化版本:
public class Video
{
public readonly int Width;
public readonly int Height;
public readonly List<int[,]> Frames;
public Video(int width, int height, IEnumerable<int[,]> frames)
{
Width = width;
Height = height;
Frames = new List<int[,]>();
foreach (var frame in frames)
{
if (frame.GetLength(0) != height || frame.GetLength(1) != width)
{
throw new ArgumentException("Incorrect frames dimensions");
}
Frames.Add(frame);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我如何制作Arbitrary<Video>和注册?如何为该任意制作收缩器?
试过这个,无法理解申请是如何运作的:
public static Arbitrary<Video> Videos()
{
var videoGen = Arb.Generate<PositiveInt>()
.SelectMany(w => Arb.Generate<PositiveInt>(), (w, h) => new …Run Code Online (Sandbox Code Playgroud) 无论如何在广义测试套件中包含clojure.spec'd函数?我知道我们可以注册规格和直接规范功能.
(ns foo
(:require [clojure.spec :as s]
[clojure.spec.test :as stest]))
(defn average [list-sum list-count]
(/ list-sum list-count))
(s/fdef average
:args (s/and (s/cat :list-sum float? :list-count integer?)
#(not (zero? (:list-count %))))
:ret number?)
Run Code Online (Sandbox Code Playgroud)
后来,如果我想针对该spec'd函数运行生成测试,我可以使用stest/check.
=> (stest/check `average)
({:spec #object[clojure.spec$fspec_impl$reify__14282 0x68e9f37c "clojure.spec$fspec_impl$reify__14282@68e9f37c"], :clojure.spec.test.check/ret {:result true, :num-tests 1000, :seed 1479587517232}, :sym edgar.core.analysis.lagging/average})
Run Code Online (Sandbox Code Playgroud)
但是i)无论如何都要在我的通用测试套件中包含这些测试运行?我正在考虑test.check所具有的那种clojure.test集成.我能看到的最接近的东西ii)是(见这里)函数.但这似乎只是让我们开始检查repl.不是我想要的.另外,iii)是否注册了功能规格?stest/instrument
(defspec foo-test
100
;; NOT this
#_(prop/for-all [v ...]
(= v …Run Code Online (Sandbox Code Playgroud) 我偶然发现了这个Generative Testing in Clojure with spec想法,并希望了解它.
提供一些例子也非常有用.
functional-programming clojure clojurescript generative-testing clojure.spec
我们假设我有一个生成器users-gen,它生成一组1个或更多用户.另一个参数化生成器调用user-actions-gen,它接受一个或多个用户的序列,并生成这些用户可能执行的一系列操作.
(def user-gen
;; generates a user
...)
(def users-gen
;; sequences of 1 or more users
(gen/such-that not-empty (gen/vector gen/users))
(defn user-actions-gen [users]
;; a action performed by some user from the `users argument
...)
Run Code Online (Sandbox Code Playgroud)
如果我想为users-gen生成的单个用户序列生成单个动作,那么它很简单,只需直接将gen/bind user-gen转换为user-actions-gen.
但是,我想从相同的用户序列生成许多操作.我有这个问题,因为我基本上只是想说"这是状态,让任何随机动作进来,让我们将动作应用到状态,让我们确认状态仍然有效;为所有动作执行此操作. " 我有以下代码.
(defspec check-that-state-is-always-valid
100
(let [state-atm (atom {})]
(prop/for-all
[[actions users]
(gen/bind users-gen
(fn [users]
(gen/tuple
(gen/vector (user-actions-gen users))
(gen/return users))))]
(doseq [action actions
:let [state (swap! state-atm state-atm-transform-fx action)]]
(is (state-still-valid? state))))))
Run Code Online (Sandbox Code Playgroud)
这种作品.问题是:
Clojure有许多用于生成测试的库,例如test.check,test.generative或data.generators.
可以使用更高阶函数来创建可组合的随机数据生成器,例如:
(defn gen [create-fn content-fn lazy]
(fn [] (reduce #(create-fn %1 %2) (for [a lazy] (content-fn)))))
(def a (gen str #(rand-nth [\a \b \c]) (range 10)))
(a)
(def b (gen vector #(rand-int 10) (range 2)))
(b)
(def c (gen hash-set b (range (rand-int 10))))
(c)
Run Code Online (Sandbox Code Playgroud)
这只是一个示例,可以使用不同的参数,过滤器,局部等进行修改,以创建非常灵活的数据生成功能.
是否存在任何生成库可以做的事情,而不仅仅是(或更多)通过编写一些更高阶函数可以简洁地实现?
作为stackoverflow众神的旁注:我不相信这个问题是主观的.我不是要求哪个库更好.我想知道任何/所有数据生成库的哪些特定特征或技术将它们与组成香草高阶函数区分开来.一个示例答案应该说明使用任何库生成随机数据,并解释为什么通过以上面说明的方式组合HOF来做更复杂的事情.
我是 Scala 的新手,正在编写我的第一个 Scalacheck 套件。
我的程序中有一个数据结构,本质上看起来像 a,(List[Double], List[Double])只有当 的每个元素都_1严格大于 的相应元素时,它才是格式良好的_2。
由于它在实践中稍微复杂一些(尽管出于本 MWE 的目的,我们可以假装它已经包含了所有内容),所以我为其编写了一个自定义生成器。
然后我添加了两个简单的测试(包括最简单的1 == 1测试),在这两种情况下测试都失败,并显示消息Gave up after only XX passed tests. YYY tests were discarded.
为什么会这样,我该如何解决?
附件是我的测试套件和输出。
package com.foo.bar
import org.scalacheck._
import Prop._
import Arbitrary._
object FooSpecification extends Properties("FooIntervals") {
type FooIntervals = (List[Double], List[Double])
/* This is supposed to be a tuple of lists s.t. each element of _1
* is < the corresponding element of _2
*
* …Run Code Online (Sandbox Code Playgroud) clojure ×4
testing ×2
unit-testing ×2
c# ×1
clojure.spec ×1
fscheck ×1
quickcheck ×1
scala ×1
scalacheck ×1