python接口自动化1
组织架构:
包括配置文件,反射、文件路径、Excel操作、测试报告生成
case.config
- [MODE]
- file_name=case_data.xlsx
- mode={"register":'all',"login":'all',"recharge":'all'}
tools文件夹里的东西
- do_config.py
- # -*- conding:utr-8 -*-
- #@Time :2018/11/17 11:21
- #@Author:GYP测试
- #@File :do_config.py
- import configparser
- class ReadConfig:
- def read_config(self,file_name,section,option):
- cf=configparser.ConfigParser()
- cf.read(file_name,encoding='utf-8')
- return cf.get(section,option)
- if __name__ == '__main__':
- res=ReadConfig().read_config('case.config','MODE','file_name')
- print(res)
- do_excel.py
- # -*- conding:utr-8 -*-
- #@Time :2018/11/17 14:05
- #@Author:GYP测试
- #@File :do_excel.py
- from openpyxl import load_workbook
- from tools.do_config import ReadConfig
- from tools.project_path import *
- class Do_Excle:
- def __init__(self):
- self.file_name = test_data_path
- self.sheet_names = eval(ReadConfig().read_config(case_config_path, 'MODE', 'mode'))
- def get_header(self):
- wb = load_workbook(self.file_name)
- for sheet_name in self.sheet_names:
- sheet=wb[sheet_name]
- header=[]
- for i in range(1,sheet.max_column+1):
- header.append(sheet.cell(1,i).value)
- return header
- def Read_Excle(self):
- wb = load_workbook(self.file_name)
- test_data = []
- for sheet_name in self.sheet_names:
- sheet = wb[sheet_name]
- header = self.get_header()
- if self.sheet_names[sheet_name]=='all':
- for i in range(2,sheet.max_row+1):
- sub_data={}
- for j in range(1,sheet.max_column+1):
- sub_data[header[j-1]]=sheet.cell(i,j).value
- test_data.append(sub_data)
- else:
- for case_id in self.sheet_names[sheet_name]:
- sub_data={}
- for j in range(1,sheet.max_column+1):
- sub_data[header[j-1]]=sheet.cell(case_id+1,j).value
- test_data.append(sub_data)
- return test_data
- @staticmethod
- def write_excel(fiel_name,sheet_name,i,ActaulResult):
- wb=load_workbook(fiel_name)
- sheet=wb[sheet_name]
- sheet.cell(i,8).value=ActaulResult
- wb.save(fiel_name)
- if __name__ == '__main__':
- res=Do_Excle().Read_Excle()
- print(res)
- print(len(res))
get_data.py
- # -*- conding:utf-8 -*-
- #@Time :2018/11/19 11:37
- #@Author:GYP测试
- #@File :get_data.py
- class Get_Data:
- cookie=None
- http_requests.py
- # -*- conding:utr-8 -*-
- #@Time :2018/11/16 21:50
- #@Author:GYP测试
- #@File :http_requests.py
- import requests
- class Http_Request:
- def request(self,method,url,data,cookie=None):
- try:
- if method == 'post':
- res=requests.post(url,data,cookies=cookie)
- else:
- res=requests.get(url,data,cookies=cookie)
- except Exception as e:
- print("非法请求,请检查{0}".format(e))
- raise e
- return res
- http_test.py
- # -*- conding:utr-8 -*-
- #@Time :2018/11/18 15:00
- #@Author:GYP测试
- #@File :http_test.py
- import unittest #单元测试框架
- from tools.do_excel import Do_Excle #数据读写
- from tools.project_path import * #文件路径
- from ddt import ddt,data #数据处理框架
- from tools.get_data import Get_Data #反射
- from tools.http_requests import Http_Request
- test_data=Do_Excle().Read_Excle() #读取数据
- @ddt
- class TestHttp(unittest.TestCase):
- @data(*test_data)
- def test_api(self,item):
- res=Http_Request().request(item['method'],item['url'],eval(item['data']),getattr(Get_Data,'cookie'))
- if res.cookies: #利用反射获取cookie的值
- setattr(Get_Data,'cookie',res.cookies)
- try:
- self.assertEqual(str(item['ExpectedResult']),res.json()['code'])
- ActaulResult='Pass'
- except AssertionError as e:
- print('执行用例失败,请检查%s' %e)
- ActaulResult = 'Faile'
- print("获取到的结果是:{0}".format(res.json()))
- finally:
- # print(item['case_id'])
- Do_Excle.write_excel(test_data_path,item['module'],item['case_id']+1,ActaulResult)
- project_path.py
- # -*- conding:utr-8 -*-
- #@Time :2018/11/17 13:46
- #@Author:GYP测试
- #@File :project_path.py
- import os
- from tools.do_config import ReadConfig
- # class Get_Path:
- # def get_path(self):
- path=os.path.split(os.path.split(os.path.realpath(__file__))[0])[0]
- case_config_path=os.path.join(path,'conf','case.config')
- data_file_name=ReadConfig().read_config(case_config_path,'MODE','file_name')
- test_data_path=os.path.join(path,'test_data',data_file_name)
- html_repot_path=os.path.join(path,'test_result','html_report','test_api.html')
- print(case_config_path)
- print(html_repot_path)
- run.py
- # -*- conding:utr-8 -*-
- #@Time :2018/11/16 21:36
- #@Author:GYP测试
- #@File :run.py
- import unittest
- import HTMLTestRunner
- from tools.project_path import *
- from tools.http_test import TestHttp
- suite=unittest.TestSuite()
- loader=unittest.TestLoader()
- suite.addTest(loader.loadTestsFromTestCase(TestHttp))
- with open(html_repot_path,'wb') as file:
- runner=HTMLTestRunner.HTMLTestRunner(
- stream=file,
- title='这个是接口自动化的测试报告',
- description='我来测试哦!',
- tester='GYP')
- runner.run(suite)
python接口自动化1的更多相关文章
- Python接口自动化——soap协议传参的类型是ns0类型的要创建工厂方法纪要
1:在Python接口自动化中,对于soap协议的xml的请求我们可以使用Suds Client来实现,其soap协议传参的类型基本上是有2种: 第一种是传参,不需要再创建啥, 第二种就是ns0类型的 ...
- python接口自动化(十)--post请求四种传送正文方式(详解)
简介 post请求我在python接口自动化(八)--发送post请求的接口(详解)已经讲过一部分了,主要是发送一些较长的数据,还有就是数据比较安全等.我们要知道post请求四种传送正文方式首先需要先 ...
- python接口自动化-Cookie_绕过验证码登录
前言 有些登录的接口会有验证码,例如:短信验证码,图形验证码等,这种登录的验证码参数可以从后台获取(或者最直接的可查数据库) 获取不到也没关系,可以通过添加Cookie的方式绕过验证码 前面在“pyt ...
- python接口自动化28-requests-html爬虫框架
前言 requests库的好,只有用过的人才知道,最近这个库的作者又出了一个好用的爬虫框架requests-html.之前解析html页面用过了lxml和bs4, requests-html集成了一些 ...
- python接口自动化-参数化
原文地址https://www.cnblogs.com/yoyoketang/p/6891710.html python接口自动化 -参数关联(一)https://www.cnblogs.com/11 ...
- python接口自动化 -参数关联(一)
原文地址https://www.cnblogs.com/yoyoketang/p/6886610.html 原文地址https://www.cnblogs.com/yoyoketang/ 原文地址ht ...
- python接口自动化20-requests获取响应时间(elapsed)与超时(timeout)
前言 requests发请求时,接口的响应时间,也是我们需要关注的一个点,如果响应时间太长,也是不合理的. 如果服务端没及时响应,也不能一直等着,可以设置一个timeout超时的时间 关于reques ...
- python接口自动化24-有token的接口项目使用unittest框架设计
获取token 在做接口自动化的时候,经常会遇到多个用例需要用同一个参数token,并且这些测试用例跨.py脚本了. 一般token只需要获取一次就行了,然后其它使用unittest框架的测试用例全部 ...
- python接口自动化6-重定向(Location)
前言 某屌丝男A鼓起勇气向女神B打电话表白,女神B是个心机婊觉得屌丝男A是好人,不想直接拒绝于是设置呼叫转移给闺蜜C了,最终屌丝男A和女神闺蜜C表白成功了,这种场景其实就是重定向了. 一.重定向 1. ...
- python接口自动化5-Json数据处理
前言 有些post的请求参数是json格式的,这个前面第二篇post请求里面提到过,需要导入json模块处理. 一般常见的接口返回数据也是json格式的,我们在做判断时候,往往只需要提取其中几个关键的 ...
随机推荐
- Python正则表达式指南(转)
目录 Python正则表达式指南(转) 0.防走丢 1. 正则表达式基础 1.1. 简单介绍 1.2. 数量词的贪婪模式与非贪婪模式 1.3. 反斜杠的困扰 1.4. 匹配模式 2. re模块 2.1 ...
- kubernetes 核心技术概念(二)之 volume namespace annoation
volume k8s通过数据卷来提供pod数据的持久化,k8s的数据卷是对docker数据卷的扩展,k8s的数据卷是pod级别的,用来实现pod中容器的文件共享 volume是pod中能被多个容器访问 ...
- 自定义 ThreadPoolExecutor 处理线程运行时异常
自定义 ThreadPoolExecutor 处理线程运行时异常 最近看完了ElasticSearch线程池模块的源码,感触颇深,然后也自不量力地借鉴ES的 EsThreadPoolExecutor ...
- 配置rpm包安装的jdk环境变量
最近在搭建james邮件服务的时候,由于这个服务是用Java开发的,之前这台服务器跑过tomcat服务,故有Java环境,就没在意有无配置环境变量,但在启动james的时候报没有配置环境变量: 那么问 ...
- 学习string,stringBuffer时遇到的问题
今天学习string和stringBuffer.了解了两者的区别,然后去看java api都有啥方法.stringBuffer类有indexOf方法,于是写了下面的代码 String str = &q ...
- matlab 加根号
text(3,0.5,'z=0.2$$\sqrt{c/h_0}$$+0.3','interpreter','latex')
- linux mint18 cinnamon 64bit 安装 docker
参考官方文档:https://docs.docker.com/engine/installation/linux/ubuntu/ 1. 安装一些使 apt 可以使用 https 的源 sudo apt ...
- JDBC——连接数据库
JDBC的基本介绍 1.概述:jdbc是使用Java访问各种数据库的一种技术 (1)jdbc工作原理 2.jdbc核心Java类(API) (1)DriverManager类 作用:管理各种数据库的驱 ...
- JSP+MySQL验证登录的实现方式
用IDEA连接MySQL验证登录实现方式核心部分代码 用setString的方法对从数据库中的提取的信息经行比对: try { Class.forName("com.mysql.jdbc.D ...
- Eclipse使用Git检出项目
1.打开Eclipse——File——Import...: 2.在弹出的Import框中选择Git——Projects from Git——NEXT: 3.选择Clone URI——Next: 4.输 ...