【问题标题】:What is a test oracle and what is it used for?什么是测试预言机,它的用途是什么?
【发布时间】:2014-06-24 16:30:54
【问题描述】:

我不太了解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) 进行比较。在这种情况下,测试成功。

预言机究竟能如何帮助我?这个例子中涉及到预言机吗?

【问题讨论】:

  • 我也很想听听这个,因为测试预言机的概念一直让我觉得是一个模糊的概念。我的理解(这可能是错误的,因此我很感兴趣)是测试运行器是测试预言机的一个例子。 (在你的情况下,tester 对象。)

标签: java unit-testing testing junit


【解决方案1】:

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

测试预言机可能会为所有可能的输入或仅为特定输入指定正确的输出。它可能没有指定实际的输出值,而只是对它们的约束。

神谕可能是

  • 一个程序(独立于被测系统)接受相同的输入并产生相同的输出
  • 为特定给定输入提供特定正确输出的文档
  • 一种记录在案的算法,人类可以使用它来计算给定输入的正确输出
  • 可以通过某种方式查看输出并判断其是否正确的人类领域专家
  • 或任何其他表明输出正确的方式。

如果不是模糊的,这个概念至少是非常广泛的。

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

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

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

【讨论】:

  • 由于我们实际上不需要结果,也不必自己计算,所以这个版本可能会更加口头:assertEquals("2 + 3", 2 + 3, tester.sum(2, 3));
【解决方案2】:

让我这样提出预言机问题:我们如何检查程序是否返回正确答案?

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

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

这个预言机使用减法来检查函数。这使得数百万或数十亿次测试无需人力即可运行。

【讨论】:

  • 是的,但我们真的要运行数十亿次测试吗?我想有人这样做,知道谁会很有教育意义?
猜你喜欢
  • 2010-09-27
  • 2011-12-17
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多