组织架构:

  包括配置文件,反射、文件路径、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的更多相关文章

  1. Python接口自动化——soap协议传参的类型是ns0类型的要创建工厂方法纪要

    1:在Python接口自动化中,对于soap协议的xml的请求我们可以使用Suds Client来实现,其soap协议传参的类型基本上是有2种: 第一种是传参,不需要再创建啥, 第二种就是ns0类型的 ...

  2. python接口自动化(十)--post请求四种传送正文方式(详解)

    简介 post请求我在python接口自动化(八)--发送post请求的接口(详解)已经讲过一部分了,主要是发送一些较长的数据,还有就是数据比较安全等.我们要知道post请求四种传送正文方式首先需要先 ...

  3. python接口自动化-Cookie_绕过验证码登录

    前言 有些登录的接口会有验证码,例如:短信验证码,图形验证码等,这种登录的验证码参数可以从后台获取(或者最直接的可查数据库) 获取不到也没关系,可以通过添加Cookie的方式绕过验证码 前面在“pyt ...

  4. python接口自动化28-requests-html爬虫框架

    前言 requests库的好,只有用过的人才知道,最近这个库的作者又出了一个好用的爬虫框架requests-html.之前解析html页面用过了lxml和bs4, requests-html集成了一些 ...

  5. python接口自动化-参数化

    原文地址https://www.cnblogs.com/yoyoketang/p/6891710.html python接口自动化 -参数关联(一)https://www.cnblogs.com/11 ...

  6. python接口自动化 -参数关联(一)

    原文地址https://www.cnblogs.com/yoyoketang/p/6886610.html 原文地址https://www.cnblogs.com/yoyoketang/ 原文地址ht ...

  7. python接口自动化20-requests获取响应时间(elapsed)与超时(timeout)

    前言 requests发请求时,接口的响应时间,也是我们需要关注的一个点,如果响应时间太长,也是不合理的. 如果服务端没及时响应,也不能一直等着,可以设置一个timeout超时的时间 关于reques ...

  8. python接口自动化24-有token的接口项目使用unittest框架设计

    获取token 在做接口自动化的时候,经常会遇到多个用例需要用同一个参数token,并且这些测试用例跨.py脚本了. 一般token只需要获取一次就行了,然后其它使用unittest框架的测试用例全部 ...

  9. python接口自动化6-重定向(Location)

    前言 某屌丝男A鼓起勇气向女神B打电话表白,女神B是个心机婊觉得屌丝男A是好人,不想直接拒绝于是设置呼叫转移给闺蜜C了,最终屌丝男A和女神闺蜜C表白成功了,这种场景其实就是重定向了. 一.重定向 1. ...

  10. python接口自动化5-Json数据处理

    前言 有些post的请求参数是json格式的,这个前面第二篇post请求里面提到过,需要导入json模块处理. 一般常见的接口返回数据也是json格式的,我们在做判断时候,往往只需要提取其中几个关键的 ...

随机推荐

  1. Kettle中并行执行测试

    整个作业截图: 设置并行方法:右键 START 组件,勾选最后一个选项: Run Next Entries In Parallel 设置aa, bb, cc, dd, ee 都是shell脚本,内容都 ...

  2. 2018-2019-2 《Java程序设计》第6周学习总结

    20175319 2018-2019-2 <Java程序设计>第6周学习总结 教材学习内容总结 本周学习<Java程序设计>第七章和第十章: 内部类: 1.内部类可以使用外嵌类 ...

  3. Ext.net按钮事件中使用Response.Redirect的一个问题

    今天遇到一个Response.Redirect问题 通过Ext.net按钮写发送事件时,连接中会多出一个&amp,如果后台不进行UrlEncode操作的话,就会出问题,可是很不幸的是,有些跳转 ...

  4. PMP知识点(六)——项目经理权利类型

    社会心理学家约翰.弗伦奇(John.French)和伯特伦.雷文(Bertram.Raven)在他们1959年发表的一篇迄今不朽的论文中,提出了五种权力类别的模型,这个模型折射出权力拥有者依赖的不同基 ...

  5. PHP安装文件的审计

    初始化安装 一般php程序都有一个初始安装的问题,如果使用了一些cms安装后且没有删除安装文件的话,就会导致二次安装等问题. 具体但不限于以下几种情况: 无验证功能,任意重装覆盖 $_GET['ste ...

  6. 关于NPOI导入的时候有时出现乱码解决办法

    手上这个项目之前客户说过导入的时候回出现乱码问题,一直没用重视,现在自己做做一个功能,乱码经常出现,开始以为是代码的问题,最后百度了试了很多方法猜找到解决办法: 乱码页面如下: 解决办法: 打开IIS ...

  7. js 正则表达式,分组,非捕获或 环视的使用

    定位一个字符串中,匹配与定位重复字符中的最后一个字符: 例子: <script type="text/javascript"> var str="http:/ ...

  8. C#解压文件,Excel操作

    /// <summary> /// 获取目录下文件路径 /// </summary> /// <param name="path"></p ...

  9. JAVA进阶14

    间歇性混吃等死,持续性踌躇满志系列-------------第14天 1.线程的加入 package code0328; import javax.swing.*; import java.awt.* ...

  10. 没有显示器如何SSH连接上树莓派

    1.在用读卡器烧录系统后先用Linux虚拟机连接上读卡器,修改 sudo gedit /etc/wpa_supplicant/wpa_supplicant.conf 加入 network={ ssid ...