略
下载allure后扔到D盘,并且配置环境变量path,如下:
@pytest.mark.parametrize('data', caseData, ids=caseNames)
注解实现数据驱动见github:https://github.com/suheping/pytest_auto_plat
我们的接口测试类无特殊情况只需要用着一个就够了,不需要一个功能写一个类
test_api.py
# -*- encoding: utf-8 -*-
'''
@File : test_api.py
@Time : 2020/12/18 11:55:48
@Author : peace_su
@Version : 1.0
@Contact : [email protected]
@WebSite : https://me.csdn.net/u010098760
'''
# here put the import lib
import pytest
import allure
import requests
from util import readXlsUtil, logUtil
from util.baseApi import sendRequest, writeResult
from util.jsonPah import JsonPah
from util.replace import Replace
from util.copyXls import copyXls
from util.genSign import GenSign
# 用例路径
# caseXls = 'E:\pyworkspace\pytest_demo\data\case1.xlsx'
caseXls = 'data\case1.xlsx'
rxls = readXlsUtil.readXlsUtil(caseXls, 'Sheet1')
# 获取type为1的测试用例
caseData = rxls.dict_data(1)
# 获取用例名称
caseNames = rxls.dict_name(caseData)
# 测试结果文件
# reportXls = 'E:\pyworkspace\pytest_demo\data\case1_report.xlsx'
reportXls = 'data\case1_report.xlsx'
copyXls(caseXls, reportXls)
@allure.feature('测试某个功能')
class Test_api(object):
def setup_class(self):
self.logger = logUtil.Log('test_api').getlogger()
self.tmp = {
}
self.session = requests.session()
# @allure.story('查询企业信息')
@pytest.mark.parametrize('data', caseData, ids=caseNames)
def testApi(self, data): # test method names begin with 'test'
self.logger.info(
'----用例[ %s ]------begin-------------' % data['caseId'])
if self.tmp != {
}:
# 如果有关联参数,替换body、params、url、headers
data['body'] = Replace(data['body'], self.tmp).replace()
# 计算sign
sign = GenSign('vtysJXstynJpIlEudO').genSign(data['body'])
self.tmp['sign'] = sign
data['params'] = Replace(data['params'], self.tmp).replace()
data['url'] = Replace(data['url'], self.tmp).replace()
data['headers'] = Replace(data['headers'], self.tmp).replace()
# 发送请求
result = sendRequest(self.session, data)
# 如果存在re,就去响应中查找,找到后存到tmp中
if data['re']:
t = JsonPah(result['text'])
param = t.jsonFind(data['re'])
for j in param:
self.tmp[j] = param[j]
self.logger.info('保存的关联参数为:%s' % self.tmp)
# 写结果
writeResult(result, reportXls)
# 开始断言
assert result['result'] == 'pass'
self.logger.info('----用例[ %s ]------end-------------' % data['caseId'])
if __name__ == '__main__':
pytest.main(["--reruns", "1", "--reruns-delay",
"2", "--alluredir", "result"])
关联数据的读取是个比较关键的点,比如返回的json中有多层,而且有重复的key值,怎么办?
举例说明:
返回的json如下:
{
"return_code": "1000",
"return_message": "success",
"result_code": "0",
"result_message": "处理成功",
"access_token": 123,
"data": [{
"access_token": "456",
"scope": "token",
"token_type": "bearer",
"expires_in": 69272
},
{
"access_token": "789",
"scope": "token",
"token_type": "bearer",
"expires_in": 69272
}]
}
我们要取到值为“789”的accesss_token,我们xls中re字段怎么写呢?
如下:(下标是从0开始的)
{
"token":"access_token[2]"}
这个意思就是将返回的 access_token保存到token变量中
上一步中我们把响应中的数据保存下来了,怎么应用到之后的请求中呢?
我们只需要在xls用例的url、param、body、header中使用如下方式即可:
我们要在header中传入token,只需要把token的值改为${token}
即可
{
"Content-Type":"application/json","sign":"${sign}","token":"${token}"}
jenkins搭建在windows环境下
注:十分重要
在jenkins中执行python run.py会报各种各样的错误,但是在cmd中正常,这是因为jenkins启动用户权限的问题,在服务中找到jenkins,右键属性-登录tab,填写cmd中可正常执行的用户,如下:
官网下载windows的安装包,一直下一步即可
默认jenkins的工作目录在c盘windows。。。。一个很深的目录下,我们需要把他挪出来,步骤如下:
齐活
一个测试平台,代码跟测试用例肯定是分开的,我们可以通过jenkins构建时上传测试用例文件来实现这一个功能,接下来说一下怎么实现:
修改run.py为接收命令行入参,参数有两个(测试用例路径、测试结果文件路径),如下:
import sys
import pytest
from util import glb
def main(argv):
glb.xls_path = argv[1]
glb.xls_report_path = argv[2]
pytest.main(["--reruns", "1", "--reruns-delay",
"2", "--alluredir", "result"])
if __name__ == '__main__':
main(sys.argv)
修改glb.py,传递两个参数(测试用例路径、测试结果文件路径)
# 要执行的用例文件路径,eg: data\case1.xlsx
xls_path = ''
# 要保持的结果文件的路径,eg: data\case1_report.xls
xls_report_path = ''
修改test_api.py,接收两个参数(测试用例路径、测试结果文件路径)
# 用例路径
# caseXls = 'data\case1.xlsx'
# caseXls = 'data\\case1.xlsx'
caseXls = glb.xls_path
# 测试结果文件
# reportXls = 'data\case1_report.xlsx'
# reportXls = 'data\\case1_report.xlsx'
reportXls = glb.xls_report_path
设置构建时上传文件,如下:
修改构建脚本,如下:
第一个参数需要与构建参数中的文件路径相同
第二个参数是保存的结果文件