美文网首页
基于模型的测试(Model-based Testing)

基于模型的测试(Model-based Testing)

作者: 萩茝 | 来源:发表于2018-04-12 09:56 被阅读2276次

基于模型的测试和常规测试的区别及优点

常规测试一般是由人来设计几个特定的测试场景,然后断言测试结果。测试用例固定。缺少不确定性。

基于模型的测试(Model-based Testing)是需要实现一个模型,然后制定行为和行为之间的关系以及行为和系统的关系(有限状态机),然后测试系统根据被测系统的状态、之前设置的限制条件和策略来生成很多用例(每执行一次生成的用例会不同),测试结果受一系列操作的影响,可以产生不确定性,更有可能发现一些想不到的很深路径下的BUG。

基于模型的测试主要包含哪些部分?

1、模型程序(Model Program ):在这里定义被测系统的可以被执行的一些操作(action),比如创建一个虚机、删除一个虚机等。还有这些操作能被执行的条件(xxx_enabled)和系统在各个操作下的状态(state)。

2、Test Harness/Steper/adapter:访问被测系统,具体实现模型中定义的操作(action)。

3、策略(Strategies):在测试运行过程中,完成一个操作(action)后,下一个应该执行哪个操作,是由这个策略决定的,最简单的策略可以用随机选择的方式,还可以自己实现一些更复杂的选择策略算法,比如Zstack的公平调度算法和基于历史测试路径的调度算法。

4、测试执行器(Test Runer):执行测试、检查

基于模型的测试的一般步骤:

1、充分了解被测系统需求,将需求抽象成机器可读的模型(FSM:有限状态机),见下图示例。

vmfsm.png

2、编码实现1中建立的模型

3、跑测试

PyModel

模型的建立和跑测试可以借助开源框架PyModelhttps://github.com/jon-jacky/PyModel

Windows系统安装步骤

1、直接clone到本地目录:

git clone git@github.com:jon-jacky/PyModel.git

2、进入clone下来的目录中,在PyMode文件夹下,执行安装命令:

python setup.py install

安装到此就算完成了。但是每次执行测试命令先都得cd到PyMode\bin 目录下,执行命令pymodel_paths

然后才可以在这个windows终端中执行PyMode的各种测试命令。

比如cd到sample目录下的具体项目目录下,执行trun test 来执行示例中的测试。推荐查看samole目录下的Socket示例。

PyModel中包含的几个主要程序:pmt、pma、pmg、pmv

pmt:生成用例和跑用例

pmt的参数用法,可以在命令行中执行pmt -h 查看

pmt可以执行两种类型的测试:offline testing 和 on-the-fly testing

offline testing:测试的顺序和结果都是事先确定好的,一般的单元测试工具提供的都是这种类型的测试。

on-the-fly testing:需要Controllable actions(能被pmt调用到的:比如在Socket示例中的send_call和recv_call)和Observable actions(不能被pmt调用,是被被测系统调用,然后传回来。比如Socket示例中的send_return和recv_return)

pma:根据模型生成有限状态机(FSM)

pmg:根据FSM(通常由pma)来生成一个.dot文件,文件里是画图语言,后续生成图片用。

pmv:调用pma、pmg和dot命令,让分析和显示可以用一个命令完成。

怎么使用PyModel写测试?

1、实现模型程序:

示例:https://github.com/jon-jacky/PyModel/blob/master/samples/Socket/msocket.py

  • action函数:会定义一些action函数,表示系统的某项操作;

  • actionA_enable函数:返回True or False 定义某个action能被操作的条件;

  • state:一个元组,元素是被测系统的状态;

  • actions:一个元组,元素action函数;

  • cleanup:一个元组,元素是部分action函数,做清理操作用的;

  • enablers:一个字典,定义了action和相应action_enable函数之间的关系,当需要执行action函数前都得确保与之相对应的action_enable函数返回True才可以;

  • domain:一个字典,限制了各个action的参数取值

  • Accepting函数:返回True or False.定义系统是否处于可接受状态,在跑测试的时候测试结束条件可以用到。

  • Reset函数:重置状态

2.实现Test Harness/Steper/adapter

示例https://github.com/jon-jacky/PyModel/blob/master/samples/Socket/stepper_d.py

test_action:根据具体传入的函数名字和参数,在被测系统上做相应操作。

3.定义Observable actions

示例:https://github.com/jon-jacky/PyModel/blob/master/samples/Socket/observables.py

4.写执行具体测试命令的文件,比如叫test.py:

示例:https://github.com/jon-jacky/PyModel/blob/master/samples/Socket/test.py

主要就是调用pmt命令来执行测试

最后使用 trun xxx即可执行测试(xxx即4中的文件名称)。

另外还可以写一些限制和复杂的选择策略来丰富测试。

基于模型的测试的难点

“整个基于模型测试的难点在于提取测试模型,以及编写测试模型验证代码,而非基于模型的测试框架本身和模型算法。所以以后遇到推销基于模型测试“框架”的人,千万不要觉得他们牛的一塌糊涂,真正牛的是实现具体测试的人,而非框架本身”----《浅析ZStack是如何做智能软件测试的》

写基于模型的测试需要熟悉系统的需求,然后将需求抽象成模型。

参考文献

相关文章

网友评论

      本文标题:基于模型的测试(Model-based Testing)

      本文链接:https://www.haomeiwen.com/subject/tqfxkftx.html