基于合约状态检查的构件易测试研究

2014-07-19 18:08赵艳妮郭华磊
现代电子技术 2014年10期

赵艳妮 郭华磊

摘 要: 随着软件规模日趋复杂,软件质量问题日趋突出。构件复用提高了开发效率,构件测试保证了构件质量。针对目前缺乏成熟构件测试技术的现状,提出了基于合约状态检查的构件易测试方法。将Bertrand Meyer的合约概念引入到构件设计开发测试过程中,考虑构件易测试性,从构件开发者和复用者的角度分析构件及构件的测试,违反构件合约时抛出异常信息,快速定位异常位置。在一定程度上保证构件质量,缩短开发周期,提高测试效率。

关键词: 合约状态; 客户方; 服务方; 构件易测试

中图分类号: TP311.5 文献标识码: A 文章编号: 1004?373X(2014)10?0083?03

Abstract: With the continual increase of software Scale and complexity, it is more and more difficult to assure the quality of software. Component reuse is an effective way to improve the efficiency of development. Component testing is an important means to ensure the quality of components. In view of the present situation of the lack of mature component testing technology, a component testability method is proposed based on contract status checking. Bertrand Meyer's contract concept is introduced into testing process of component design and development. In consideration of the component testability, components and component testing are analyzed from the perspective of the component developers and re?users. An exception message is provided when the component contract is violated, and the exception position is quickly locked. By the research achievement, the quality of component was guaranteed, the development time was shortened and the testing efficiency was improved in a certain extent.

Keywords: contract status; client; server; component testability

0 引 言

随着信息技术快速发展,软件规模逐渐增大,复杂性不断提高。为了提高软件质量,缩短开发周期,降低开发成本,受硬件组装计算机的启发,提出了软件复用,子函数→类→构件,软件复用的粒度逐渐变大。构件质量是软件复用的前提,构件测试是保证构件质量的重要手段之一[1]。为了确保构件在新环境中工作正常,必须对构件进行充分的测试,复用质量低下的构件或不正确部署构件,可能造成灾难后果。例如,1996年Ariane 5运载火箭发射失败,原因是复用的Ariane 4构件在新环境中未经过充分测试造成的[2]。

构件测试与软件测试相比,有其自身特点:

(1) 缺乏构件应用的上下文依赖环境;

(2) 缺乏详细的构件描述文档;

(3) 构件复用者过分依赖构件开发者;

(4) 硬件平台、操作系统、编程语言等集成环境不同[3]。本文将Bertrand Meyer的合约思想[4]引入到构件测试,提出一种基于构件合约状态检查的构件易测试技术。

1 基于合约的构件化软件测试理论

1997年,Bertrand Meyer提出软件合约化理论,把软件模块之间交互的规则定义为合约。图1是构件测试过程图,构件扮演两种角色:客户方与服务方,客户方向服务方请求服务,服务方向客户方提供服务[5]。合约分为前置条件、后置条件和不变式。前置条件是客户方调用服务方前必须满足的条件,客户的义务,服务方的权利;后置条件是服务方被调用完成后必须满足的条件,后置条件限定了服务方被调用之后必须满足的条件,客户方的权利,服务方的义务;不变式是描述构件正确性、完整性的规则,构件交互过程中必须保证。构件失效时,违反前置条件,责任在客户方;违反后置条件或不变式,责任在服务方[6]。

2 基于内置合约状态检查的构件测试

2.1 建立构件状态模型

构件状态模型描述构件响应相关事件的动态行为,构件根据当前状态对事件做出相应的响应,具体表现就是相应的状态转换。构件状态转换的触发条件包括内部过程(函数调用、异常等)和外部事件(接口调用、指令信号等)[7]。构件状态模型描述构件的动态行为,表现构件在生命周期内所经历的状态序列。

构件属性决定构件状态,构件状态转换本质是从一种属性组合转换到另一种属性组合,既包含单个属性值表示的状态,也包含某个属性值域表示的状态。在特殊情况下,某个状态可能有接近无穷的属性组合值,找出关键状态表示属性组合。状态模型只关注关键属性[8]。

2.2 生成构件状态转化表

在构件整个运行期间,根据合约对构件产生的状态进行跟踪检查,对每次状态转换进行严格测试。生成构件状态转换表内容[9]:

(1) 确定构件状态模型中所有关键属性;

(2) 确定构件状态模型中的所有状态;

(3) 确定每个状态对应的值域;

(4) 确定状态的隐性转换和状态显性转换;

(5) 针对关键状态转换,分别列出相应的输入参数、初始状态、最终状态、前置条件和后置条件。构件状态转换表描述了构件的所有行为,包含了状态模型中的全部状态转换,是一个测试方案。

2.3 内置构件合约测试接口

构件状态转换完全覆盖是构件合约状态测试的目标。一个测试用例表示构件状态模型中的一次状态转换,最小测试用例集覆盖了构件状态模型中的全部状态转换,用于构件合约测试的接口函数由最小测试用例集实现[10]。构件合约测试接口包含初始状态设置操作和最终状态验证操作。

2.4 设计构件合约测试用例

构件状态转换表的初始状态映射到合约测试接口的初始状态设置函数,而最终状态映射到最终状态验证函数,可以把初始状态设置函数和最终状态验证函数设置为测试用例[11]。

根据构件初始状态,每个初始状态表示可能的警戒条件或属性组合,至少对应一个初始状态设置函数。由于同一个状态可能具有多个值。在状态警戒条件下,通过设置函数参数形式,触发状态的转换。

3 实例分析

以某网站用户登录账户为例,阐明如何基于合约状态检查进行构件测试。如果用户连续3次密码输入错误,账户自动锁定;用户通过绑定的手机号码或电子邮箱,利用短信或电子邮件验证码的方式申请账户解锁;系统解锁成功后,须等待一定延迟时间,账户激活,允许用户重新登录账户。用户登录状态模型如图2,账户包含三种独立状态:锁定、解锁和激活。账户锁定或解锁时禁止用户登录,账户激活时允许用户登录,其中,激活状态被扩展成4个隐性状态:第1次登录、第2次登录、第3次登录和登录成功。每种账户状态和允许登录次数LOGIN_TIMES组合分别表示构件状态模型的一种状态。构件关键属性允许登录次数LOGIN_TIMES大于0时,账户处于激活状态。

表1是用户登录状态转换表。包含11种需要进行的状态转换,由测试执行前的初始状态以及测试执行完后的最终状态组成,每次状态转换要输入参数密码(PASSWORD)、验证码(CAPTCHA)或延迟时间(DELAYTIME),状态转换前验证前置条件,状态转换后验证后置条件。表2列出了对用户登录状态转换覆盖的最小测试用例集,利用测试用例测试前验证相应前置条件,测试后与预期结果比较,验证是否满足。

4 结 语

本文提出的基于合约状态检查的构件测试方法,将构件的交互关系分为客户方与服务方。根据构件的权利和义务,在客户方的构件中内置用于对服务方进行测试的接口,通过构件状态的转换分析构件的内部信息,验证是否满足前置条件;在服务方的构件中内置状态设置与状态验证的合约测试接口,状态设置将构件设置为测试所需要的前置条件状态,状态验证根据构件的内部状态验证是否满足后置条件。

在今后的工作中,将进一步完善该方法,尽可能应用到实际的构件开发和测试工作中。

参考文献

[1] 单锦辉,姜瑛,孙萍.软件测试研究进展[J].北京大学学报:自然科学版,2005,41(l):134?145.

[2] 张毅坤,叶涛,邢传玉.面向构件化软件的合约检查测试框架[J].计算机工程,2006,32(20):78?80.

[3] 吴立松,杨根兴,蔡立志.基于构件的测试脚本复用技术研究[J].计算机应用研究,2009,26(4):1323?1326.

[4] 付剑平,陆民燕.软件测试性设计综述[J].计算机应用,2008,28(11):2915?2918.

[5] MEYER B. Object?oriented software construction [M]. New Jersey: Prentice Hall, 1997.

[6] 刘永红.构件及基于构件的软件测试研究[D].成都:中国科学院,2006.

[7] 余金山,刘志伟.一种基于内置合约检查和可配置接口的软构件测试技术[J].计算机应用研究,2011,28(5):1756?1760.

[8] 徐亮,曹万华,陈靖,等.一种舰载指控系统构件集成测试方法[J].计算机与数字工程,2010,38(6):54?58.

[9] 叶婷婷,王映辉.一种基于AOP的构件合约化测试方法与实现[J].计算机技术与发展,2012,22(6):71?74.

[10] 陈锦富,卢炎生,谢晓东.软件错误注入测试技术研究[J].软件学报,2009,20(6):1425?1443.

[11] 韦群,王珏.软件缺陷及其对软件可靠性的影响分析[J].计算机应用与软件,2011,28(001):145?149.

2.2 生成构件状态转化表

在构件整个运行期间,根据合约对构件产生的状态进行跟踪检查,对每次状态转换进行严格测试。生成构件状态转换表内容[9]:

(1) 确定构件状态模型中所有关键属性;

(2) 确定构件状态模型中的所有状态;

(3) 确定每个状态对应的值域;

(4) 确定状态的隐性转换和状态显性转换;

(5) 针对关键状态转换,分别列出相应的输入参数、初始状态、最终状态、前置条件和后置条件。构件状态转换表描述了构件的所有行为,包含了状态模型中的全部状态转换,是一个测试方案。

2.3 内置构件合约测试接口

构件状态转换完全覆盖是构件合约状态测试的目标。一个测试用例表示构件状态模型中的一次状态转换,最小测试用例集覆盖了构件状态模型中的全部状态转换,用于构件合约测试的接口函数由最小测试用例集实现[10]。构件合约测试接口包含初始状态设置操作和最终状态验证操作。

2.4 设计构件合约测试用例

构件状态转换表的初始状态映射到合约测试接口的初始状态设置函数,而最终状态映射到最终状态验证函数,可以把初始状态设置函数和最终状态验证函数设置为测试用例[11]。

根据构件初始状态,每个初始状态表示可能的警戒条件或属性组合,至少对应一个初始状态设置函数。由于同一个状态可能具有多个值。在状态警戒条件下,通过设置函数参数形式,触发状态的转换。

3 实例分析

以某网站用户登录账户为例,阐明如何基于合约状态检查进行构件测试。如果用户连续3次密码输入错误,账户自动锁定;用户通过绑定的手机号码或电子邮箱,利用短信或电子邮件验证码的方式申请账户解锁;系统解锁成功后,须等待一定延迟时间,账户激活,允许用户重新登录账户。用户登录状态模型如图2,账户包含三种独立状态:锁定、解锁和激活。账户锁定或解锁时禁止用户登录,账户激活时允许用户登录,其中,激活状态被扩展成4个隐性状态:第1次登录、第2次登录、第3次登录和登录成功。每种账户状态和允许登录次数LOGIN_TIMES组合分别表示构件状态模型的一种状态。构件关键属性允许登录次数LOGIN_TIMES大于0时,账户处于激活状态。

表1是用户登录状态转换表。包含11种需要进行的状态转换,由测试执行前的初始状态以及测试执行完后的最终状态组成,每次状态转换要输入参数密码(PASSWORD)、验证码(CAPTCHA)或延迟时间(DELAYTIME),状态转换前验证前置条件,状态转换后验证后置条件。表2列出了对用户登录状态转换覆盖的最小测试用例集,利用测试用例测试前验证相应前置条件,测试后与预期结果比较,验证是否满足。

4 结 语

本文提出的基于合约状态检查的构件测试方法,将构件的交互关系分为客户方与服务方。根据构件的权利和义务,在客户方的构件中内置用于对服务方进行测试的接口,通过构件状态的转换分析构件的内部信息,验证是否满足前置条件;在服务方的构件中内置状态设置与状态验证的合约测试接口,状态设置将构件设置为测试所需要的前置条件状态,状态验证根据构件的内部状态验证是否满足后置条件。

在今后的工作中,将进一步完善该方法,尽可能应用到实际的构件开发和测试工作中。

参考文献

[1] 单锦辉,姜瑛,孙萍.软件测试研究进展[J].北京大学学报:自然科学版,2005,41(l):134?145.

[2] 张毅坤,叶涛,邢传玉.面向构件化软件的合约检查测试框架[J].计算机工程,2006,32(20):78?80.

[3] 吴立松,杨根兴,蔡立志.基于构件的测试脚本复用技术研究[J].计算机应用研究,2009,26(4):1323?1326.

[4] 付剑平,陆民燕.软件测试性设计综述[J].计算机应用,2008,28(11):2915?2918.

[5] MEYER B. Object?oriented software construction [M]. New Jersey: Prentice Hall, 1997.

[6] 刘永红.构件及基于构件的软件测试研究[D].成都:中国科学院,2006.

[7] 余金山,刘志伟.一种基于内置合约检查和可配置接口的软构件测试技术[J].计算机应用研究,2011,28(5):1756?1760.

[8] 徐亮,曹万华,陈靖,等.一种舰载指控系统构件集成测试方法[J].计算机与数字工程,2010,38(6):54?58.

[9] 叶婷婷,王映辉.一种基于AOP的构件合约化测试方法与实现[J].计算机技术与发展,2012,22(6):71?74.

[10] 陈锦富,卢炎生,谢晓东.软件错误注入测试技术研究[J].软件学报,2009,20(6):1425?1443.

[11] 韦群,王珏.软件缺陷及其对软件可靠性的影响分析[J].计算机应用与软件,2011,28(001):145?149.

2.2 生成构件状态转化表

在构件整个运行期间,根据合约对构件产生的状态进行跟踪检查,对每次状态转换进行严格测试。生成构件状态转换表内容[9]:

(1) 确定构件状态模型中所有关键属性;

(2) 确定构件状态模型中的所有状态;

(3) 确定每个状态对应的值域;

(4) 确定状态的隐性转换和状态显性转换;

(5) 针对关键状态转换,分别列出相应的输入参数、初始状态、最终状态、前置条件和后置条件。构件状态转换表描述了构件的所有行为,包含了状态模型中的全部状态转换,是一个测试方案。

2.3 内置构件合约测试接口

构件状态转换完全覆盖是构件合约状态测试的目标。一个测试用例表示构件状态模型中的一次状态转换,最小测试用例集覆盖了构件状态模型中的全部状态转换,用于构件合约测试的接口函数由最小测试用例集实现[10]。构件合约测试接口包含初始状态设置操作和最终状态验证操作。

2.4 设计构件合约测试用例

构件状态转换表的初始状态映射到合约测试接口的初始状态设置函数,而最终状态映射到最终状态验证函数,可以把初始状态设置函数和最终状态验证函数设置为测试用例[11]。

根据构件初始状态,每个初始状态表示可能的警戒条件或属性组合,至少对应一个初始状态设置函数。由于同一个状态可能具有多个值。在状态警戒条件下,通过设置函数参数形式,触发状态的转换。

3 实例分析

以某网站用户登录账户为例,阐明如何基于合约状态检查进行构件测试。如果用户连续3次密码输入错误,账户自动锁定;用户通过绑定的手机号码或电子邮箱,利用短信或电子邮件验证码的方式申请账户解锁;系统解锁成功后,须等待一定延迟时间,账户激活,允许用户重新登录账户。用户登录状态模型如图2,账户包含三种独立状态:锁定、解锁和激活。账户锁定或解锁时禁止用户登录,账户激活时允许用户登录,其中,激活状态被扩展成4个隐性状态:第1次登录、第2次登录、第3次登录和登录成功。每种账户状态和允许登录次数LOGIN_TIMES组合分别表示构件状态模型的一种状态。构件关键属性允许登录次数LOGIN_TIMES大于0时,账户处于激活状态。

表1是用户登录状态转换表。包含11种需要进行的状态转换,由测试执行前的初始状态以及测试执行完后的最终状态组成,每次状态转换要输入参数密码(PASSWORD)、验证码(CAPTCHA)或延迟时间(DELAYTIME),状态转换前验证前置条件,状态转换后验证后置条件。表2列出了对用户登录状态转换覆盖的最小测试用例集,利用测试用例测试前验证相应前置条件,测试后与预期结果比较,验证是否满足。

4 结 语

本文提出的基于合约状态检查的构件测试方法,将构件的交互关系分为客户方与服务方。根据构件的权利和义务,在客户方的构件中内置用于对服务方进行测试的接口,通过构件状态的转换分析构件的内部信息,验证是否满足前置条件;在服务方的构件中内置状态设置与状态验证的合约测试接口,状态设置将构件设置为测试所需要的前置条件状态,状态验证根据构件的内部状态验证是否满足后置条件。

在今后的工作中,将进一步完善该方法,尽可能应用到实际的构件开发和测试工作中。

参考文献

[1] 单锦辉,姜瑛,孙萍.软件测试研究进展[J].北京大学学报:自然科学版,2005,41(l):134?145.

[2] 张毅坤,叶涛,邢传玉.面向构件化软件的合约检查测试框架[J].计算机工程,2006,32(20):78?80.

[3] 吴立松,杨根兴,蔡立志.基于构件的测试脚本复用技术研究[J].计算机应用研究,2009,26(4):1323?1326.

[4] 付剑平,陆民燕.软件测试性设计综述[J].计算机应用,2008,28(11):2915?2918.

[5] MEYER B. Object?oriented software construction [M]. New Jersey: Prentice Hall, 1997.

[6] 刘永红.构件及基于构件的软件测试研究[D].成都:中国科学院,2006.

[7] 余金山,刘志伟.一种基于内置合约检查和可配置接口的软构件测试技术[J].计算机应用研究,2011,28(5):1756?1760.

[8] 徐亮,曹万华,陈靖,等.一种舰载指控系统构件集成测试方法[J].计算机与数字工程,2010,38(6):54?58.

[9] 叶婷婷,王映辉.一种基于AOP的构件合约化测试方法与实现[J].计算机技术与发展,2012,22(6):71?74.

[10] 陈锦富,卢炎生,谢晓东.软件错误注入测试技术研究[J].软件学报,2009,20(6):1425?1443.

[11] 韦群,王珏.软件缺陷及其对软件可靠性的影响分析[J].计算机应用与软件,2011,28(001):145?149.