在IEC 61508安全相关产品的软件验证和确认(上)中,我们介绍了关于机器人安全相关软件根据IEC 61508-3:2010标准进行功能安全验证和确认涉及的概率测试、数据记录和分析、功能和黑盒测试、性能测试、接口测试等活动,本次我们将介绍动态分析和测试活动。
动态分析和测试包含了多种类型的测试方法,具体内容详见下表。这些测试方法可以单独应用或组合应用于单元测试、模块测试和系统级测试。
表 动态分析和测试-IEC 61508-3:2010 附录B表 B.2

1.根据边界值分析执行测试用例
边界值测试的目的是为了消除由于参数的极限值或边界值导致的潜在的软件错误。为了达到这个目标,可以在进行软件单元测试时直接向函数输入这些参数的极限值或边界值。测试时,应该充分地考虑并测试一些特殊情况,比如:
有些自动化测试工具可以自动构造这些测试用例,甚至可以进一步提供一种方法来自动生成用来测试所有输入值为最小值、最大值和中间值的测试用例。
甚至有些自动化测试工具可以进一步测试上述提到的特殊值,还可以测试其它一些上面没有提到的值,比如非数字、浮点变量的正负无穷大等。
2.根据错误推测执行测试用例
错误推测的测试用例,一般是根据测试工程师的测试经验以及对被测系统的理解和推测相结合的方式建立的。
这个活动可以在系统级测试时执行,但正如IEC 61508-3:2010 第3部分 附录A表A.5所要求的那样,在单元测试时执行这个活动同样重要,可以从最开始尽可能的使软件组件减少发生错误的概率。
3.根据错误植入执行测试用例
采用错误播种这种测试策略的目的是为了测试:(1)当故意引入一些错误时被测软件是否能够识别到这些错误;(2)在识别到这些故意引入的错误后,被测软件是否给出相应的处理提示或者是否采取相应的保护措施以防止宕机、数据丢失等故障发生。
4.根据基于模型测试用例的生成执行测试用例
使用基于模型的测试策略,可以尽早地暴露原始模型和开发的/生成的源代码之间的歧义。它可以继承使用基于模型的测试期间定义的测试用例。
5.性能建模
性能建模的目的是为了计算性能,比如处理器时间、资源占用率、通信带宽等。
6.等价类和输入划分测试
等价类和输入划分的目标是,通过将参数输入域划分为不同的区间,充分测试软件在不同输入域区间上的实现情况。这类测试用例需要根据软件规范、程序内部结构中的一种或两种来编写。
7.结构测试覆盖率(入口)
入口覆盖试图使程序中的每个函数或接口至少被调用一次,但并不关注函数或接口里面实际执行了多少代码。比如下面这行代码:
if(a < 8 && b == 0 || c > 10)
如果一个单独的测试用例使判定语句判定为false将不会覆盖包含在if语句中的其它代码行。同样,如果这个if语句有一个附属于它的else语句,一个使判定语句判定为true的测试用例也不会覆盖else语句的内容。然而,无论是上述哪个测试用例都会覆盖if语句本身。
8.结构测试覆盖率(语句)
语句覆盖是最基本、最必要的结构覆盖,需要设计足够多的测试用例使程序中每条可执行语句至少被执行一次。但是此种类型的测试不能检测到缺失的语句,也不能发现无法执行到的语句。
9.结构测试覆盖率(分支)
分支覆盖要求程序的每个分支至少被执行一次,即每个判定语句的取值可以是true或false但至少要被执行一次。但往往大部分的判定语句是有多个逻辑条件组合而成的,比如下面的if语句,要对这个if语句执行分支覆盖测试需要两个测试用例——一个if语句返回true,另一个返回false。
if(a < 8 && b == 0 || c > 10)
可以看出,分支覆盖测试时,仅仅是判断整个判定语句的最终结果,而不去判断每个逻辑条件的取值情况。
要想符合IEC 61508-3:2010标准,所选用的自动化测试工具在单个测试执行过程中应能同时产生语句覆盖和分支覆盖标准。
10.结构测试覆盖率(条件、MC/DC)
MC/DC测试要求每一个程序模块的输入和输出点至少被调用一次,在程序中每一个条件必须产生所有可能的输出结果至少一次,并且每一个判定中的每一个条件必须能够独立影响一个判定的输出,即在其他条件不变的前提下仅改变这个条件的值,能使判定结果改变。
比如,下面这个语句:
if(a < 8 && b == 0 || c > 10)
通过改变a的值,同时保持其它条件的值不变,最终判定语句的值将会改变。
MC/DC测试可以通过使用真值表来有效地完成,其覆盖面大,检测出错误发生的概率比较高。
关于测试管理和自动化工具、在软件设计规范与模块及集成测试规范间向前可追溯、离线数值分析、影响分析、经认证或从使用中增强信任的工具和翻译器等活动将在下一篇文章中作相关介绍。
赛迪机器人作为中国机器人CR认证服务的权威机构,将持续推进机器人相关标准的制定工作,关注产品质量和安全问题,促进产业的标准化和规模化,为机器人产业的安全保驾护航。