智能卡操作系统自动测试中的脚本技术
发布时间:2013-03-22 来源:未知
0 引 言 软件测试是软件质量保证的关键技术,在软件生命周期中占有重要的位置,它的重要性是不能期望通过不错的的开发技术来取代的。近年来随着软件规模的扩大,软件质量要求的提高,各企业越来越希望借助于有效的自动软件测试来提高测试效率、缩短周期、减少资金投入和降低测试难度。脚本技术的引入是实现软件测试自动化的有效手段。测试脚本对测试用例给以形式化的描述,通过脚本代码的可重用性可以提高测试的可重复性,大大减少测试人员的工作量,提高软件测试的质量和可维护性。 智能卡是带有微处理器和存储器等微型集成电路芯片的卡片,被广泛地应用于通信、金融、社保、税务、安全、公共事业等领域。智能卡可以理解为一个微型计算机,通过内部的操作系统可以实现信息存储和复杂运算等各样的功能。智能卡具有标准化、安全性、多样化、价格低等特点,相对于一般的软件产品,智能卡产品的测试显得特别重要 ,智能卡的测试包括卡体、芯片、操作系统的测试,智能卡操作系统是一种软件,它由智能卡提供商提供给芯片提供商掩膜到芯片中,芯片的生产具有较长的周期,而且必须是大规模的生产,芯片封装到智能卡上发布后,不可能用任何召回活动来替换或重新发布已经大量发行的卡,这些活动会对发卡商和发行商的声誉造成持久的伤害,代价无法估计。 1 相关研究 Mark Fewster 指出脚本技术其实是一种编程技术,建立可维护脚本的技术类似于建立可维护程序,他提出了判断脚本好坏的原则:易于使用和易于维护,得出简单脚本容易建立但维护成本巨大,但高级结构化脚本建立开销大却是易于维护的结论,指出脚本应该遵守的几个原则:①有注释;②可重用;③ 结构上易读、易理解、易维护;④ 有文档。根据采用的技术不同,脚本可以分为:线性脚本、结构化脚本、共享脚本、数据驱动脚本和关键字驱动脚本。 王明兰将测试用例描述语言按描述方法分为6类:自然语言、结构化表格、形式化方法、树表组合符号(treetabularcorn—bined notation,TTCN)、信号描述语言、编程语言、脚本语言、厂家自定义语言。文中列出了现有的一些应用较广泛的测试工具及其使用的测试脚本。可以看出较好的商业化测试工具的测试脚本是在脚本语言或编程语言的基础上进行扩展,添加一些适合于特定应用对象测试的描述和实现方法。 智能卡因为其标准性和安全性方面的要求,卡片发行方会要求智能卡提供商通过授权认证机构的功能测试和专业评估机构的安全审查,Integri和ICCSolution等公司为专业的智能卡测试方案提供商,他们会为智能卡的特定功能(规范)提供专业的测试包供卡片提供商、卡片发行方、专业认证机构选择购买,Sun公司也为Java卡的虚拟机、运行环境、API提供了JCTCK(Javacardtechnologycompatibilitykit)以验证Java卡是否符合Java卡规范。lntegfi公司的INQ 采用TTCN进行标准的形式化描述和组织测试工程,脚本语言叫IBScript([ntegri’S Scrpt language),它是VBScript的子集同时又进行了扩展。ICCSolution公司的ICCSimCT 采用了一种面向自然语言的文本文件来表示脚本,如执行SDA认证可以表示为“DO SDA”,系统将会根据配置的参数和规范指定的流程去执行EMV规范指定的终端静态数据认证。JCTCKt 使用了广泛应用于Java各平台测试的JavaTestHarness,所有的测试脚本都使用Java语言按照一定接口规格编写,把这些测试Applet安装到Java卡上,就可以通过卡服务接口来按照指定的格式进行访问,根据是否得到预期的响应来判断待测试的功能是否通过。本文根据当前脚本技术的研究和发展,结合智能卡操作系统的特点,提出了测试脚本描述语言(SCML),并把它应用到天喻智能卡测试软件智能卡大师(smart card master,SCM)中,得到了很好的应用。 2 测试脚本语言SCML的语法定义 SCML使用是一种类C的脚本语言,支持APDU命令执行,变量,表达式,函数,过程以及条件判断、循环、跳转等多种流程控制方式。SCML的主要语法定义如下。 2.1 SCML语句 <SCML语句>::=<注释行>l<智能卡执行语句>l<过程定义>{<过程调用>{<控制语句> <注释行>::=”;”{<字母>l<数字>)J空 <智能卡执行语句>::=<命令标识× 命令参数> <命令参数>::= {<表达式>l<十六进制数字串>l<变量标识符>} <过程定义>::=procedure<过程名> <SCML语句> . endproc <过程调用>::=call<过程名> <控制语句>::=<赋值语句>j<条件控制语句>j<循环语句> l<无条件跳转语句>l<行标识语句> <赋值语句>::=<控制前缀× 变量标识符>=<表达式> <条件控制语句>::: <控制前缀>if<条件表达式> <SCML语句> [<控制前缀>else if<条件表达式> <SCML语句>] [<控制前缀>else 、 <SCML语句>] <控制前缀>endif <循环语句>::=<for循环语句>l<do循环语句>)<while循环语句> <for循环语句>::= <控制前缀>for(<任选表达式>;<任选表达式>;<任选表达式>) <SCML语句> <控制前缀>next <do循环语句>::= <控制前缀>do <SCML语句> <控制前缀>until<条件表达式> <while循环语句>::= <控制前缀>while<条件表达式> <SCML语句> <控制前缀>wend <无条件跳转语句>::= <控制前缀>goto<行标识> <行标识语句>::= <控制前缀><行标识>: 2.2 SCML中的表达式 <表达式>::=H一]<项>{<加法运算符><项>) <项>::=<因子>{<乘法运算符× 因子>) <因子>::=<变量标识符>l<常量>l<函数> ’<表达式>”)” <函数>::=”@”<函数名>({<表达式>)) <条件表达式>::=<单目条件表达式>l<关系表达式>l<逻辑表达式> <单目条件表达式>::=<单目逻辑运算符><条件表达式> <关系表达式>::=<表达式><关系运算符><表达式> <逻辑表达式>::=<条件表达式><逻辑运算符><条件表达式> <常量>::=<数字>l<字符串> <变量标识符>::=”%”<字母串> <数字>::=OX<十六进制数字串>l<十进制数字串> <十六进制数字串>::=<十六进制数字>{<十六进制数字>} <十进制数字串>::=<数字>{<数字>} <十六进制数字>::=<数字> B|c|D| E|F|a|b|c e|f <字符串>::=<字母>{<字母>l<数字>) · <行标识>::=<字母串> <过程名>::=<字母串> <函数名2-::=<字母串> <加法运算符>::=” ” ” <乘法运算符2-:::” <关系运算符>:::”>”f.f<”j>=f<=j!= <逻辑运算符>::=&&||| <单目逻辑运算符>::=”!” <数字2-::=0111213141516171819 <字母>::=A|B|C|D|...X|Y|Z|a|b|c|d|...x|Y|z <控制前缀>::=<-! 3 SCML测试脚本的解释执行 SCML测试脚本是通过两趟扫描来解释执行的,较好的趟扫描完成跳转行号表和脚本控制结构树的建立,并实现词法和语法的检查。SCML中把要处理的语句分为两种:控制语句及智能卡执行语句,较好的趟扫描针对的就是控制语句中的行号标识语句和流程控制语句。流程控制语句包括条件跳转语句和3类循环语句。一个流程控制可以用如下的结构来表示: class FlowControl{ Private: int m nMethod;//代表是哪一种流程控制 intm nLevel;//嵌套层次,主流程为0,每嵌套一层加1 boolm bEntered;//执行时使用,用于是否为较好的次进入该流程 //对循环结构有用,默认为false,进入后变为true,退出后改为false intm nStartPos,nl nEndPos;//该控制流程的起止位置 CList<int,int>m 1PosList;//一个流程块中间的各个其它控制行位置(如else,else if) }; 流程控制树的根节点为主流程,它代表的是一种顺序结构,它的起止位置为该脚本的较好的行和还不错后一行。通过对流程控制树嵌套结构的检查可以检查脚本中控制结构的保留字是否成对出现,是否出现乱嵌套等现象。如for循环中嵌套条件控制语句,但被嵌套的if和endif尚未成对出现时,语句中就出现了next, 这样的控制结构就是不符合语法规则的。完成较好的趟扫描后,当前的控制流程应该为主流程。第1页第2页