首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过EvoSuite生成失败的测试用例?

如何通过EvoSuite生成失败的测试用例?
EN

Stack Overflow用户
提问于 2018-08-21 14:34:51
回答 1查看 773关注 0票数 2

当我学习使用Evosuite时,我写了一些错误的方法。例如,在其中一个例子中,类A的方法直接调用接口B的抽象方法,EvoSuite为B生成了一个模拟,以避免出现失败的情况:

代码语言:javascript
复制
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生成的测试用例甚至捕获异常以确保测试用例通过:

代码语言:javascript
复制
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生成可能失败的测试用例,从而可以被开发人员直接使用?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-22 14:06:06

EvoSuite的自动生成的测试用例是否总是通过,就像在这些例子中一样?

EvoSuite站点提供了描述该软件的理论和操作的广泛的出版物清单。然而,将其简化为最简单的术语,该软件生成的测试用例检测被测试软件中的突变,这些突变会改变其行为,并且不会被现有的测试捕获。因此,测试中软件的实际行为是基线,因此在未经修改的软件上,生成的测试都不应该失败。

如何使EvoSuite生成可能失败的测试用例,从而可以被开发人员直接使用?

我不认为任何软件都能做到这一点。EvoSuite应该如何识别软件的任何特定行为是不正确的,从而生成失败案例?考虑一下你的除以零的例子。当第二个参数为0时,被测试的方法显然会抛出一个ArithmeticException。EvoSuite怎么会知道这个方法不应该这么做呢?

如果软件能够先验地识别被测试的代码应该做什么,那么更好地应用这一了不起的壮举就是让它(重新)编写实际的代码。

但这并不意味着开发人员不能使用EvoSuite测试。开发人员至少可以通过以下方式使用它们:

  1. 开发人员可以分析生成的测试,以检测被测试软件显示的意外行为。这是一件非常酷和有价值的事情,但也许它不符合“直接”使用测试的条件。
  2. 许多测试将正确地断言预期的行为,这些测试可以作为-在软件的测试套件中使用。与许多软件相比,生成的整体套件将提供更好的反倒退保护。
  3. 即使是断言不正确行为的测试也可能有用,不是预先检测到缺陷,而是在通过其他方法检测到缺陷之后对其进行定性。例如,假设您从字段中得到一个报告,该方法widget.frob()抛出了一个意外的UpYoursException,但导致此情况的原因尚不清楚。您的EvoSuite测试很有可能已经显示了从受影响的方法中引出此异常的至少一种方法。这可能不符合“直接”使用测试的条件,但这是不尝试提前清除不正确的自动测试用例的理由(同时也不修复测试中的代码)。

底线: EvoSuite提供了对手写测试用例的补充,而不是替代它们。

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

https://stackoverflow.com/questions/51951069

复制
相关文章

相似问题

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