智能卡操作系统自动测试中的脚本技术
文章出处:http://www.nexussmartsolutions.com 作者:周章慧,王同洋,吴俊军,张新访 人气: 发表时间:2011年10月07日
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, 这样的控制结构就是不符合语法规则的。完成第一趟扫描后,当前的控制流程应该为主流程。
第2趟扫描为解释执行,实现在SCM程序流程结构的控制下执行对应的智能卡操作系统指令达到预期的智能卡测试目的.首先根据有无控制前缀判断当前语句是否为控制语句,再根据流程控制语句的关键字判断是否为流程控制语句或普通的赋值语句。根据行号可以从第一趟扫描的流程控制树中检索到当前的流程控制结构。对应的4种流程控制结构的处理实现可以用图1的流程图来表示。nl nPos为流程控制处理后将要执行语句的行号,该行可能是智能卡命令也可能是另一个流程控制语句。
4 scML的扩展技术
SCM中已经定义了各类常用的函数供用户使用时调用,包括:字符串处理,各类加解密算法,通信、金融、社保行业使用的专用算法等,这些函数已经可以满足一般的使用要求。因为智能卡产品的日新月异,一些新的要求会不断提出,原有的函数接口可能无法满足要求,在不更改主实现程序的情况下,使用动态组件技术可以自由的扩充需要的函数,使测试得以顺利进行。动态组件是满足一定的接口规格的动态库,它可以动态安装到主程序中并可以卸载,为了防止非法的组件被使用及组件被非法使用,动态组件采用了授权技术,安装和使用过程中,需要对组件进行双向认证授权,否则无法使用。SCM是一个通用的智能卡测试工具,它可以适用于各类智能卡产品的测试,为了减轻工作人员的负担,系统提供了一系列的命令,命令由命令名称和命令参数组成,一个命令包含了一条或多条的APDU,通过命令的执行,SCM可以向智能卡发送预期的APDU(包括形成APDU的报文参数)并比较卡是否返回预期的结果,并利用已经得到的结果(可能包括更前面的命令返回的结果)来形成下一条APDU或判断整体命令是否执行正确,然后返回该条命令的执行结果。不同规范的智能卡可能使用同一个命令名称,但需要执行不同的算法和处理流程。为了解决这种问题,采用了面向对象方法的继承和重载思想,子类可以直接使用父类的方法,也可以有自己专用的方法,当父类的方法不适用的时候,子类可以对该方法进行更改。基础类为一个通用智能卡类CICCard,它用于处理通用的智能卡测试命令,如参数P1、P2、P3的测试、测试参数设置命令、执行结果比较命令等,其它类型的智能卡都是从此类上派生的,包含了各自的类成员和方法,并对命令处理方法重载。如GSM 网络的通信智能卡类CSim是从类CICCard派生的,CDMA网络的通信智能卡类CUim是从类CSim派生的。通过派生和重载可以为各种智能卡标准建立各自的命令集,层次清晰,实现简单。
5 组织SCML测试脚本实现测试自动化
通过单个的SCML~0试脚本可以实现一项或多项测试用例的测试,把多个测试脚本按照一定的规则组合在一起就可以实现整个智能卡各项功能的测试并实现自动化。SCM 中一个或多个测试脚本和其它测试相关内容(如案例名称、案例描述等)一起构成了一个测试案例,测试案例通过树状的结构组合在一起就形成了层次的测试包,一个测试包用以代表一类功能的测试案例的集合,多个测试包再加上测试的一些配置条件就形成了测试工程,通过对测试工程的执行就实现了对一类智能卡的完整性测试。测试过程中可以自动进行测试轮次的管理并自动记录每轮中的测试细节信息,用户可以查看单个测试案例的执行历史情况也可以动态统计测试工程中案例的执行通过、失败的情况,并可以对各类分布情况进行汇总。测试执行完成后,用户就可以同步得到一份内容可详可简的测试报告。
图2为利用SCM 进行一种中国移动的通信卡测试过程中的截图。
6 结束语
SCML测试脚本简洁易读、结构清晰、易于维护、便于扩展,此种脚本语言格式及处理机制已经应用到武汉天喻信息产业股份有限公司的智能卡通用测试工具中,并实际应用到各类智能卡产品的测试中,实现了测试平台的统一并实现了过程自动化,为公司的产品质量稳定、可靠起到了实际的作用。
(文/华中科技大学机械学院,武汉天喻信息产业股份有限公司 周章慧,王同洋,吴俊军,张新访)