最近公司有个新项目,需要写测试用例,表单项有点多,一个表单都有40个字段左右,若写用例得400条左右,大部分都是重复的项,在此写个小程序,批量生成测试用例
需要注意的是本程序只使用于表单内容
模板template.yaml
上面几个是变量,按需求填写
yaml
#input_data: 输入框数据
#index: 步骤序号
#field_name: 输入框名称
#max_length: 最大长度
#min_length: 最小长度
#data_source: 数据来源
#file_max_size: 附件最大大小
#file_min_size: 附件最小大小
#file_format: 附件格式
#file_count: 附件数量
普通输入框:
必填步骤:
- 重要级别: 高
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}为空值
预期输出: 输入框${field_name}输入为空值,提示:不能为空,重新输入
测试结果:
测试人:
备注:
步骤:
- 重要级别: 高
输入数据: ${input_data}
执行步骤: ${index}.输入正确的${field_name}
预期输出: 输入框${field_name}输入正确,转到下一步(步骤${next_index})判断
测试结果:
测试人:
备注:
- 重要级别: 高
输入数据: ${input_data}
执行步骤: ${index}.不输入${field_name}
预期输出: 输入框${field_name}输入为空值,提示:不能为空,重新输入
测试结果:
测试人:
备注:
- 重要级别: 中
输入数据: ${input_data}
执行步骤: ${index}.输入错误的${field_name}
预期输出: 输入框${field_name}输入错误,提示:请重新输入
测试结果:
测试人:
备注:
- 重要级别: 中
输入数据: ${input_data}
执行步骤: ${index}.${field_name}最大长度为${max_length}
预期输出: 输入框${field_name}输入长度超过最大值,提示:长度不能超过${max_length}
测试结果:
测试人:
备注:
- 重要级别: 中
输入数据: ${input_data}
执行步骤: ${index}.${field_name}最小长度为${min_length}
预期输出: 输入框${field_name}输入长度小于最小值,提示:长度不能小于${min_length}
测试结果:
测试人:
备注:
- 重要级别: 中
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}超过最大长度
预期输出: 输入框${field_name}输入长度超过最大值
测试结果:
测试人:
备注:
- 重要级别: 中
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}超过最小长度
预期输出: 输入框${field_name}输入长度小于最小值
测试结果:
测试人:
备注:
- 重要级别: 低
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}包含数字
预期输出: 输入框${field_name}输入包含数字
测试结果:
测试人:
备注:
- 重要级别: 低
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}包含字母
预期输出: 输入框${field_name}输入包含字母
测试结果:
测试人:
备注:
- 重要级别: 低
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}包含特殊字符
预期输出: 输入框${field_name}输入包含特殊字符
测试结果:
测试人:
备注:
- 重要级别: 低
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}包含中文字符
预期输出: 输入框${field_name}输入包含中文字符
测试结果:
测试人:
备注:
- 重要级别: 低
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}包含英文字符
预期输出: 输入框${field_name}输入包含英文字符
测试结果:
测试人:
备注:
- 重要级别: 低
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}包含数字和字母
预期输出: 输入框${field_name}输入包含数字和字母
测试结果:
测试人:
备注:
- 重要级别: 低
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}包含数字和特殊字符
预期输出: 输入框${field_name}输入包含数字和特殊字符
测试结果:
测试人:
备注:
- 重要级别: 低
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}包含字母和特殊字符
预期输出: 输入框${field_name}输入包含字母和特殊字符
测试结果:
测试人:
备注:
- 重要级别: 低
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}包含数字和中文字符
预期输出: 输入框${field_name}输入包含数字和中文字符
测试结果:
测试人:
备注:
- 重要级别: 低
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}包含字母和中文字符
预期输出: 输入框${field_name}输入包含字母和中文字符
测试结果:
测试人:
备注:
- 重要级别: 低
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}包含特殊字符和中文字符
预期输出: 输入框${field_name}输入包含特殊字符和中文字符
测试结果:
测试人:
备注:
- 重要级别: 低
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}包含数字、字母和特殊字符
预期输出: 输入框${field_name}输入包含数字、字母和特殊字符
测试结果:
测试人:
备注:
- 重要级别: 低
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}包含数字、字母和中文字符
预期输出: 输入框${field_name}输入包含数字、字母和中文字符
测试结果:
测试人:
备注:
- 重要级别: 低
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}包含字母、特殊字符和中文字符
预期输出: 输入框${field_name}输入包含字母、特殊字符和中文字符
测试结果:
测试人:
备注:
- 重要级别: 低
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}包含数字、特殊字符和中文字符
预期输出: 输入框${field_name}输入包含数字、特殊字符和中文字符
测试结果:
测试人:
备注:
- 重要级别: 低
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}包含数字、字母、特殊字符和中文字符
预期输出: 输入框${field_name}输入包含数字、字母、特殊字符和中文字符
测试结果:
测试人:
备注:
- 重要级别: 中
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}包含数字、字母、特殊字符、中文字符、空格
预期输出: 输入框${field_name}输入包含数字、字母、特殊字符、中文字符、空格
测试结果:
测试人:
备注:
- 重要级别: 高
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}不符合格式要求
预期输出: 输入框${field_name}输入不符合格式要求
测试结果:
测试人:
备注:
- 重要级别: 高
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}符合格式要求
预期输出: 输入框${field_name}输入符合格式要求
测试结果:
测试人:
备注:
- 重要级别: 高
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}符合业务规则要求
预期输出: 输入框${field_name}输入符合业务规则要求
测试结果:
测试人:
备注:
- 重要级别: 高
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}不符合业务规则要求
预期输出: 输入框${field_name}输入不符合业务规则要求
测试结果:
测试人:
备注:
选择框:
必填步骤:
- 重要级别: 高
输入数据: ${input_data}
执行步骤: ${index}.不选择${field_name}
预期输出: 选择框${field_name}未选择,提示:请选择
测试结果:
测试人:
备注:
- 重要级别: 中
输入数据: ${input_data}
执行步骤: ${index}.选择${field_name}为空值
预期输出: 选择框${field_name}选择为空值,提示:请选择
测试结果:
测试人:
备注:
步骤:
- 重要级别: 高
输入数据: ${input_data}
执行步骤: ${index}.选择${field_name}
预期输出: 选择框${field_name}选择正确,转到下一步(步骤${next_index})判断
测试结果:
测试人:
备注:
- 重要级别: 高
输入数据: ${input_data}
执行步骤: 查看数据来源
预期输出: 数据来源于${data_source}
测试结果:
测试人:
备注:
手机号输入框:
必填步骤:
- 重要级别: 高
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}为空值
预期输出: 手机号输入框${field_name}输入为空值,提示:不能为空,重新输入
测试结果:
测试人:
备注:
步骤:
- 重要级别: 高
输入数据: ${input_data}
执行步骤: ${index}.输入正确的${field_name}
预期输出: 手机号输入框${field_name}输入正确,转到下一步(步骤${next_index})判断
测试结果:
测试人:
备注:
- 重要级别: 中
输入数据: ${input_data}
执行步骤: ${index}.输入错误的${field_name}
预期输出: 手机号输入框${field_name}输入错误,提示:手机号格式不正确
测试结果:
测试人:
备注:
- 重要级别: 中
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}不符合手机号格式
预期输出: 手机号输入框${field_name}输入不符合手机号格式,提示:请输入正确的手机号
测试结果:
测试人:
备注:
- 重要级别: 中
输入数据: ${input_data}
执行步骤: ${index}.${field_name}最大长度为${max_length}
预期输出: 输入框${field_name}输入长度超过最大值,提示:长度不能超过${max_length}
测试结果:
测试人:
备注:
- 重要级别: 中
输入数据: ${input_data}
执行步骤: ${index}.${field_name}最小长度为${min_length}
预期输出: 输入框${field_name}输入长度小于最小值,提示:长度不能小于${min_length}
测试结果:
测试人:
备注:
- 重要级别: 中
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}超过最大长度
预期输出: 手机号输入框${field_name}输入长度超过最大值
测试结果:
测试人:
备注:
- 重要级别: 中
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}超过最小长度
预期输出: 手机号输入框${field_name}输入长度小于最小值
测试结果:
测试人:
备注:
- 重要级别: 低
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}包含数字
预期输出: 手机号输入框${field_name}输入包含数字,输入成功
测试结果:
测试人:
备注:
- 重要级别: 低
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}包含字母
预期输出: 手机号输入框${field_name}输入包含字母,字母无法数据
测试结果:
测试人:
备注:
- 重要级别: 低
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}包含特殊字符
预期输出: 手机号输入框${field_name}输入包含特殊字符,特殊字符无法数据
测试结果:
测试人:
备注:
- 重要级别: 低
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}包含中文字符
预期输出: 手机号输入框${field_name}输入包含中文字符,中文字符无法数据
测试结果:
测试人:
备注:
邮箱输入框:
必填步骤:
- 重要级别: 高
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}为空值
预期输出: 邮箱输入框${field_name}输入为空值,提示:不能为空,重新输入
测试结果:
测试人:
备注:
步骤:
- 重要级别: 高
输入数据: ${input_data}
执行步骤: ${index}.输入正确的${field_name}
预期输出: 邮箱输入框${field_name}输入正确,转到下一步(步骤${next_index})判断
测试结果:
测试人:
备注:
- 重要级别: 中
输入数据: ${input_data}
执行步骤: ${index}.输入错误的${field_name}
预期输出: 邮箱输入框${field_name}输入错误,提示:邮箱格式不正确
测试结果:
测试人:
备注:
- 重要级别: 低
输入数据: ${input_data}
执行步骤: ${index}.输入${field_name}不符合邮箱格式
预期输出: 邮箱输入框${field_name}输入不符合邮箱格式,提示:请输入正确的邮箱
测试结果:
测试人:
备注:
附件上传:
必填步骤:
- 重要级别: 高
输入数据: ${input_data}
执行步骤: ${index}.上传${field_name}为空值
预期输出: 附件上传框${field_name}上传失败,提示:请上传附件
测试结果:
测试人:
备注:
步骤:
- 重要级别: 高
输入数据: ${input_data}
执行步骤: ${index}.上传${field_name}
预期输出: 附件上传框${field_name}上传成功,转到下一步(步骤${next_index})判断
测试结果:
测试人:
备注:
- 重要级别: 低
输入数据: ${input_data}
执行步骤: ${index}.上传${field_name}超过最大大小
预期输出: 附件上传框${field_name}上传失败,提示:附件大小不能超过${file_max_size}
测试结果:
测试人:
备注:
- 重要级别: 低
输入数据: ${input_data}
执行步骤: ${index}.上传${field_name}超过最小大小
预期输出: 附件上传框${field_name}上传失败,提示:附件大小不能小于${file_min_size}
测试结果:
测试人:
备注:
- 重要级别: 低
输入数据: ${input_data}
执行步骤: ${index}.上传${field_name}不符合格式要求
预期输出: 附件上传框${field_name}上传失败,提示:附件格式不符合要求
测试结果:
测试人:
备注:
- 重要级别: 高
输入数据: ${input_data}
执行步骤: ${index}.上传${field_name}不是${file_format}
预期输出: 无法上传不是${file_format}格式的文件,提示:请上传${file_format}格式的文件
测试结果:
测试人:
备注:
- 重要级别: 中
输入数据: ${input_data}
执行步骤: ${index}.${field_name},附件格式限制
预期输出: 附件上传框${field_name}只能上传${file_format}格式的文件
测试结果:
测试人:
备注:
- 重要级别: 中
输入数据: ${input_data}
执行步骤: ${index}.上传${field_name},附件大小限制
预期输出: 附件上传框${field_name}只能上传${file_min_size}-${file_max_size}的文件
测试结果:
测试人:
备注:
- 重要级别: 高
输入数据: ${input_data}
执行步骤: ${index}.上传${field_name},附件数量限制
预期输出: 附件上传框${field_name}只能上传${file_count}个文件,超过限制后提示:只能上传${file_count}个文件
测试结果:
测试人:
备注:
时间选择器:
必填步骤:
- 重要级别: 中
输入数据:
执行步骤: ${index}.选择${field_name}为空值
预期输出: 时间选择器${field_name}未选择,提示:请选择
测试结果:
测试人:
备注:
步骤:
- 重要级别: 高
输入数据:
执行步骤: ${index}.选择${field_name}
预期输出: 时间选择器${field_name}选择正确,转到下一步(步骤${next_index})判断
测试结果:
测试人:
备注:
- 重要级别: 中
输入数据:
执行步骤: ${index}.选择${field_name}不符合格式要求
预期输出: 时间选择器${field_name}选择不符合格式要求,提示:请选择正确的日期
测试结果:
测试人:
备注:
- 重要级别: 中
输入数据:
执行步骤: ${index}.选择${field_name}超过最大日期
预期输出: 时间选择器${field_name}选择日期超过最大日期,提示:请选择正确的日期
测试结果:
测试人:
备注:
- 重要级别: 中
输入数据:
执行步骤: ${index}.选择${field_name}超过最小日期
预期输出: 时间选择器${field_name}选择日期超过最小日期,提示:请选择正确的日期
测试结果:
测试人:
备注:
地图坐标选择器:
必填步骤:
- 重要级别: 中
输入数据:
执行步骤: ${index}.选择${field_name}为空值
预期输出: 地图坐标选择器${field_name}未选择,提示:请选择
测试结果:
测试人:
备注:
步骤:
- 重要级别: 中
输入数据:
执行步骤: ${index}.选择正确的${field_name}
预期输出: 地图坐标选择器${field_name}选择正确,页面显示经纬度坐标,转到下一步(步骤${next_index})判断
测试结果:
测试人:
备注:
- 重要级别: 中
输入数据:
执行步骤: ${index}.选择不正确的${field_name}
预期输出: 地图坐标选择器${field_name}选择不正确,提示:请选择正确的坐标
测试结果:
测试人:
备注:
提交确定按钮:
步骤:
- 重要级别: 高
输入数据:
执行步骤: ${index}.点击确定按钮
预期输出: 点击确定按钮,提交表单,并在表单中显示
测试结果:
测试人:
备注:
提交取消按钮:
步骤:
- 重要级别: 中
输入数据:
执行步骤: ${index}.点击取消按钮
预期输出: 点击取消按钮,关闭表单,不提交表单
测试结果:
测试人:
备注:
程序case.py
python
# coding: utf-8
import yaml
from pandas import DataFrame
from string import Template
from copy import deepcopy
def replaceTemplate(template_dict: dict, data_dict: dict):
"""
替换模板中的变量
:return:
"""
data = deepcopy(template_dict)
input_data = data.get('输入数据', '')
step = data.get('执行步骤', '')
expected_result = data.get('预期输出', '')
if input_data is None:
input_data = ''
data.update(
{
'输入数据': Template(input_data).safe_substitute(data_dict),
'执行步骤': Template(step).safe_substitute(data_dict),
'预期输出': Template(expected_result).safe_substitute(data_dict)
}
)
return data
if __name__ == '__main__':
with open('template.yaml', 'r', encoding='utf-8') as fp:
template = yaml.load(fp, Loader=yaml.FullLoader)
with open('page.yaml', 'r', encoding='utf-8') as fp:
page_fields = yaml.load(fp, Loader=yaml.FullLoader)
# 遍历页面字段,生成用例
cases = []
for index, item in enumerate(page_fields):
item: dict
item['index'] = index + 1
item['next_index'] = index + 2
item['input_data'] = ''
is_required = item.get('is_required', False)
type_steps: dict = template[item['type']]
steps = type_steps['步骤']
if is_required:
steps.extend(type_steps['必填步骤'])
for step in steps:
data = replaceTemplate(step, item)
cases.append(data)
# 生成数据
data_frame = DataFrame(cases)
data_frame.to_excel('cases.xlsx', index=False)
示例page.yaml
yaml
- field_name: 队伍名称
is_required: true
max_length: '50'
min_length: '1'
type: 普通输入框
- field_name: 负责区域
is_required: true
max_length: '50'
min_length: '1'
type: 普通输入框
- field_name: 应急队长
is_required: true
max_length: '50'
min_length: '1'
type: 普通输入框
- field_name: 应急电话
is_required: true
type: 手机号输入框
- field_name: 所在位置
max_length: '50'
min_length: '1'
type: 普通输入框
- field_name: 坐标定位
is_required: true
type: 地图坐标选择器
- field_name: 附件
file_count: 10个
file_format: .rar .zip .doc .docx .pdf
file_max_size: 20M
file_min_size: 0M
type: 附件上传
- field_name: 确定
type: 提交确定按钮
- field_name: 取消
type: 提交取消按钮