第六章:Property-based Testing and Test Oracles

测试预言器(Oracle)是判断程序是否通过测试的关键,分为主动和被动两种。被动预言器更易实现,常用于验证输出是否正确。正式的可执行规范和解决示例可用于创建测试预言器,而变态预言器则适用于无法直接验证输出的情况。启发式预言器提供近似结果,黄金程序是最理想的测试预言器,但在实践中少见。行业实践中,测试预言器的推导主要依赖于人工,而基于模型的测试能自动化输入和预言器生成,提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Test Oracles

测试的三部分:

  • test input

  • expected output

  • testing environment

  • 执行测试用例的正常流程是:

    • 使用测试用例中的输入来执行程序,记录结果,
    • 然后确定所获得的输出是否为失败。
  • 谁或什么决定了程序产生的结果是否为失败?一种方式是由人工测试员查看输入并手动计算他们认为输出应该是什么。在这种情况下,人工测试员扮演着一个 test oracle 的角色。

  • 一个 test oracle 是指某个人或某个事物判断程序是否通过了或未通过了该测试用例。当然,它也可以是另一个返回“yes”(表示实际结果不是失败)或“no”(表示实际结果为失败)的程序。

在这里插入图片描述

  • test oracle 决定了根据当前的 test input, 系统给出的 output 是否 fail (充当了判官的角色)
  • 理想情况下,Oracle 应该是自动化的(在运行时没有人为干预),因为这样我们可以执行更多的测试用例并获得程序更广泛的覆盖率,但实际上这通常并不容易。

Active and Passive Test Oracles

在这里插入图片描述

  • 自动化预言可以分为两类:

    • 主动预言(active oracle): 一个程序,给定一个待测试程序的输入,能够生成该输入的期望输出。

    • 被动预言(passive oracle): 一个程序,给定一个待测试程序的输入和该待测试程序产生的实际输出,验证实际输出是否正确。

一般情况下更倾向于使用 被动预言。这有两个主要原因。

  1. Easier Implementation 实现更简单

    • Active oracles might require simulating the entire program-under-test. 主动 oracle 可能需要模拟整个被测程序。
    • Passive oracles simply check the correctness of the output. 被动 oracle 只需检查输出是否正确。
    • Example: Testing a sorting program is easier by verifying the output list is sorted rather than sorting the list itself. 例子:通过验证输出列表是否排序,而不是对列表本身进行排序,来测试排序程序更容易。
    • Reduces chances of faults in the oracle itself. 减少了 oracle 自身出错的可能性。
  2. Handling Non-determinism 处理非确定性问题

    • Programs can return multiple outputs for a single input (non-determinism). 程序可以对于同一输入返回多个输出(非确定性)。
    • Active oracles might produce different outputs than the program-under-test. 主动 oracle 可能会产生与被测程序不同的输出结果。
    • Passive oracles don’t face this issue as they only verify the correctness of the output. 被动 oracle 不会面临这个问题,因为它们只验证输出是否正确。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暖仔会飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值