首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为Intellitest生成的每个测试添加断言的位置

为Intellitest生成的每个测试添加断言的位置
EN

Stack Overflow用户
提问于 2016-02-09 05:54:26
回答 2查看 855关注 0票数 6

在这里,我将用一个例子来解释这个问题。原来的问题更抽象地提出了这个问题。不过没必要看。

更新:以问题为例

假设我们已经实现了这个buggy函数来查找int[]的min:

代码语言:javascript
复制
public int MyMin(int[] data)
{
    int min = 1000;

    for (int i = 1; i < data.Length; i++)
    {
        if (data[i] < min)
        {
            min = data[i];
        }
    }

    return min;
}

在此函数上运行Intellitest将提供给我们:

注意,对于测试#4和#6,由于其错误的实现,函数没有正确地计算最小值。然而,这些测试是通过的,这是不希望的。

Intellitest无法神奇地确定我们预期的MyMin行为,并在这些输入上完成测试失败。但是,如果我们能够手动为这些测试指定所需的结果,那就太好了。

@michał-komorowski的解决方案是可行的,但是对于每个测试用例,我必须以łs的形式重复它的输入。是否有一种更优雅/干净的方法来指定测试输入的期望输出?

原始问题

Intelitest生成一个可修改的参数化测试,并且可以在那里添加通用/全局断言。它还生成了最大限度地扩大代码覆盖范围的最小输入数。Intellitest将输入存储为单个单元测试,每个单元都使用精心编制的输入调用参数化测试。

我正在寻找一种方法,以增加每个输入断言。

由于每个输入都作为一个单元测试函数存储在一个.g.cs文件中,所以可以在那里添加断言。问题是,这些函数不应该由用户自定义,因为它们在以后的运行中会被Intellitest覆盖。

为每个单元测试添加断言的推荐方法是什么?

EN

回答 2

Stack Overflow用户

发布于 2016-02-09 07:49:24

不应该向测试方法(带有[TestMethod]属性的方法)添加断言。它们仅用于提供参数值。放置断言的地方是带有[PexMethod]属性的方法。

乍一看,这可能是一个限制。但是,如果我们考虑IntelliTest是如何工作的,就没有必要为每个输入添加断言,因为输入可以随时被删除、更新或创建。例如,当:

  • 一种正在测试的方法被改变了。
  • 采用PexAssume类。
  • 更改了PexMethod属性的配置。

但是,您可以做其他的事情,即为正在测试的方法添加多个"Pex方法“,并使用PexAssume。例如,假设我们有BubbleSort方法,并且希望根据输入数组的长度定义不同的断言。

代码语言:javascript
复制
[PexMethod]
public void BubbleSort(int[] a)
{
    PexAssume.IsTrue(a.Length == 5);
    int[] result = Program.BubbleSort(a);
    // Assertions specific for an array with 5 elements
}

[PexMethod]
public void BubbleSort(int[] a)
{
    PexAssume.IsTrue(a.Length == 10);
    int[] result = Program.BubbleSort(a);
    // Assertions specific for an array with 10 elements
}
票数 2
EN

Stack Overflow用户

发布于 2016-04-12 17:05:05

这个答案建立在前一个答案的基础上。更具体的是被问到的问题。

Pex为所有代码路径生成一个测试,但对代码一无所知。您仍然必须在PUT (参数化单元测试)中安排/执行/断言,以告诉Pex您认为您的代码应该如何工作。此外,还可以在排列之前添加“假设”,以便模式为“假设/安排/行为/断言”。

对于您的例子,我从这个PUT开始。

代码语言:javascript
复制
    [PexMethod(MaxRunsWithoutNewTests = 200)]
    [PexAllowedException(typeof(NullReferenceException))]
    public int  MyMin([PexAssumeUnderTest]Class1 target, int[] data)
    {
        //assume
        PexAssume.IsTrue(data.Length == 1);
        //arrange
        data[0] = 0;

        //act
        int result = target.MyMin(data);

        //assert
        PexAssert.AreEqual(0, result);
        return result;
    }

结果表明,只覆盖了3/8块,测试2没有达到预期的“0”,得到了“1000”。

这告诉我,我需要看一下代码,找出我为什么得到1000。

我看到我用1而不是0开始for循环。因此,我修复了代码,并再次运行IntelliTest。

这一次我通过了两次考试,这是很好的。但只有6/8块进行了测试。我漏掉了什么。

我创建了一个新的PUT,它允许Pex生成如下所示的数据。

代码语言:javascript
复制
    [PexMethod(MaxRunsWithoutNewTests = 200)]
    [PexAllowedException(typeof(NullReferenceException))]
    public int MyMin2([PexAssumeUnderTest]Class1 target, int[] data)
    {
        //assume

        //act
        int result = target.MyMin(data);

        //assert
        return result;
    }

现在我有7个单元测试,它执行所有代码路径和所有测试通过。

您会注意到,每个PUT都生成自己的测试集。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35284863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档