ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-11-19 22:09:11  阅读:207  来源: 互联网

标签:unit-testing nunit testing c


我有这种方法:

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有