由于HttpRunner是基于数据驱动的接口自动化框架,可以完美实现代码和数据分离,那么在写好接口报文后,自动化的效果直接取决于数据文件的全面性.
如果要完美实现一个接口的所有字段正反用例全量覆盖,手写肯定不合适, 但可以对照接口文档,先手写出下面的excel:
name=接口报文的字段名
value=该字段的正常用例
err=该字段的异常用例
null = 为空值
把用例简化成这个csv文件,测试用例评审时也更加一目了然,不用对着几十条大部分内容千篇一律的数据翻着演示给其他人看了.
接下来就是怎么把上面的csv,转换成HttpRunner需要的csv文件.
先看看需要的效果,如果要实现上面的接口所有交叉全覆盖,生成的用例数会是: 1*3*2*1*1*2*1+(3+4+2+3+3+1+4)=32
条.
如果一个接口有十多个字段, 又有多个字段是枚举值的话,生成的用例数会指数级增长. 如果是手工执行,可以用这个方式减少用例,但如果可以自动生成用例并自动执行,那么全覆盖也无所谓.
res=0代表返回正常结果,res=1代表返回异常结果
脚本流程:
- 读取one.xlsx的第一列值(除去标题行),作为two.csv的第一行值.
- 对于正常用例,生成笛卡尔列表集,最后加上
res
标志为0 - 对于异常用例,计算出异常用例个数N,然后复制正常用例N份,最后
res
标志改为1 - 把异常用例里的每个异常值,去替代第3步复制的正常用例对应数据
代码:
import os
import xlrd , xlwt
from xlutils.copy import copy as xl_copy
import csv
from typing import Dict, List, Any, Union, Text
import itertools
import random
from shutil import copyfile
import copy
import sys
def gen_cartesian_product(*args: List[Dict]) -> List[Dict]:
if not args:
return []
elif len(args) == 1:
return args[0]
product_list = []
for product_item_tuple in itertools.product(*args):
product_item_dict = {
}