当我学习使用Evosuite时,我写了一些错误的方法。例如,在其中一个例子中,类A的方法直接调用接口B的抽象方法,EvoSuite为B生成了一个模拟,以避免出现失败的情况:
import org.junit.Test;
import static org.junit.Assert.*;
import static org.evosuite.shaded.org.mockito.Mockito.*;
import MockTest.A;
import MockTest.B;
import org.evosuite.runtime.EvoRunner;
import org.evosuite.runtime.EvoRunnerParameters;
import org.evosuite.runtime.ViolatedAssumptionAnswer;
import org.junit.runner.RunWith;
@RunWith(EvoRunner.class) @EvoRunnerParameters(useVNET = true, separateClassLoader = true, useJEE = true)
public class A_ESTest extends A_ESTest_scaffolding {
@Test(timeout = 4000)
public void test0() throws Throwable {
A a0 = new A();
B b0 = mock(B.class, new ViolatedAssumptionAnswer());
doReturn((String) null).when(b0).get(anyInt());
String string0 = a0.test(b0);
assertNull(string0);
}
}对于可能发生除以零的方法,EvoSuite生成的测试用例甚至捕获异常以确保测试用例通过:
import org.junit.Test;
import static org.junit.Assert.*;
import static org.evosuite.runtime.EvoAssertions.*;
import org.evosuite.runtime.EvoRunner;
import org.evosuite.runtime.EvoRunnerParameters;
import org.junit.runner.RunWith;
import test.Case2;
@RunWith(EvoRunner.class) @EvoRunnerParameters(useVNET = true, separateClassLoader = true, useJEE = true)
public class Case2_ESTest extends Case2_ESTest_scaffolding {
@Test(timeout = 4000)
public void test8() throws Throwable {
Case2 case2_0 = new Case2();
// Undeclared exception!
try {
case2_0.add(6, 0);
fail("Expecting exception: ArithmeticException");
} catch(ArithmeticException e) {
//
// / by zero
//
verifyException("test.Case2", e);
}
}
}EvoSuite的自动生成的测试用例是否总是通过,就像在这些例子中一样?如何使EvoSuite生成可能失败的测试用例,从而可以被开发人员直接使用?
发布于 2018-08-22 14:06:06
EvoSuite的自动生成的测试用例是否总是通过,就像在这些例子中一样?
EvoSuite站点提供了描述该软件的理论和操作的广泛的出版物清单。然而,将其简化为最简单的术语,该软件生成的测试用例检测被测试软件中的突变,这些突变会改变其行为,并且不会被现有的测试捕获。因此,测试中软件的实际行为是基线,因此在未经修改的软件上,生成的测试都不应该失败。
如何使EvoSuite生成可能失败的测试用例,从而可以被开发人员直接使用?
我不认为任何软件都能做到这一点。EvoSuite应该如何识别软件的任何特定行为是不正确的,从而生成失败案例?考虑一下你的除以零的例子。当第二个参数为0时,被测试的方法显然会抛出一个ArithmeticException。EvoSuite怎么会知道这个方法不应该这么做呢?
如果软件能够先验地识别被测试的代码应该做什么,那么更好地应用这一了不起的壮举就是让它(重新)编写实际的代码。
但这并不意味着开发人员不能使用EvoSuite测试。开发人员至少可以通过以下方式使用它们:
widget.frob()抛出了一个意外的UpYoursException,但导致此情况的原因尚不清楚。您的EvoSuite测试很有可能已经显示了从受影响的方法中引出此异常的至少一种方法。这可能不符合“直接”使用测试的条件,但这是不尝试提前清除不正确的自动测试用例的理由(同时也不修复测试中的代码)。底线: EvoSuite提供了对手写测试用例的补充,而不是替代它们。
https://stackoverflow.com/questions/51951069
复制相似问题