什么是测试oracle以及它用于什么?

时间:2014-05-07 15:34:03

标签: java unit-testing testing junit

我真的不理解software 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));
}

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

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

2 个答案:

答案 0 :(得分:14)

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

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

oracle可能是

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

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

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

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

assertEquals("2 + 3 is 5", 2 + 3, tester.sum(2, 3));

答案 1 :(得分:3)

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

对于此功能,我们可以使用以下伪代码轻松检查答案(抱歉,它不是C ++。):

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

这个oracle使用减法来检查函数。这样就可以轻松地运行数百万或数十亿次测试。