c#-在无限序列上创建NUnit测试

我有这种方法:

public static IEnumerable<T> Jumping<T>( this IEnumerable<T> sequence, int step)
{
    if(sequence==null)
        throw new ArgumentNullException();
    if(step<0)
        throw new ArgumentOutOfRangeException();
    var s = sequence.GetEnumerator();
    for (int i = 0; i <= step; i++)
    {
        if (!s.MoveNext())
        {
            s.Reset();
            s.MoveNext();
        }
        if (i == step)
        {
            i = 0;
            yield return s.Current;
        }
    }
}

请求是创建具有无限序列的NUnit测试,我该怎么办?

解决方法:

意识到单元测试比数学更等同于(硬)科学,这可能会有所帮助.单元测试套件很少能证明任何内容,但是,如果所有测试均通过,则被测系统就可以正常运行.

通过这种实现,当您拥有无限序列时,您需要编写一组测试以共同证明Jumping的行为正确.

虽然您无法测试无限序列,但可以从该序列中获取任意数量的元素,然后对此类有限序列进行断言.

这听起来很适合基于属性的测试.从无限序列中抽取随机数量的元素,然后开始定义前提条件和后置条件,这些条件必须适用于一系列随机生成的输入序列和元素计数.

您可能需要定义多个属性,才能涵盖Jumping方法的所需行为.

就是说,我发现很难确切地理解Jumping的作用,但似乎做的不止一件事. AFAICT,它既重复输入序列,又跳过元素.这种复杂的行为可能使得很难为其定义属性.

可以将这种行为分解为较小的功能吗?

例如,为了无限重复一个序列,Haskell定义了一个cycle function.在F#中,您可以从现有函数中轻松定义一个循环函数:

let cycle xs = Seq.initInfinite (fun _ -> xs) |> Seq.concat

在C#中,您可以使用while(true)循环和一些yield语句执行类似的操作.

为这样的循环函数定义属性相当容易,包括:

>如果xs也为无限,则取计数xs应等于
取任意计数值的计数(周期xs).
>如果xs是有限的,则xs应该等于(取(长度xs)(周期xs)).
>如果xs是有限的,则对于长度为xs的倍数的任何计数,最后一次计数的xs元素(周期xs)应等于xs.

这将为您提供无限的重复值序列.然后可以在任何序列上定义“跳转”功能吗?

上一篇:CentOS 7 安装Graphite


下一篇:6 张图带你彻底搞懂分布式事务 XA 模式