什么是测试预言机,它有什么用途?

24

我不太理解 软件测试甲骨文 的概念。它说:

甲骨文是一种确定程序是否通过或未通过测试的机制。

考虑以下代码:

// 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?


我也很感兴趣听听这方面的内容,因为测试预言的概念总让我感到模糊不清。我的理解是(可能是错误的,所以我很感兴趣),测试运行器是测试预言的一个例子(在你的情况下,是“tester”对象)。 - Lilshieste
2个回答

33

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

测试预言可以为所有可能的输入指定正确的输出,也可以仅针对特定的输入。它可能不会指定实际的输出值,而是只有对它们的约束条件。

预言可能是:

  • 一个程序(与被测试系统分开)接受相同的输入并产生相同的输出
  • 给出特定输入的具体正确输出的文档
  • 文档化的算法,人类可以使用该算法计算给定输入的正确输出
  • 人类领域专家,可以以某种方式查看输出并判断其是否正确
  • 或者任何其他方法表明输出是正确的。

如果不说含糊,概念至少非常广泛。

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

在你的例子中,你使用了自己进行加法算法的个人能力作为你的测试预言。相反,你可以使用该算法的不同实现作为测试预言:

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

1
由于我们实际上不需要结果,也不必自己计算,因此这个版本可能更加神秘:assertEquals("2 + 3", 2 + 3, tester.sum(2, 3)); - Oleksii Matiiasevych

6

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

对于这个函数,我们可以使用以下伪代码轻松地检查答案(抱歉,它不是C++语言):

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

这个Oracle使用减法来检查函数。这样可以在很少的人力投入下运行数百万或数十亿次测试。


是的,但我们是否真的想运行数十亿个测试?我想有人这样做,知道是谁可能很有教育意义? - JimLohse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接