是否有针对C#.Net 2.0的基于规范的测试框架?

时间:2020-03-05 18:57:20  来源:igfitidea点击:

例如,Reductio(对于Java / Scala)和QuickCheck(对于Haskell)。我正在考虑的那种框架将为内置数据类型提供"生成器",并允许程序员定义新的生成器。然后,程序员将使用适当类型的变量作为参数来定义断言某些属性的测试方法。然后,框架会为参数生成一堆随机数据,并对该方法进行数百次测试。

例如,如果我实现了Vector类,并且它具有add()方法,则可能要检查我的加法通勤。所以我会写一些类似的东西(用伪代码):

boolean testAddCommutes(Vector v1, Vector v2) {
    return v1.add(v2).equals(v2.add(v1));
}

我可以在两个特定的向量上运行testAddCommutes()来查看该加法是否通勤。但是,我没有编写一些调用testAddCommutes的方法,而是编写了一个生成任意Vector的过程。鉴于此,框架可以在数百种不同的输入上运行testAddCommutes。

这会给任何人敲响钟声吗?

解决方案

回答

我可能无法正确理解我们,但请检查一下...

http://www.ayende.com/projects/rhino-mocks.aspx

回答

我可能也不太理解,但是PEX可能对我们有用。

回答

有FsCheck,它是从QuickCheck到Fand以及C#的端口,尽管大多数文档似乎都是针对f#的。
我也一直在探索这些想法。参见:http://kilfour.wordpress.com/2009/08/02/testing-tool-tour-quicknet-preview/

回答

为了详细说明我先前的论述,测试伪代码示例的QN代码如下所示:

new TestRun(1, 1000)
    .AddTransition(new MetaTransition<Input<Vector, Vector>, Vector>
    {
        Name = "Vector Add ",
        Generator = DoubleVectorGenerator,
        Execute = input => input.paramOne.Add(input.paramTwo)
    }
    .RegisterProperty(
        (input, output) =>
            new QnProperty(
                "Is Communative",
                () => QnAssert.IsTrue(output == input.paramTwo.Add(input.paramOne) )
            )
        )
    )
    .Verify()
    .RethrowLastFailureifAny()
    .ReportPropertiesTested(new ConsoleReporter());

其中DoubleVectorGenerator是用户定义的类,提供Input <Vector,Vector>类型的值。