参数化实现及重复执行
? 参数化测试:在接口测试中,为了实现不同组数据对同一个功能模块进行测试,需要准备多组测试数据对模块进行测试的过程。
在httprunner中可以通过如下方式实现参数化:
1、在YAML/JSON 中直接指定参数列表
2、调用debugtalk.py 中自定义的函数生成参数列表
3、通过内置的函数引用CSV 文件
4、通过debugtalk.py调用faker库、pymysql库实现参数化
从httprunner2.0开始,参数化必须在 testsuites 层进行实现;实现参数化的关键字为 variables、parameters
方式一 :使用 variables 关键字实现参数化传递
通过testsuite层下testcases中的variables传递参数,如下图的search_word参数,可以传递至testcases层或api层相对应的$search_word中
通过 variables 关键字 再做个变量传递参数;套件层 传给 用例层 再传给 api层 (但每次只能传递一个参数)
?testsuites层,必须在套件层使用 variables 做参数化,如下图:
?testcases层,如下图:
?api层:
?方式二:使用 parameters 关键字实现参数化传递
通过testsuite下testcases中的parameters传递参数,如下图的search_word参数,可以传递至testcases层或api层相对应的$search_word中
通过 parameters关键字 再做个变量传递参数;套件层 传给 用例层 再传给 api层 (每次可传递多个参数,参数以列表展示)
只传递参数举例:
testsuites层:
testcases层,如下图:
?api层:
执行套件层接口后,会把变量的多个参数,全部执行完成,如下图:
注:上述举例只是针对参数传递,但是没办法做每个参数的断言操作;可参考下方的举例
同时传递参数和预期结果 举例:
通过 parameters 一次传递一组参数,如下图的search_word-result参数,使用 - 分隔成了两个参数,分别为$search_word和$result (使用列表嵌套传输)
testsuites层:
testcases层:
api层:
方式三:调用 debugtalk.py 中 自定义的函数实现参数化传递
调用 debugtalk.py 中自定义的函数生成参数列表同样,也可以进行多组参数传递;
debugtalk.py文件中的代码示例:
# 参数化 def search_key(): # return ["猫","狗","大象"] return [["猫","猫_百度搜索"],["狗","狗_百度搜索"],["大象","大象_百度搜索"]]
testsuites层:
testcases层:
api层:
?由于debugtalk.py可以采用python代码的形式组织参数,故可以实现各种随机参数,如:随机整数、随机字符串,随机手机号等,只要最终函数返回的数据类型能兼容即可。
?随机整数、随机字符串、随机手机号 代码示例:
import random
# 随机整数
def get_random_param(min,max,count=3):
? ? random_list = []
? ? for i in range(count):
? ? ? ? random_list.append(random.randint(min,max))
? ? return random_list
# 随机字符串
def get_random_string(base_str,str_len,count=3):
? ? random_list = []
? ? for i in range(count):
? ? ? ? str = ''
? ? ? ? for j in range(0,str_len):
? ? ? ? ? ? str = str+base_str[random.randint(0,len(base_str)-1)]
? ? ? ? random_list.append(str)
? ? return random_list
# 随机手机号
def get_random_phone(*mobile_num,count=2):
? ? phone_list = []
? ? for i in range(0,count):
? ? ? ? str_start = random.choice(mobile_num)
? ? ? ? str_end = ''.join(random.sample('0123456789',8))
? ? ? ? str_phone = str(str_start) + str_end
? ? ? ? phone_list.append(str_phone)
? ? return phone_list
方式四:通过内置的函数引用CSV 文件实现参数化
第一步:在项目的根路径下新建data文件夹,在该文件夹中新建csv文件,文件中填写对应的数据,可以有多列,需要使用英文逗号隔开。文件的第一行为参数名称,第二行才是数据的开始
?第二步:在testsuite下testcases中通过调用内置的parameterize(可简写为P)函数引用CSV 文件,如果要引用多个变量,需要用‘-’连接
testsuites层:
testcases层:
?api层:
方法五:通过debugtalk.py调用faker库,实现参数化
faker库主要用来创建伪数据,使用faker包,无需再手动生成或者手写随机数来生成数据,只需要调用faker提供的方法,即可完成数据的生成。
1,首先下载faker库?
?2,在debugtalk.py中编写代码
代码示例:
from faker import Faker
# 随机姓名
def get_random_name(count=5):
? ? f = Faker(locale='zh_CN')
? ? name_list = []
? ? for i in range(0,count):
? ? ? ? name_list.append(f.name())
? ? return name_list
3,再通过在yaml文件中调用该函数? ${函数()};
testsuites层:
testcases层:
api层:
?方法六:通过debugtalk.py调用 pymysql库 实现参数化
?利用pymysql库链接并获取mysql数据的方式
前置条件:
mysql数据库中的数据:
在debugtalk.py中编写 链接mysql数据库的函数
代码示例:
import pymysql
def get_mysql_data(case_name):
? ? # 创建mysql数据库链接
? ? db = pymysql.Connect(host='192.168.1.3',port=3306,user='root',
? ? ? ? ? ? ? ? ? ? password='root',db='test',charset="utf8")
? ? # 创建游标对象,查询数据默认是元组
? ? cursor = db.cursor()
? ? # 创建游标对象,查询数据默认是元组,此处设置字典类型
? ? # cursor = db.cursor(cursor=pymysql.cursors.DictCursor)
? ? # 编写 sql 语句
? ? sql = 'select test_data,result FROM test_case_data where case_name like "{}_%";'.format(case_name)
? ? # 执行sql 语句,并返回行数
? ? cursor.execute(sql)
? ? # cursor.fetchone() ?# 一行
? ? case_data = cursor.fetchall() ?# 所有数据
? ? # 关闭游标
? ? cursor.close()
? ? # 关闭数据库链接
? ? db.close()
? ? # 由于返回的数据是元组,所以需要把元组做成List类型
? ? list_case_data = list(case_data)
? ? for i in range(len(list_case_data)):
? ? ? ? list_case_data[i] = list(list_case_data[i])
? ? return list_case_data
在套件层中引用上述的函数
testsuites层:
testcases层:
api层:
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!??