Erlang 为基于属性的测试生成随机规则
我正在使用(erlang quickcheck),为我的程序生成一组好的规则时遇到了问题 我要生成的内容如下所示:Erlang 为基于属性的测试生成随机规则,erlang,quickcheck,triq,Erlang,Quickcheck,Triq,我正在使用(erlang quickcheck),为我的程序生成一组好的规则时遇到了问题 我要生成的内容如下所示: A -> B {rule, [a], [1,2,4,5]} {rule, [a], [a,d,c,e]} {rule, [a], [q,d,3,4]} 我想提供A和B的大小,后者没有任何副本 例如,如果我说使用大小为4的L.H.S.[a]和R.H.S.生成规则(即a=[a]和size(B)=4),我希望得到如下结果: A -> B {rule, [a], [1,2
A -> B
{rule, [a], [1,2,4,5]}
{rule, [a], [a,d,c,e]}
{rule, [a], [q,d,3,4]}
我想提供A
和B
的大小,后者没有任何副本
例如,如果我说使用大小为4的L.H.S.[a]
和R.H.S.生成规则(即a=[a]
和size(B)=4
),我希望得到如下结果:
A -> B
{rule, [a], [1,2,4,5]}
{rule, [a], [a,d,c,e]}
{rule, [a], [q,d,3,4]}
注意,我不想在B中出现任何重复(这是我遇到麻烦的部分)。同样,B由什么组成并不重要——它可以是任何东西,只要它是独特的,没有重复
我的规范太凌乱,无法在这里显示,所以我不想在这里显示。我不熟悉Triq,但在property和Quviq的Qickcheck中,您可以使用过滤“坏”实例的条件 如果生成的实例不满足这样的约束,它将被丢弃,并且不会被视为有效测试。您可以使用此机制生成指定大小的列表(即适当调用的“向量”),然后丢弃那些具有重复项的列表,但我认为会丢弃太多实例(另请参见链接) 通常更有效的方法是修补生成器,使所有的实例都有效,例如生成(3)X倍的元素,删除重复项并保留所需的数量。这仍然可能失败,而且它将失败,因此您需要防范它 以下是适用于您的案例的生成器,以及一个虚拟属性:
-module(dummy).
-export([rule_prop/0]).
-include_lib("proper/include/proper.hrl").
-define(X, 5).
rule_prop() ->
?FORALL(_, rule_gen(integer(), 4, integer()), true).
rule_gen(A, SizeB, TypeB) ->
?LET(
EnoughB,
?SUCHTHAT(
NoDupB,
?LET(
ManyB,
vector(?X * SizeB, TypeB),
no_dups(ManyB)
),
length(NoDupB) >= SizeB
),
begin
B = lists:sublist(EnoughB, SizeB),
{rule, A, B}
end).
no_dups([]) ->
[];
no_dups([A|B]) ->
[A | no_dups([X || X <- B, X =/= A])].
-模块(虚拟)。
-导出([rule_prop/0])。
-include_lib(“property/include/property.hrl”)。
-定义(X,5)。
规则_prop()->
?FORALL(u,rule_gen(integer(),4,integer()),true)。
规则(A、尺寸B、类型B)->
?让(
伊诺布,
?诸如此类(
诺杜布,
?让(
很多,
向量(?X*SizeB,B型),
无重复(多个)
),
长度(nodubb)>=SizeB
),
开始
B=列表:子列表(EnoughB,SizeB),
{规则,A,B}
(完)。
无重复([])->
[];
无重复([A | B])->
[A | no | u dups([X | | | X谢谢,只有一个问题:为什么我们生成的数量是3倍?数字3是特殊的,还是你的意思是我们只需要生成比需要更多的?不,它不是,它只是“确保”删除重复项后将保留足够多的不同元素。这是否总是会生成某些内容?哦,好的,我终于得到了它。您只生成比所需更大的列表,然后将它们变小。非常感谢。这意味着?这样的失败时,元素的数量只有原来的3倍。对于包含10个唯一整数()的列表
elements,50个元素似乎还可以,但这可能也是一个适当的错误。