【发布时间】:2016-09-27 23:24:01
【问题描述】:
是否有可能程序使用动态测试无法发现故障,但有故障?有什么简单的例子吗?
请帮忙!谢谢。
【问题讨论】:
-
嗯...嗯?我不知道你在问什么,我很确定其他人可能有同样的问题。你觉得你能澄清一点吗? :)
-
我相信这是经典的“我如何知道我的软件是否没有错误”的问题。
是否有可能程序使用动态测试无法发现故障,但有故障?有什么简单的例子吗?
请帮忙!谢谢。
【问题讨论】:
是的。测试只能证明您测试的内容没有错误。动态测试无法覆盖所有环境中所有可能的输入和输出,并具有所有依赖项。
首先是根本不测试有问题的代码。这可以通过检查您的测试的coverage 来验证。即使实现了 100% 的覆盖率,仍然可能存在缺陷。
接下来是不检查所有可能的输入类型和范围。例如,如果您有一个扫描字符串中的单词的函数,则需要检查...
这些被称为boundary conditions,包括:
如果有问题的代码保持状态,可能在对象中,也可能在全局变量中,您必须测试该状态不会损坏或干扰后续运行。
如果您正在执行并行处理,则必须测试因尝试同时执行相同操作而导致的死锁或损坏的多种可能性。例如,两个进程试图写入同一个文件。或者两个进程都在等待对同一资源的锁定。他们只锁定他们需要的东西吗?他们会尽快放弃锁吗?
一旦你测试了代码应该工作的所有方式,你必须测试它可能失败的所有方式,它是否优雅地失败并出现异常(而不是垃圾),错误是否使其处于损坏状态, 等等。它如何处理资源故障,例如无法连接到数据库?处理数据库和文件以确保失败不会导致部分内容发生变化,这一点变得尤为重要。
例如,如果您将资金从一个帐户转移到另一个帐户,您可能会这样写:
my $from_balance = get_balance($from);
my $to_balance = get_balance($to);
set_balance($from, $from_balance - $amount);
set_balance($to, $to_balance + $amount);
如果程序在第一个set_balance 之后崩溃会怎样?如果另一个进程改变了get_balance 和set_balance 之间的平衡会发生什么?必须考虑和测试这类并发问题。
代码可以在所有不同的环境中运行。不同的操作系统。不同的编译器。不同的依赖关系。不同的数据库。并且都有不同的版本。所有这些都必须经过测试。
测试可能完全是错误的。这可能是测试中的错误。这可能是规范中的错误。通常人们会以不同的方式测试相同的代码来避免这个问题。
测试可能是正确的,规范可能是正确的,但功能是错误的。这可能是一个糟糕的设计。这可能是个坏主意。您可以争辩这不是“错误”,但如果用户不喜欢它,则需要对其进行修复。
如果您的测试使用了大量的模拟,那么您的模拟可能无法反映被模拟的事物的实际行为。
等等。
对于所有这些缺陷,动态测试仍然是我们测试几十行代码的最佳方法。
【讨论】: