XMind2TestCase 工具,提供了一个高效测试用例设计的解决方案(开源)

一、背景

软件测试过程中,最重要、最核心就是测试用例的设计,也是测试童鞋、测试团队日常投入最多时间的工作内容之一。

然而,传统的测试用例设计过程有很多痛点:

  • 1、使用Excel表格进行测试用例设计,虽然成本低,但版本管理麻烦,维护更新耗时,用例评审繁琐,过程报表统计难...
  • 2、使用TestLink、TestCenter、Redmine等传统测试管理工具,虽然测试用例的执行、管理、统计比较方便,但依然存在编写用例效率不高、思路不够发散、在产品快速迭代过程中比较耗时等问题...
  • 3、公司自研测试管理工具,这是个不错的选择,但对于大部分小公司、小团队来说,一方面研发维护成本高,另一方面对技术要有一定要求...
  • 4、...

基于这些情况,现在越来越多公司选择使用思维导图这种高效的生产力工具进行用例设计,特别是敏捷开发团队。

事实上也证明,思维导图其发散性思维、图形化思维的特点,跟测试用例设计时所需的思维非常吻合,所以在实际工作中极大提升了我们测试用例设计的效率,也非常方便测试用例评审。

但是与此同时,使用思维导图进行测试用例设计的过程中也带来不少问题:

  • 1、测试用例难以量化管理、执行情况难以统计;
  • 2、测试用例执行结果与BUG管理系统难以打通;
  • 3、团队成员用思维导图设计用例的风格各异,沟通成本巨大;
  • 4、...

综合以上情况,我们可以发现不同的测试用例设计方式,各有各个的优劣。

那么问题来了,我们能不能将它们各自优点合在一起呢?这样不就可以提升我们的效率了!

于是,这时候 XMind2TestCase 就应运而生了,该工具基于 Python 实现,通过制定测试用例通用模板, 然后使用 XMind 这款广为流传且开源的思维导图工具进行用例设计。 其中制定测试用例通用模板是一个非常核心的步骤(具体请看使用指南),有了通用的测试用例模板,我们就可以在 XMind 文件上解析并提取出测试用例所需的基本信息, 然后合成常见测试用例管理系统所需的用例导入文件。这样就将 XMind 设计测试用例的便利常见测试用例系统的高效管理结合起来了!

当前 XMind2TestCase 已实现从 XMind 文件到 TestLink 和 Zentao(禅道) 两大常见用例管理系统的测试用例转换,同时也提供 XMind 文件解析后的两种数据接口 (TestSuites、TestCases两种级别的JSON数据),方便快速与其他测试用例管理系统打通。

二、使用示例

1、Web工具示例

2、转换后用例预览

3、TestLink导入结果示例

4、禅道(ZenTao)导入结果示例

三、安装方式

pip3 install xmind2testcase
复制代码

四、版本升级

pip3 install -U xmind2testcase
复制代码

五、使用方式

1、命令行调用

Usage:xmind2testcase [path_to_xmind_file] [-csv] [-xml] [-json]Example:xmind2testcase /path/to/testcase.xmind        => output testcase.csv、testcase.xml、testcase.jsonxmind2testcase /path/to/testcase.xmind -csv   => output testcase.csvxmind2testcase /path/to/testcase.xmind -xml   => output testcase.xmlxmind2testcase /path/to/testcase.xmind -json  => output testcase.json
复制代码

2、使用Web界面

Usage:xmind2testcase [webtool] [port_num]Example:xmind2testcase webtool        => launch the web testcase convertion tool locally -> 127.0.0.1:5001xmind2testcase webtool 8000   => launch the web testcase convertion tool locally -> 127.0.0.1:8000
复制代码

3、API调用

import json
import xmind
from xmind2testcase.zentao import xmind_to_zentao_csv_file
from xmind2testcase.testlink import xmind_to_testlink_xml_file
from xmind2testcase.utils import xmind_testcase_to_json_file
from xmind2testcase.utils import xmind_testsuite_to_json_file
from xmind2testcase.utils import get_xmind_testcase_list
from xmind2testcase.utils import get_xmind_testsuite_listdef main():xmind_file = 'docs/xmind_testcase_template.xmind'print('Start to convert XMind file: %s' % xmind_file)zentao_csv_file = xmind_to_zentao_csv_file(xmind_file)print('Convert XMind file to zentao csv file successfully: %s' % zentao_csv_file)testlink_xml_file = xmind_to_testlink_xml_file(xmind_file)print('Convert XMind file to testlink xml file successfully: %s' % testlink_xml_file)testsuite_json_file = xmind_testsuite_to_json_file(xmind_file)print('Convert XMind file to testsuite json file successfully: %s' % testsuite_json_file)testcase_json_file = xmind_testcase_to_json_file(xmind_file)print('Convert XMind file to testcase json file successfully: %s' % testcase_json_file)testsuites = get_xmind_testsuite_list(xmind_file)print('Convert XMind to testsuits dict data:\n%s' % json.dumps(testsuites, indent=2, separators=(',', ': '), ensure_ascii=False))testcases = get_xmind_testcase_list(xmind_file)print('Convert Xmind to testcases dict data:\n%s' % json.dumps(testcases, indent=4, separators=(',', ': ')))workbook = xmind.load(xmind_file)print('Convert XMind to Json data:\n%s' % json.dumps(workbook.getData(), indent=2, separators=(',', ': '), ensure_ascii=False))print('Finished conversion, Congratulations!')if __name__ == '__main__':main()
复制代码

4、XMind用例文件转为JSON数据

(1)转为测试用例JSON数据
from xmind2testcase.utils import get_xmind_testcase_list
xmind_file = 'docs/xmind_testcase_demo.xmind'
testcases = get_xmind_testcase_list(xmind_file)
print(testcases)Output:[{                                                # 测试用例"name": "测试用例1",                           # 用例标题"version": 1,                                 # 用例版本"summary": "测试用例1",                        # 用例摘要"preconditions": "前置条件",                   # 前置条件"execution_type": 1,                          # 用例执行类型(1:手动、2:自动)"importance": 1,                              # 优先级(1:高、2:中、3:低)"estimated_exec_duration": 3,                 # 预计执行时间(分钟)"status": 7,                                  # 用例状态(1:草稿、2:待评审、3:评审中、4:重做、5、废弃、6:feature、7:终稿)"steps": [                                    # 测试步骤列表{"step_number": 1,                     # 编号"actions": "测试步骤1",                 # 步骤内容"expectedresults": "预期结果1",         # 预期结果"execution_type": 1                    # 执行类型(1:手动,2:自动)}, {"step_number": 2, "actions": "测试步骤2", "expectedresults": "预期结果2", "execution_type": 1}], "product": "我是产品名",                          # 产品名称"suite": "我是模块名(测试集1)"                     # 测试集(模块名)}, {"name": "测试用例2", "version": 1, "summary": "测试用例2", "preconditions": "前置条件", "execution_type": 1, "importance": 1, "estimated_exec_duration": 3, "status": 7, "steps": [{"step_number": 1, "actions": "测试步骤1", "expectedresults": "预期结果1", "execution_type": 1}, {"step_number": 2, "actions": "测试步骤2(预期结果2可以为空)", "expectedresults": "", "execution_type": 1}, {"step_number": 3, "actions": "测试步骤3", "expectedresults": "预期结果3", "execution_type": 1}, {"step_number": 4, "actions": "测试步骤4", "expectedresults": "预期结果4", "execution_type": 1}], "product": "我是产品名", "suite": "我是模块名(测试集1)"}, {"name": "测试用例3(测试步骤和预期结果可以都为空)", "version": 1, "summary": "测试用例3(测试步骤和预期结果可以都为空)", "preconditions": "无", "execution_type": 1, "importance": 2, "estimated_exec_duration": 3, "status": 7, "steps": [ ], "product": "我是产品名", "suite": "我是模块名(测试集1)"}, {"name": "测试步骤2(优先级默认为中)", "version": 1, "summary": "测试步骤2(优先级默认为中)", "preconditions": "无", "execution_type": 1, "importance": 3, "estimated_exec_duration": 3, "status": 7, "steps": [{"step_number": 1, "actions": "测试步骤1", "expectedresults": "预期结果1", "execution_type": 1}, {"step_number": 2, "actions": "测试步骤3", "expectedresults": "", "execution_type": 1}], "product": "我是产品名", "suite": "我是模块名(测试集2)"}, {"name": "测试用例3(前置条件默认为空) 无设置优先级,这里加入用例标题", "version": 1, "summary": "测试用例3(前置条件默认为空) 无设置优先级,这里加入用例标题", "preconditions": "无", "execution_type": 1, "importance": 2, "estimated_exec_duration": 3, "status": 7, "steps": [ ], "product": "我是产品名", "suite": "我是模块名(测试集2)"}
]
复制代码
(2)转为测试集JSON数据
from xmind2testcase.utils import get_xmind_testsuite_list
xmind_file = 'docs/xmind_testcase_demo.xmind'
testsuites = get_xmind_testsuite_list(xmind_file)
print(testsuites)Output:[{                                                 # XMind画布(Sheet)列表"name": "我是产品名",                             # 产品名称"details": null,                                 # 产品摘要"testcase_list": [],                             # 用例列表"sub_suites": [                                  # 用例集列表{"name": "我是模块名(测试集1)",                  # 用例集1名称(模块名)"details": null,                             # 用例集摘要"testcase_list": [                           # 用例列表{                                          # 具体用例"name": "测试用例1","version": 1,"summary": "测试用例1","preconditions": "前置条件","execution_type": 1,"importance": 1,"estimated_exec_duration": 3,"status": 7,"steps": [{"step_number": 1,"actions": "测试步骤1","expectedresults": "预期结果1","execution_type": 1},{"step_number": 2,"actions": "测试步骤2","expectedresults": "预期结果2","execution_type": 1}]},{"name": "测试用例2","version": 1,"summary": "测试用例2","preconditions": "前置条件","execution_type": 1,"importance": 1,"estimated_exec_duration": 3,"status": 7,"steps": [{"step_number": 1,"actions": "测试步骤1","expectedresults": "预期结果1","execution_type": 1},{"step_number": 2,"actions": "测试步骤2(预期结果2可以为空)","expectedresults": "","execution_type": 1},{"step_number": 3,"actions": "测试步骤3","expectedresults": "预期结果3","execution_type": 1},{"step_number": 4,"actions": "测试步骤4","expectedresults": "预期结果4","execution_type": 1}]},{"name": "测试用例3(测试步骤和预期结果可以都为空)","version": 1,"summary": "测试用例3(测试步骤和预期结果可以都为空)","preconditions": "无","execution_type": 1,"importance": 2,"estimated_exec_duration": 3,"status": 7,"steps": []}],"sub_suites": []                            # 用例集中可以包含子用例集(目前只要产品类别下有用例集)},{"name": "我是模块名(测试集2)",                  # 用例集2名称(模块名)"details": "测试集摘要(详情)","testcase_list": [{"name": "测试步骤2(优先级默认为中)","version": 1,"summary": "测试步骤2(优先级默认为中)","preconditions": "无","execution_type": 1,"importance": 3,"estimated_exec_duration": 3,"status": 7,"steps": [{"step_number": 1,"actions": "测试步骤1","expectedresults": "预期结果1","execution_type": 1},{"step_number": 2,"actions": "测试步骤3","expectedresults": "","execution_type": 1}]},{"name": "测试用例3(前置条件默认为空) 无设置优先级,这里加入用例标题","version": 1,"summary": "测试用例3(前置条件默认为空) 无设置优先级,这里加入用例标题","preconditions": "无","execution_type": 1,"importance": 2,"estimated_exec_duration": 3,"status": 7,"steps": []}],"sub_suites": []}]}
]
复制代码
(3)XMind文件转换为JSON数据

以上(1)TestCase数据、(2)TestSuite数据的获取,其实是基于**XMind**这个工具,对XMind文件进行解析和数据提取,然后转换而来。 这个工具是在设计XMind2TestCase时,针对XMind单独抽取出来的库,提供了XMind思维导图创建、解析、更新的一系列方法。使用它可以直接将XMind文件转换为JSON数据:

import xmind
xmind_file = 'docs/xmind_testcase_demo.xmind'
workbook = xmind.load(xmind_file)
data = workbook.getData()
print(data)Output:[{                                                    # XMind画布(sheet)列表"id": "7hmnj6ahp0lonp4k2hodfok24f",                # 画布ID"title": "画布 1",                                  # 画布名称"topic": {                                         # 中心主题"id": "7c8av5gt8qfbac641lth4g1p67",              # 主题ID"link": null,                                    # 主题上的超链接信息"title": "我是产品名",                             # 主题名称"note": null,                                    # 主题上的备注信息"label": null,                                   # 主题上标签信息"comment": null,                                 # 主题上的批注(评论)信息"markers": [],                                   # 主题上的图标信息"topics": [                                      # 子主题列表{"id": "2rj4ek3nn4sk0lc4pje3gvgv9k","link": null,"title": "我是模块名(测试集1)",                  # 子主题1"note": null,"label": null,"comment": null,"markers": [],"topics": [                                    # 子主题下的子主题列表{"id": "3hjj43s7rv66uncr1srl3qsboi","link": null,"title": "测试用例1","note": "前置条件\n","label": "手动(执行方式默认为手动)","comment": null,"markers": ["priority-1"],"topics": [{"id": "3djn37j1fdc6081de319slf035","link": null,"title": "测试步骤1","note": null,"label": null,"comment": null,"markers": [],"topics": [{"id": "7v0f1152popou38ndaaamt49l5","link": null,"title": "预期结果1","note": null,"label": null,"comment": null,"markers": []}]},{"id": "2srtqqjp818clkk1drm233lank","link": null,"title": "测试步骤2","note": null,"label": null,"comment": null,"markers": [],"topics": [{"id": "4jlbo280urmid3qkd01j7h8jnq","link": null,"title": "预期结果2","note": null,"label": null,"comment": null,"markers": []}]}]},...]},...]}}
]
复制代码

具体参考:xmind_testcase_demo.json

四、自动化发布:一键打 Tag 并上传至 PYPI

每次在 __ about __.py 更新版本号后,运行以下命令,实现自动化更新打包上传至 PYPI ,同时根据其版本号自动打 Tag 并推送到仓库:

python3 setup.py pypi
复制代码

五、致谢

XMind2TestCase 工具的产生,受益于以下四个开源项目,并在此基础上扩展、优化,受益匪浅,感恩!

  • 1、XMind:XMind思维导图创建、解析、更新的一站式解决方案(Python实现)!
  • 2、xmind2testlink:践行了XMind通用测试用例模板设计思路,同时提供了Web转换工具!
  • 3、TestLink:提供了完整的测试用例管理流程和文档;
  • 4、禅道开源版(ZenTao):提供了完整的项目管理流程、文档和用户交流释疑群;

得益于开源,也将坚持开源,并为努力开源贡献自己的点滴之力。后续,将继续根据实际项目需要,定期进行更新维护, 欢迎大伙的使用和意见反馈,谢谢!

(如果本项目对你有帮助的话,也欢迎 star

玩转用例设计:XMind2TestCase一个高效的测试用例设计解决方案相关推荐

  1. (开源)XMind2TestCase一个高效的测试用例设计解决方案

    XMind2TestCase 工具,提供了一个高效测试用例设计的解决方案! 一.背景 软件测试过程中,最重要.最核心就是测试用例的设计,也是测试童鞋.测试团队日常投入最多时间的工作内容之一. 然而,传 ...

  2. 自动化测试用例设计(四)自动化测试用例设计实例

    自动化测试用例设计(四)自动化测试用例设计实例 编写自动化测试用例的原则: 1.一个脚本是一个完整的场景,从用户登陆操作到用户退出系统关闭浏览器. 2.一个脚本脚本只验证一个功能点,不要试图用户登陆系 ...

  3. xmind2testcase:高效的测试用例导出工具

    软件测试的核心是什么?毫无疑问是测试分析和用例设计.测试分析一般包括三种方法:1. 质量模型分析法 2.功能交互分析法 3. 用户场景分析法.其核心在于通过多层次分析测试点,即用户角度的业务场景+技术 ...

  4. 如何才能设计出一个“好的”测试用例?

    1.21"好的"测试用例的定义 在正式开始讲解之前,先讲一下什么是"好的"测试用例,这个"好"又应该体现在哪些方面.这两个问题看似简单实则难 ...

  5. 让机械设计先进、高效的机械设计云平台----工业软件讲坛第四次讲座

    机械设计云平台简介 云平台介绍 云数据及知识 云数据及知识示例 云平台提供海量的标准件数据 云平台提供机械零件设计所需的专业计算公式 云平台提供机械零件计算所需的各类图形.表格 云平台提供基于移动互联 ...

  6. 实战项目:设计实现一个流程编排框架(设计)

    上一篇文章我们讲了<实战项目:设计实现一个流程编排框架(分析)>主要对流程编排框架产生的背景,并做了需求分析,这其中包含功能性需求和非功能性需求,算是在正式开始设计之前做一个铺垫. 前面提 ...

  7. 测试用例——一个杯子的测试用例设计

    功能性: 水杯的特性: 1.杯子的容量:能装多少升水,少量.半杯.满杯. 2.杯子的形状eg:圆形.上口大.下口小. 3.杯子的材料:纸杯. 4.杯子的耐温度:装冷水.冰水.热水. 5.杯子是否会漏水 ...

  8. failed to open log file_C++中glog源码剖析以及如何设计一个高效 log模块

    每个开发者编程中都会记录log信息,多数人都会使用log第三方库,log库使用起来很方便,但我们也需要了解log系统的原理,这里以glog为例进行分析. 开始 这里不会介绍glog中是如何控制INFO ...

  9. 浏览器时间久了重新登录_以登录为例讲解什么是全面的测试设计

    在面试时,面试官往往会出一个简单的场景让大家进行测试点设计来考察大家的测试设计能力,题目看似简单实则蕴藏杀机,测试人员需要根据自己的工作年限做出不同的回答方可过关.如果你工作1-2年,那么你只需要回答 ...

最新文章

  1. C#判断文件是否存在方法
  2. LeetCode Sqrt(x)
  3. 【Qt】sqlite数据库使用
  4. 数据库-优化-数据库结构的优化-数据类型
  5. Ubuntu学习小结(一) 基础知识,系统安装,软件安装,解压缩
  6. 错过了面试,公司招满人了_您可能错过了Google令人赞叹的AI公告。
  7. mysql分组取每组前几条记录(排序)
  8. 机器学习代码实战——SVM(支持向量机)(使用不同核函数)
  9. JS JQ 页面加载顺序方法的区别
  10. linux/mac下一键删除下载失败的maven jar包
  11. (二)UML语言概述
  12. 第九章(二)DAG上的动态规划
  13. mw150um 驱动程序win10_mercury无线网卡驱动
  14. 音视频技术开发周刊 85期
  15. vs2017 linux unable to start debugging
  16. c语言测序,Hi-C测序
  17. 物联网系列之WIFI模块ESP8266一介绍
  18. python股票涨停_Python与量化投资-股票复盘工具-2018-02-02
  19. 数学的三大核心领域——几何学范畴
  20. H5实现APP下载功能

热门文章

  1. iOS添加测试设备与调试
  2. quartusii开发过程中路径不能出现空格或中文
  3. 小黑小波比.404 (Not Found)
  4. ORACLE 数据字典
  5. [Korean]发音
  6. PinkLotar 外挂汉化版+Mod 工具
  7. 车联网空间巨大 解决网络安全问题乃当务之急
  8. Android后门GhostCtrl,完美控制设备任意权限并窃取用户数据
  9. Oracle Instanc Client安装命令工具
  10. careercup-链表 2.2