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.
这将为您提供无限的重复值序列.然后可以在任何序列上定义“跳转”功能吗?
标签:unit-testing,nunit,testing,c 来源: https://codeday.me/bug/20191119/2039140.html