自动化工具 基于模型的测试 (Model-based Testing),希望大家能给一些建议

Never_More · 2019年03月11日 · 最后由 Xuebing Du 回复于 2020年06月09日 · 9192 次阅读
本帖已被设为精华帖!

最近了解到了 MBT,结合项目开发了个框架,不知道称不称得上是 MBT。

刚开始弄,文档也还很简陋,希望大家能给一些建议

项目地址:https://github.com/CXingL/MBT_CX

MBT_CX

MBT (Model-based testing) 基于模型测试

概念:

属于一种测试方法:利用模型自动产生测试用例/测试套件,然后执行测试。

以百度搜索为例:

  • 在 MBT 目录下执行 python3 run_model.py -t model/example.graphml 检查模型图是否正确,确认没有报错或者死循环;
    然后执行 python3 run_model.py -f model/example.graphml,会在 page_script 目录下生成一个 example_web.py(模型图文件名_测试平台.py)的文件

  • 打开上一步生成的 py 文件,按 selenium 规则完成脚本:

  • 脚本完成后,在 MBT 目录下执行 pytest 开始测试,测试效果:

执行测试前可以先打开 test_main.py 文件进行一些简单的设置,例如设置运行浏览器、测试的执行速度、测试文件较多时,可以在 test_main 中选择跳过一些测试等

  • 测试完成后,在 report 目录下会生成测试报告,打开 report.html 即可查看本次测试结果。

运行环境:

1. yEd 下载(非必须):

查看和编辑模型图的软件,模型图文件全部在 model 文件夹下,后缀为 .graphml 的文件
下载地址: https://www.yworks.com/downloads - yEd
也可以在线使用:https://www.yworks.com/yed-live/

2. 安装并配置 Java 环境(必须):

安装并配置 Java 环境,推荐 Java8

3. python3(必须):

安装并配置 Python3 环境

4. jq(必须):

命令行 json 处理工具,对 graphwalker 生成的测试用例进行筛选,安装方法:brew install jq(需要先安装 brew)。其它安装方法请查看官方文档:https://stedolan.github.io/jq/

5. selenium 环境(web 端测试必须,Android、 iOS 非必须):

selenium:浏览器自动测试工具,安装 Python3 后在终端输入 pip3 install selenium 即可安装

6. chromedriver(web 端测试 Chrome 浏览器必须):

  1. 下载 https://sites.google.com/a/chromium.org/chromedriver/downloads
  2. 将解压的 chromedriver 移动到/usr/local/bin 目录下 #### 7. Appium 环境(Android、iOS 端测试必须): 内容比较多,Android 和 iOS 不同,具体请查看 Appium 官方文档安装: http://appium.io/docs/en/about-appium/getting-started/ #### 8. 在 MBT 目录下执行 pip3 install -r requirements.txt 安装框架中所用到的库

使用

Web 端:

  1. 修改 test_main.py 中的内容,调整一些测试参数和选择要测试的内容等(不需要执行的测试取消 @pytest.mark.skip("nothing") 的注释即可)
  2. 在 MBT 文件夹下执行:pytest 开始测试
  3. 测试完成后在 report 文件夹下会生成本次的测试报告

Android、iOS 端:

  1. 连接 Android、iOS 设备或模拟器,Android 准备好 REVINYL 测试 apk,iOS 安装好 REVINYL
  2. 启动 Appium 服务
  3. 修改 test_main.py 中的内容,调整一些测试参数和选择要测试的内容( Android 将测试 apk 放入 application 文件夹下,并将 test_main.py 中的 app 修改为 apk 的名字)
  4. 在 MBT 文件夹下执行:pytest 开始测试
  5. 测试完成后在 report 文件夹下会生成本次的测试报告

其它

  1. iOS 使用中如果出现报错类似:

E       selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: Error Domain=com.facebook.WebDriverAgent Code=1 "The element '"Cancel" Button' is not visible on the screen and thus is not interactable" UserInfo={NSLocalizedDescription=The element '"Cancel" Button' is not visible on the screen and thus is not interactable}

应该是 appium 的 bug,解决办法:尝试升级 Appium 或者 iOS 版本,具体见:
https://github.com/facebook/WebDriverAgent/issues/914

  1. @pytest.mark.skip("nothing") 会跳过该测试,测试中注释掉即可
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 36 条回复 时间 点赞

赞,先马克一下,抽空再看

有意思,赞,先 M 一下

思路很好,我是觉得能生成测试用例就很好,生成自动化脚本反而限制了应用场景

这个 model 是手动建立的?

陈恒捷 将本帖设为了精华贴 03月12日 00:05

加精理由:不仅分享 MBT 生成用例,而且还开源,值得鼓励。

有个疑问,生成的代码里面,执行顺序是如何控制的?我看到每个路径的操作都对应创建了一个方法,但没看到把这些方法串起来部分的代码。

陈恒捷 回复

流程是 有向图解析。 graph 有几种覆盖模式

是的

有意思,有时间再看看

这思路满有意思

赞一下分享精神。
我们团队也有 MBT 的想法。结合测试理论来看,应该有好几种方式,在实际项目中一般会结合使用。
例如流程图、状态机、正交或者 pairs、边界值和等价类等,我们希望能做出一个平台能够综合这几种方式。

avenn 回复

这个好专业 💯

匿名 #16 · 2019年03月12日

@Never_More MBT 我一直有一点疑问,就是如何根据 M 生成用例脚本?这期间所做的工作相对直接写脚本性价比如何,即解决什么问题的时候 MBT 有优势,解决什么问题的时候直接写脚本强?

回归到你的代码,我看了一下,你生成的测试脚本中,以下元素定位部分的代码需要再另外处理完成么,比如手工?

class Action(helper.Web):
    def __init__(self, driver):
        helper.Web.__init__(self, driver)

    def e_getUrl(self):
        self.driver.find_element_by_xpath('').click()

    def e_inputEnglish(self):
        self.driver.find_element_by_xpath('').clear()
        self.driver.find_element_by_xpath('').send_keys()

    def e_inputChinese(self):
        self.driver.find_element_by_xpath('').clear()
        self.driver.find_element_by_xpath('').send_keys()

    def e_clickSearch(self):
        self.driver.find_element_by_xpath('').click()

    def e_clickResult1(self):
        self.driver.find_element_by_xpath('').click()

    def e_closeNewTab(self):
        self.driver.find_element_by_xpath('').click()

    def e_clickResult2(self):
        self.driver.find_element_by_xpath('').click()

虚心求教,望指点哈。另外,代码中有一些错误,这里不一一说明,稍后在 github 上以 issue 反馈给你吧。

同楼上的问题,顺便补几个问题:

  1. MBT 很久之前就出现了,之所以迟迟没有落地,是因为无法控制用例爆炸的问题,请问目前是不是出现了新的模型可以有效减少用例数量呢?(在没有人为干预的情况下)
  2. 对于自动生成的操作,请问期望结果该如何去有效匹配?
  3. 对于模型本身的准确性是否有理论或其他方式来验证?
simple 回复

这个我硕士论文研究过,应该有一定的权威性
1、空间爆炸一直无法解决
2、真正的 mbt,是看代码覆盖率
3、模型和需求的一致性,没有很好的理论来验证

匿名 #19 · 2019年03月13日
haleli 回复

大神的论文方便公开参考学习吗,谢谢

  1. 模型图生成用例是使用的 https://github.com/GraphWalker/graphwalker-project 这个项目的 jar 包,站在大佬的肩膀做事
  2. 目前在项目中的应用主要是在单体测试完成后,用来做流程测试和回归测试。相比于直接写脚本一是在操作上有随机性,会测出没有考虑到的操作流程,二是重复性工作比较少
  3. 脚本初步生成后,是需要人工补全元素定位,一个元素定位基本只需要写一次,所以工作量并不大,更重要的是模型图的设计
simple 回复

关于用例爆炸的问题,目前我们是在单体测试完成后做 MBT 测试,对单个控件就不会再测特殊输入或操作,然后再对大功能模块进行拆分,对复杂的小功能模块进行封装,尽量控制用例数量
其它问题我就回答不了了,我也才接触 MBT 半年,只用到了一点皮毛

Never_More 回复

已经做的很不错了,期待你们更进一步的成果哦!之前我调研的时候遇到这几个问题,所以放弃了

MBT 基于模型测试,将更多的时间集中在用例的设计上面,方便用例评审和维护。

也有类似的开源软件,能够生成用例,然后选择是 online 还是 offline 执行
https://github.com/intel/fMBT/

我想到了规则引擎😂

android 有能生成类似 model 的开源项目么?

haleli 回复

楼主所言极是,关于你所列举的三个问题,我们在开发我们的 MBT 工具 (http://www.etestinfo.com/) 时也是遇到了极大的挑战:
1、空间爆炸一直无法解决
-- 这个问题绕不过去,但是可以使用全局优化策略,还是实用的。
2、真正的 mbt,是看代码覆盖率
-- 对于黑盒功能测试来说,倒不是看代码覆盖率,而是通过控制依赖及数据依赖来定义需求的覆盖率。
3、模型和需求的一致性,没有很好的理论来验证
-- 从需求里建立的模型如果带有原始需求的元数据,并配合跟踪矩阵使用,可以通过模型评审来基本确认其一致性。

挺有意思的,但是瞅了下楼主和官网的,貌似都只能模拟 web 端 or 移动端的行为模型
不知道对于 java 后端服务是否可用?

有个问题 如果 graphwalker 一次无法遍历所有节点 工具是否会报错?

isaac 回复

没有 java 服务端的

AngryTester 回复

可以用指令先只执行模型图,确定模型图通过后再开始自动化测试

MBT 里面两个问题很难解决,看发表的论文上也没有很好落地的:
[1] 如何适配现有被测系统, 适配的足够好的难度类似于写了一门新的语言。
a. 如何适配
b. 用例自动生成阶段

[2] 用例爆炸时, 使用什么的算法做最小化测试样本赛选

MARK 一下先

你好,MBT 项目时 python 写的吗?项目是什么类型的项目?刚接触也想做 MBT,谢谢解答!

simple [精彩盘点] TesterHome 社区 2019 年 度精华帖 中提及了此贴 12月24日 23:00
simple [精彩盘点] TesterHome 社区 2019 年 度精华帖 中提及了此贴 12月24日 23:00
haleli 回复

大神的论文在哪里可以看到呀?最近也在研究 MBT。

rywu 回复

graph 有几种覆盖模式 ,那对应不同的覆盖模式的执行的 路径信息 也可以生成吗?

《基于模型的测试:一个软件工艺师的方法》这本书有人看了么,我今天刚好搜索到 MBT,找到这里来了。

Never_More 关闭了讨论 06月22日 13:34
Never_More 重新开启了讨论 06月22日 13:34
Never_More 关闭了讨论 06月22日 13:50
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册