什么是测试oracle,它用于什么?

use*_*330 16 java testing junit unit-testing

我真的不了解oracle软件测试的概念.它说

oracle是一种用于确定程序是否通过测试的机制.

请考虑以下代码:

// class that should be tested
public int sum(int a, int b) {
  return a + b;
}

// test class
static Main tester = new Main();
@Test
public void testSum() {
  assertEquals("2 + 3 is 5", 5, tester.sum(2, 3));
}
Run Code Online (Sandbox Code Playgroud)

应该测试的类总是返回2个整数的总和.
我作为参数2和3传递,并期望将5. 2和3相加并与预期值(5)进行比较.在这种情况下,测试成功.

oracle究竟能帮助我吗?这个例子中有一个oracle吗?

Dav*_*uth 15

测试oracle是关于程序(或函数或方法)的输出是否正确的信息源.

测试oracle可能为所有可能的输入指定正确的输出或仅为特定输入指定正确的输出.它可能不会指定实际输出值,而只会指定它们的约束.

可能是神谕

  • 一个程序(与被测系统分开),它接受相同的输入并产生相同的输出
  • 为特定给定输入提供特定正确输出的文档
  • 记录的算法,人类可以使用它来计算给定输入的正确输出
  • 一个人类领域的专家,他可以以某种方式查看输出并告诉它是否正确
  • 或任何其他方式告诉输出是正确的.

如果不含糊,这个概念至少非常广泛.

oracle不是测试运行器,但是测试运行器可以使用oracle作为正确输出的源,以比较被测系统的输出,或者作为评估SUT输出的约束源.

在您的示例中,您使用个人能力执行添加算法作为您的oracle.相反,您可以使用该算法的不同实现作为oracle:

assertEquals("2 + 3 is 5", 2 + 3, tester.sum(2, 3));
Run Code Online (Sandbox Code Playgroud)


小智 6

让我以这种方式提出预言机问题:我们如何检查程序是否返回了正确的答案?

对于这个函数,我们可以很容易地用下面的伪代码检查答案(对不起,它不是 C++。):

repeat many times {
    int a = randomNumber();
    int b = randomNumber();
    int result = sum(a, b);
    assertEquals("random case", a, result - b);
}
Run Code Online (Sandbox Code Playgroud)

这个oracle使用减法来检查函数。这允许以很少的人力运行数百万或数十亿次测试。