XMind2TestCase 工具有效的设计测试用例

一、背景:

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

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

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

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

二、环境安装

1、安装Python+Pycharm(默认大家均已经安装了)

2、安装xmind2testcase第三方库(-i 国内镜像源)

pip3 install xmind2testcase -i https://pypi.tuna.tsinghua.edu.cn/simple 

3、若很早安装xmind2testcase第三方库的话,建议升级该库

pip3 install -U xmind2testcase -i https://pypi.tuna.tsinghua.edu.cn/simple 

4、使用cmd打开命令符窗口,输入:xmind2testcase webtool (默认使用的端口是5001)或 xmind2testcase webtool  8888 ( 自定义端口)

5、使用http://192.168.31.204/:5001/ 或 http://localhost:5001/ 都可以访问xmind2testcase 网站(使用flask框架写的)

 

三、xmind工具的选择和xmind测试用例规则模板(安装xmind8可能需要系统管理员账号来处理,这个找运维黄常有处理下;)

1、xmind工具的选择(xmind-8-update9-windows)

注意,xmind2testcase只支持xmind-8-update9-windows上编写的用例,所以一定要使用xmind-8-update9-windows工具来整;

若小伙伴们没有xmind-8-update9-windows安装包的话,点击百度网盘直接下载,无需安装;

 

2、xmind编写用例模板,完整版本规则(增加标识用例结果规则)

 

3、简单模板实例(xmind默认的模板)

 

 

4、简单用例模板解析实例结果(访问xmind2testcase页面,选择我上传的案例xmind文件,再点击开始转换)

5、简单模板实例,导出CSV文件

注意我们使用标注优先级图标作为”测试标题”与”测试步骤”界线,如果解析过程没有遇到优先级图标,则TestSuite后面的子主题链作为一条测试用例

一条测试用例支持只有标题,没有测试步骤和预期结果,因为实际测试过程中,我们常常通过用例标题就可以明确测试点了。

6、多层级别测试模板示例

 

注意:分层级上都有前置条件的话,解析生成用例时,会自动识别且会自动拼接起来;

7、多层级别用例模板解析结果示例展示(访问xmind2testcase页面,选择我上传的案例xmind文件,再点击开始转换

8、多层级别案例,导出为csv

 

四、修改xmind2testcase源代码(上述的案例导出的文件格式不符合我们当前测试用例模板

请各位找到  ..\Lib\site-packages\xmind2testcase 的目录,打开zentao.py

1、修改csv文件导出的模板title,设置符合当前测试组的用例模板,修改zentao.py

def xmind_to_zentao_csv_file(xmind_file): 
       # 修改前
       # fileheader = ["所属模块", "用例标题", "前置条件", "步骤", "预期", "关键词", "优先级", "用例类型", "适用阶段"]
       # 修改后
         fileheader = ["标题", "描述", "优先级", '步骤ID', "步骤", "期望结果", "经办人", "测试用例类型", "需求", "模块" , "修改版本", "测试用例集"]

def gen_a_testcase_row(testcase_dict):
    #(可以把原函数给注释掉,再把这段代码复制过去,修改后的内容)
    # 测试用例标题
    case_title = testcase_dict['name']
    # 前置条件
    case_precontion = testcase_dict['preconditions']
    # 优先级
    case_priority = gen_case_priority(testcase_dict['importance'])
    # 步骤ID  (设置默认值)
    case_stepId = 1
    # "步骤", "期望结果"
    case_step, case_expected_result = gen_case_step_and_expected_result(testcase_dict['steps'])
    # 经办人   (设置默认值)
    case_person = '经办人'
    # 测试用例类型
    case_type = gen_case_type(testcase_dict['execution_type'])
    # 需求ID
    case_storyId = gen_case_module(testcase_dict['suite'])
    # 模块
    case_module = '需求模块'
    # 修复版本  (设置默认值)
    case_version = 'version'   
    # 测试用例集  (设置默认值)
    case_suites = '【需求模块】version功能用例集'
    row = [case_title, case_precontion, case_priority, case_stepId, case_step, case_expected_result, case_person, case_type, case_storyId, case_module, case_version, case_suites]
    return row

2、修改测试用例优先级,修改zentao.py

def gen_case_priority(priority):
    # 修改前
    # mapping = {1: '高', 2: '中', 3: '低'}
    # 修改后
    mapping = {1: 'High', 2: 'Medium', 3: 'Low'}
    if priority in mapping.keys():
        return mapping[priority]
    else:
        # 修改前
        # return '中'
        # 修改后
        return 'Medium'

3、修改测试用例类型,修改zentao.py

def gen_case_type(case_type):
    # 修改前
    # mapping = {1: '手动', 2: '自动'}
    # 修改后
    mapping = {1: '功能测试用例', 2: '兼容性测试用例', 3: '安全测试用例', 4: '性能测试用例', 5: '易用性测试用例' , 6: '其他类型用例'}
    if case_type in mapping.keys():
        return mapping[case_type]
    else:
        # 修改前
        # return '手动'
        # 修改后
        return '功能测试用例'

4、再次修改其他文件的测试类型,这样就与第三点zentao文件一一对应,修改parser.py

修改前:

def get_execution_type(topics):
    labels = [topic.get('label', '') for topic in topics]
    labels = filter_empty_or_ignore_element(labels)
    exe_type = 1
    for item in labels[::-1]:
        if item.lower() in ['自动', 'auto', 'automate', 'automation']:
            exe_type = 2
            break
        if item.lower() in ['手动', '手工', 'manual']:
            exe_type = 1
            break
    return exe_type
修改后:

def get_execution_type(topics):
    labels = [topic.get('label', '') for topic in topics]
    labels = filter_empty_or_ignore_element(labels)
    exe_type = 1
    for item in labels[::-1]:
        if item.lower() in ['兼容', '兼容性', '兼容性测试用例']:
            exe_type = 2
            break
        if item.lower() in ['安全', '安全测试用例']:
            exe_type = 3
            break
        if item.lower() in ['性能', '性能测试用例']:
            exe_type = 4
            break
        if item.lower() in ['易用', '易用性', '易用性测试用例']:
            exe_type = 5
            break
        if item.lower() in ['其他', '其它']:
            exe_type = 6
            break
        if item.lower() in ['手工', '手动', '功能']:
            exe_type = 1
            break
    return exe_type

5、导出文件存在空行,修改zentao.py

zentao.py文件找到xmind_to_zentao_csv_file函数,写入文件方法加上newline=''

修改前:

with open(zentao_file, 'w', encoding='utf8') as f:
修改后:

with open(zentao_file, 'w', encoding='utf8', newline='') as f:

6、用例步骤、预期结果序号后多一个空格,修改zentao.py  (看自己需不需要修改啦)

def gen_case_step_and_expected_result(steps):
    case_step = ''
    case_expected_result = ''
    # 修改后,把+ '. ' + 后的空格去掉  + '.' +
    for step_dict in steps:
        case_step += str(step_dict['step_number']) + '. ' + step_dict['actions'].replace('\n', '').strip() + '\n'
        case_expected_result += str(step_dict['step_number']) + '. ' + \
            step_dict['expectedresults'].replace('\n', '').strip() + '\n' \
            if step_dict.get('expectedresults', '') else ''

7、每导出一个用例步骤和预期结果都会多一个换行符,修改zentao.py

def gen_case_step_and_expected_result(steps):
    case_step = ''
    case_expected_result = ''
    for step_dict in steps:
        .....(后面添加即可)
    # 添加,去除每个单元格里最后一个换行符
    case_step = case_step.rstrip('\n')
    case_expected_result = case_expected_result.rstrip('\n')
    return case_step, case_expected_result

8、若存在多层用例设计的情况下,我们可以给用例标题加个【-】,修改parser.py

def gen_testcase_title(topics):
    """Link all topic's title as testcase title"""
    titles = [topic['title'] for topic in topics]
    titles = filter_empty_or_ignore_element(titles)

    # when separator is not blank, will add space around separator, e.g. '/' will be changed to ' / '
    separator = config['sep']
    if separator != ' ':
        # 原格式为{},再修改为-{}
        separator = ' -{} '.format(separator)

9、由于我们导入jira是通过需求ID来检测的,所以我们需要用正则来匹配需求的编号,修改utils.py

utils.py文件找到get_xmind_testcase_list函数,找到case_data['suite'] = suite.name,先把其注释掉,再复制如下的代码

# case_data['suite'] = suite.name
# 修改后
import re
# 定义匹配的正则表达式模式
pattern = r'\【(.*?)\】'
# 使用re.search()方法找到第一个匹配的子字符串
matches = re.search(pattern, suite.name)
# 输出匹配的结果
if matches:
    case_data['suite'] = matches.group(1)
else:
    pass

五、实际场景案例操作;

1、xmind实际编写案例;

2、案例解析结果如下;

3、导出csv测试用例;

 

注意要替换下经办人、修改版本,测试用例集哦;

注意要替换下经办人、修改版本,测试用例集哦;

注意要替换下经办人、修改版本,测试用例集哦;

另外可以用个快捷键快速的给用例打上优先级,如优先级为中,批量选择后直接按ctrl+2即可 (1:优先级高,2:优先级中,3:优先级低)

最后再把这个csv文件修改下编码格式为utf-8,再导入到jira即可;

六、FAQ

1. 转换用例失败,提示“该文件无法正常打开,请勿修改并保存,否则文件内容将会永久性丢失!”

答:使用的xmind版本不匹配,使用xmind 8打开文件后另存即可。

2. 转换后的用例,步骤内容在testcase部分,步骤为空?

 

答:xmind2testcase使用标注优先级图标作为"测试标题"与"测试步骤"界线,如果解析过程没有遇到优先级图标,则TestSuite后面的子主题链作为一条测试用例。一条测试用例支持只有标题,没有测试步骤和预期结果,因为实际测试过程中,我们常常通过用例标题就可以明确测试点了。

 

 

posted @ 2023-08-06 19:01  Test挖掘者  阅读(658)  评论(0编辑  收藏  举报