在这里,我将用一个例子来解释这个问题。原来的问题更抽象地提出了这个问题。不过没必要看。
更新:以问题为例
假设我们已经实现了这个buggy函数来查找int[]的min:
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覆盖。
为每个单元测试添加断言的推荐方法是什么?
发布于 2016-02-09 07:49:24
不应该向测试方法(带有[TestMethod]属性的方法)添加断言。它们仅用于提供参数值。放置断言的地方是带有[PexMethod]属性的方法。
乍一看,这可能是一个限制。但是,如果我们考虑IntelliTest是如何工作的,就没有必要为每个输入添加断言,因为输入可以随时被删除、更新或创建。例如,当:
PexAssume类。PexMethod属性的配置。但是,您可以做其他的事情,即为正在测试的方法添加多个"Pex方法“,并使用PexAssume。例如,假设我们有BubbleSort方法,并且希望根据输入数组的长度定义不同的断言。
[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
}发布于 2016-04-12 17:05:05
这个答案建立在前一个答案的基础上。更具体的是被问到的问题。
Pex为所有代码路径生成一个测试,但对代码一无所知。您仍然必须在PUT (参数化单元测试)中安排/执行/断言,以告诉Pex您认为您的代码应该如何工作。此外,还可以在排列之前添加“假设”,以便模式为“假设/安排/行为/断言”。
对于您的例子,我从这个PUT开始。
[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生成如下所示的数据。
[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都生成自己的测试集。
https://stackoverflow.com/questions/35284863
复制相似问题