当前位置: 首页 > news >正文

vs2017 做网站无极在线最新招聘兼职

vs2017 做网站,无极在线最新招聘兼职,什么是网络营销 职能是什么,做兼职推荐网站目录:导读 一、简单介绍 二、目录介绍 三、代码分析 写在最后 接口自动化是指模拟程序接口层面的自动化,由于接口不易变更,维护成本更小,所以深受各大公司的喜爱。 第一版入口:接口自动化框架(PytestrequestAllure…

目录:导读

一、简单介绍

二、目录介绍

三、代码分析

写在最后


 

接口自动化是指模拟程序接口层面的自动化,由于接口不易变更,维护成本更小,所以深受各大公司的喜爱。
第一版入口:接口自动化框架(Pytest+request+Allure)
本次版本做了一些升级,增加了自动生成testcase等,一起来看看吧!~~


一、简单介绍

环境:Mac+Python 3+Pytest+Allure+Request
流程:Charles导出接口数据-自动生成测试用例-修改测试用例-执行测试用例-生成Allure报告
开源: 点击这里,跳转到github
备注⚠️:Charles导出接口应选择文件类型为JSON Session File(.chlsj)

重要模块介绍:
1、writeCase.py :自动读取新的Charles文件,并自动生成测试用例
2、apiMethod.py:封装request方法,可以支持多协议扩展(get\post\put)
3、checkResult.py:封装验证response方法
4、setupMain.py: 核心代码,定义并执行用例集,生成报告


二、目录介绍


三、代码分析

1、测试数据yml(自动生成的yml文件)

# 用例基本信息
test_info:# 用例标题,在报告中作为一级目录显示title: blogpost# 用例IDid: test_reco_01# 请求的域名,可写死,也可写成模板关联host配置文件host: ${host}$# 请求地址 选填(此处不填,每条用例必填)address: /api/v2/recomm/blogpost/reco# 前置条件,case之前需关联的接口
premise:# 测试用例
test_case:- test_name: reco_1# 第一条case,info可不填info: reco# 请求协议http_type: https# 请求类型request_type: POST# 参数类型parameter_type: application/json# 请求地址address: /api/v2/recomm/blogpost/reco# 请求头headers:# parameter为文件路径时parameter: reco.json# 是否需要获取cookiecookies: False# 是否为上传文件的接口file: false# 超时时间timeout: 20# 校验列表  list or dict# 不校验时 expected_code, expected_request 均可不填check:expected_request: result_reco.jsoncheck_type: only_check_statusexpected_code: 503# 关联键relevance:

2、测试case(自动生成的case.py)

@allure.feature(case_dict["test_info"]["title"])
class TestReco:@pytest.mark.parametrize("case_data", case_dict["test_case"], ids=[])@allure.story("reco")@pytest.mark.flaky(reruns=3, reruns_delay=3)def test_reco(self, case_data):""":param case_data: 测试用例:return:"""self.init_relevance = ini_request(case_dict, PATH)# 发送测试请求api_send_check(case_data, case_dict, self.init_relevance, PATH)

3、writeCase.py (封装方法:自动生成测试case)

def write_case(_path):yml_list = write_case_yml(_path)project_path = str(os.path.abspath('.').split('/bin')[0])test_path = project_path+'/aff/testcase/'src = test_path+'Template.py'for case in yml_list:yml_path = case.split('/')[0]yml_name = case.split('/')[1]case_name = 'test_' + yml_name + '.py'new_case = test_path + yml_path + '/' + case_namemk_dir(test_path + yml_path)if case_name in os.listdir(test_path + yml_path):passelse:shutil.copyfile(src, new_case)with open(new_case, 'r') as fw:source = fw.readlines()n = 0with open(new_case, 'w') as f:for line in source:if 'PATH = setupMain.PATH' in line:line = line.replace("/aff/page/offer", "/aff/page/%s" % yml_path)f.write(line)n = n+1elif 'case_dict = ini_case' in line:line = line.replace("Template", yml_name)f.write(line)n = n + 1elif 'class TestTemplate' in line:line = line.replace("TestTemplate", "Test%s" % yml_name.title().replace("_", ""))f.write(line)n = n + 1elif '@allure.story' in line:line = line.replace("Template", yml_name)f.write(line)n = n + 1elif 'def test_template' in line:line = line.replace("template", yml_name.lower())f.write(line)n = n + 1else:f.write(line)n += 1for i in range(n, len(source)):f.write(source[i])

4、apiMethod.py(封装方法:http多协议)

def post(header, address, request_parameter_type, timeout=8, data=None, files=None):"""post请求:param header: 请求头:param address: 请求地址:param request_parameter_type: 请求参数格式(form_data,raw):param timeout: 超时时间:param data: 请求参数:param files: 文件路径:return:"""if 'form_data' in request_parameter_type:for i in files:value = files[i]if '/' in value:file_parm = ifiles[file_parm] = (os.path.basename(value), open(value, 'rb'))enc = MultipartEncoder(fields=files,boundary='--------------' + str(random.randint(1e28, 1e29 - 1)))header['Content-Type'] = enc.content_typeresponse = requests.post(url=address, data=enc, headers=header, timeout=timeout)else:response = requests.post(url=address, data=data, headers=header, timeout=timeout, files=files)try:if response.status_code != 200:return response.status_code, response.textelse:return response.status_code, response.json()except json.decoder.JSONDecodeError:return response.status_code, ''except simplejson.errors.JSONDecodeError:return response.status_code, ''except Exception as e:logging.exception('ERROR')logging.error(e)raise

5、checkResult.py(封装方法:校验response结果)

def check_result(test_name, case, code, data, _path, relevance=None):"""校验测试结果:param test_name: 测试名称:param case: 测试用例:param code: HTTP状态:param data: 返回的接口json数据:param relevance: 关联值对象:param _path: case路径:return:"""# 不校验结果if case["check_type"] == 'no_check':with allure.step("不校验结果"):pass# json格式校验elif case["check_type"] == 'json':expected_request = case["expected_request"]if isinstance(case["expected_request"], str):expected_request = readExpectedResult.read_json(test_name, expected_request, _path, relevance)with allure.step("JSON格式校验"):allure.attach("期望code", str(case["expected_code"]))allure.attach('期望data', str(expected_request))allure.attach("实际code", str(code))allure.attach('实际data', str(data))if int(code) == case["expected_code"]:if not data:data = "{}"check_json(expected_request, data)else:raise Exception("http状态码错误!\n %s != %s" % (code, case["expected_code"]))# 只校验状态码elif case["check_type"] == 'only_check_status':with allure.step("校验HTTP状态"):allure.attach("期望code", str(case["expected_code"]))allure.attach("实际code", str(code))allure.attach('实际data', str(data))if int(code) == case["expected_code"]:passelse:raise Exception("http状态码错误!\n %s != %s" % (code, case["expected_code"]))# 完全校验elif case["check_type"] == 'entirely_check':expected_request = case["expected_request"]if isinstance(case["expected_request"], str):expected_request = readExpectedResult.read_json(test_name, expected_request, _path, relevance)with allure.step("完全校验"):allure.attach("期望code", str(case["expected_code"]))allure.attach('期望data', str(expected_request))allure.attach("实际code", str(code))allure.attach('实际data', str(data))if int(code) == case["expected_code"]:result = operator.eq(expected_request, data)if result:passelse:raise Exception("完全校验失败! %s ! = %s" % (expected_request, data))else:raise Exception("http状态码错误!\n %s != %s" % (code, case["expected_code"]))# 正则校验elif case["check_type"] == 'Regular_check':if int(code) == case["expected_code"]:try:result = ""if isinstance(case["expected_request"], list):for i in case[""]:result = re.findall(i.replace("\"","\""), str(data))allure.attach('校验完成结果\n',str(result))else:result = re.findall(case["expected_request"].replace("\"", "\'"), str(data))with allure.step("正则校验"):allure.attach("期望code", str(case["expected_code"]))allure.attach('正则表达式', str(case["expected_request"]).replace("\'", "\""))allure.attach("实际code", str(code))allure.attach('实际data', str(data))allure.attach(case["expected_request"].replace("\"", "\'") + '校验完成结果',str(result).replace("\'", "\""))if not result:raise Exception("正则未校验到内容! %s" % case["expected_request"])except KeyError:raise Exception("正则校验执行失败! %s\n正则表达式为空时" % case["expected_request"])else:raise Exception("http状态码错误!\n %s != %s" % (code, case["expected_code"]))else:raise Exception("无该校验方式%s" % case["check_type"])

6、setupMain.py(执行用例集,生成测试报告)

def invoke(md):output, errors = subprocess.Popen(md, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()o = output.decode("utf-8")return oif __name__ == '__main__':LogConfig(PATH)write_case(har_path)args = ['-s', '-q', '--alluredir', xml_report_path]pytest.main(args)cmd = 'allure generate %s -o %s' % (xml_report_path, html_report_path)invoke(cmd)

7、测试报告

写在最后

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

看到这篇文章的人有觉得我的理解有误的地方,也欢迎评论和探讨~

你也可以加入下方的的群聊去和同行大神交流切磋

 

http://www.yayakq.cn/news/354389/

相关文章:

  • 开发门户网站辽宁网站建设墨子
  • 网站形式的具体例子搬瓦工装WordPress
  • 品牌推广计划wordpress 主机优化
  • 济南城市建设集团网站合肥网站建设公司哪家好
  • dede做的网站被植入广告多国语言网站
  • 赤壁市建设工程造价信息价网站查询精品课程网站建设项目验收单
  • 安徽省建设工程信息网官方网站河南省招标投标信息网官网
  • 公司网站建设分录怎样建立一个自己的网站免费
  • 做网站 需要工信部备案吗高端网站建设找哪个公司
  • 网站设计 珠海产品开发流程和项目管理流程
  • 网站数字化建设方案哪家网站建设好
  • 建设工程消防验收查询网站湖南省专业建设公司网站
  • 购物网站排行工厂erp管理系统软件
  • 公司网站的宣传栏怎么做前端网站建设插件
  • 邢台手机网站建设费用注册会计师协会
  • 做视频网站收费标准湘潭县建设投资有限公司网站
  • iis 新建网站 要登录吴江和城乡建设局网站
  • 深圳模板网站建设案例唐山网站建设500元
  • 增加网站外链公司简介ppt内容
  • asp.net 大网站微信网站开发哪家好
  • 成都 网站建设 公司哪家好湖南建设银行2018招聘网站
  • 宝塔做的网站能不能访问西安网络公司大全
  • 汽车网站开发毕业设计论文做电商网站前端用什么框架
  • 网站基本建设福田做网站
  • 江西建设工程信息网站深圳市住房和城乡建设局
  • 正规的网站建设学习网使用wordpress版权
  • 前端网站默认登录怎么做百度竞价推广代理商
  • 莞城网站仿做宁波seo行者seo09
  • 湖州网站建设制作商务网站开发流程
  • 爱站网关键词挖掘机网络营销网站平台有哪些