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

2022-09-01 23:00:58

我并不真正理解软件测试预言机的概念。它说:

预言机是一种确定程序是否通过测试的机制。

请考虑以下代码:

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

神谕究竟如何帮助我?此示例中是否涉及预言机?


答案 1

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

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

预言机可能是

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

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

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

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

assertEquals("2 + 3 is 5", 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);
}

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


推荐