组织架构:

  包括配置文件,反射、文件路径、Excel操作、测试报告生成

case.config

  1. [MODE]
  2. file_name=case_data.xlsx
  3. mode={"register":'all',"login":'all',"recharge":'all'}

tools文件夹里的东西

  1. do_config.py
  1. # -*- conding:utr-8 -*-
  2. #@Time :2018/11/17 11:21
  3. #@Author:GYP测试
  4. #@File :do_config.py
  5.  
  6. import configparser
  7. class ReadConfig:
  8. def read_config(self,file_name,section,option):
  9. cf=configparser.ConfigParser()
  10. cf.read(file_name,encoding='utf-8')
  11. return cf.get(section,option)
  12. if __name__ == '__main__':
  13. res=ReadConfig().read_config('case.config','MODE','file_name')
  14. print(res)
  1. do_excel.py
  1. # -*- conding:utr-8 -*-
  2. #@Time :2018/11/17 14:05
  3. #@Author:GYP测试
  4. #@File :do_excel.py
  5. from openpyxl import load_workbook
  6. from tools.do_config import ReadConfig
  7. from tools.project_path import *
  8.  
  9. class Do_Excle:
  10. def __init__(self):
  11. self.file_name = test_data_path
  12. self.sheet_names = eval(ReadConfig().read_config(case_config_path, 'MODE', 'mode'))
  13. def get_header(self):
  14. wb = load_workbook(self.file_name)
  15. for sheet_name in self.sheet_names:
  16. sheet=wb[sheet_name]
  17. header=[]
  18. for i in range(1,sheet.max_column+1):
  19. header.append(sheet.cell(1,i).value)
  20. return header
  21. def Read_Excle(self):
  22. wb = load_workbook(self.file_name)
  23. test_data = []
  24. for sheet_name in self.sheet_names:
  25. sheet = wb[sheet_name]
  26. header = self.get_header()
  27. if self.sheet_names[sheet_name]=='all':
  28. for i in range(2,sheet.max_row+1):
  29. sub_data={}
  30. for j in range(1,sheet.max_column+1):
  31. sub_data[header[j-1]]=sheet.cell(i,j).value
  32. test_data.append(sub_data)
  33. else:
  34. for case_id in self.sheet_names[sheet_name]:
  35. sub_data={}
  36. for j in range(1,sheet.max_column+1):
  37. sub_data[header[j-1]]=sheet.cell(case_id+1,j).value
  38. test_data.append(sub_data)
  39. return test_data
  40. @staticmethod
  41. def write_excel(fiel_name,sheet_name,i,ActaulResult):
  42. wb=load_workbook(fiel_name)
  43. sheet=wb[sheet_name]
  44. sheet.cell(i,8).value=ActaulResult
  45. wb.save(fiel_name)
  46. if __name__ == '__main__':
  47. res=Do_Excle().Read_Excle()
  48. print(res)
  49. print(len(res))

get_data.py

  1. # -*- conding:utf-8 -*-
  2. #@Time :2018/11/19 11:37
  3. #@Author:GYP测试
  4. #@File :get_data.py
  5.  
  6. class Get_Data:
  7.  
  8. cookie=None
  1. http_requests.py
  1. # -*- conding:utr-8 -*-
  2. #@Time :2018/11/16 21:50
  3. #@Author:GYP测试
  4. #@File :http_requests.py
  5.  
  6. import requests
  7. class Http_Request:
  8. def request(self,method,url,data,cookie=None):
  9. try:
  10. if method == 'post':
  11. res=requests.post(url,data,cookies=cookie)
  12. else:
  13. res=requests.get(url,data,cookies=cookie)
  14. except Exception as e:
  15. print("非法请求,请检查{0}".format(e))
  16. raise e
  17. return res
  1. http_test.py
  1. # -*- conding:utr-8 -*-
  2. #@Time :2018/11/18 15:00
  3. #@Author:GYP测试
  4. #@File :http_test.py
  5.  
  6. import unittest #单元测试框架
  7.  
  8. from tools.do_excel import Do_Excle #数据读写
  9. from tools.project_path import * #文件路径
  10. from ddt import ddt,data #数据处理框架
  11. from tools.get_data import Get_Data #反射
  12. from tools.http_requests import Http_Request
  13.  
  14. test_data=Do_Excle().Read_Excle() #读取数据
  15. @ddt
  16. class TestHttp(unittest.TestCase):
  17. @data(*test_data)
  18. def test_api(self,item):
  19. res=Http_Request().request(item['method'],item['url'],eval(item['data']),getattr(Get_Data,'cookie'))
  20. if res.cookies: #利用反射获取cookie的值
  21. setattr(Get_Data,'cookie',res.cookies)
  22. try:
  23. self.assertEqual(str(item['ExpectedResult']),res.json()['code'])
  24. ActaulResult='Pass'
  25. except AssertionError as e:
  26. print('执行用例失败,请检查%s' %e)
  27. ActaulResult = 'Faile'
  28. print("获取到的结果是:{0}".format(res.json()))
  29. finally:
  30. # print(item['case_id'])
  31. Do_Excle.write_excel(test_data_path,item['module'],item['case_id']+1,ActaulResult)
  1. project_path.py
  1. # -*- conding:utr-8 -*-
  2. #@Time :2018/11/17 13:46
  3. #@Author:GYP测试
  4. #@File :project_path.py
  5.  
  6. import os
  7. from tools.do_config import ReadConfig
  8.  
  9. # class Get_Path:
  10. # def get_path(self):
  11. path=os.path.split(os.path.split(os.path.realpath(__file__))[0])[0]
  12.  
  13. case_config_path=os.path.join(path,'conf','case.config')
  14.  
  15. data_file_name=ReadConfig().read_config(case_config_path,'MODE','file_name')
  16. test_data_path=os.path.join(path,'test_data',data_file_name)
  17. html_repot_path=os.path.join(path,'test_result','html_report','test_api.html')
  18. print(case_config_path)
  19. print(html_repot_path)
  1. run.py
  1. # -*- conding:utr-8 -*-
  2. #@Time :2018/11/16 21:36
  3. #@Author:GYP测试
  4. #@File :run.py
  5.  
  6. import unittest
  7. import HTMLTestRunner
  8. from tools.project_path import *
  9.  
  10. from tools.http_test import TestHttp
  11. suite=unittest.TestSuite()
  12.  
  13. loader=unittest.TestLoader()
  14.  
  15. suite.addTest(loader.loadTestsFromTestCase(TestHttp))
  16.  
  17. with open(html_repot_path,'wb') as file:
  18. runner=HTMLTestRunner.HTMLTestRunner(
  19. stream=file,
  20. title='这个是接口自动化的测试报告',
  21. description='我来测试哦!',
  22. tester='GYP')
  23. runner.run(suite)
  1.  
  1.  

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. Python正则表达式指南(转)

    目录 Python正则表达式指南(转) 0.防走丢 1. 正则表达式基础 1.1. 简单介绍 1.2. 数量词的贪婪模式与非贪婪模式 1.3. 反斜杠的困扰 1.4. 匹配模式 2. re模块 2.1 ...

  2. kubernetes 核心技术概念(二)之 volume namespace annoation

    volume k8s通过数据卷来提供pod数据的持久化,k8s的数据卷是对docker数据卷的扩展,k8s的数据卷是pod级别的,用来实现pod中容器的文件共享 volume是pod中能被多个容器访问 ...

  3. 自定义 ThreadPoolExecutor 处理线程运行时异常

    自定义 ThreadPoolExecutor 处理线程运行时异常 最近看完了ElasticSearch线程池模块的源码,感触颇深,然后也自不量力地借鉴ES的 EsThreadPoolExecutor ...

  4. 配置rpm包安装的jdk环境变量

    最近在搭建james邮件服务的时候,由于这个服务是用Java开发的,之前这台服务器跑过tomcat服务,故有Java环境,就没在意有无配置环境变量,但在启动james的时候报没有配置环境变量: 那么问 ...

  5. 学习string,stringBuffer时遇到的问题

    今天学习string和stringBuffer.了解了两者的区别,然后去看java api都有啥方法.stringBuffer类有indexOf方法,于是写了下面的代码 String str = &q ...

  6. matlab 加根号

    text(3,0.5,'z=0.2$$\sqrt{c/h_0}$$+0.3','interpreter','latex')

  7. linux mint18 cinnamon 64bit 安装 docker

    参考官方文档:https://docs.docker.com/engine/installation/linux/ubuntu/ 1. 安装一些使 apt 可以使用 https 的源 sudo apt ...

  8. JDBC——连接数据库

    JDBC的基本介绍 1.概述:jdbc是使用Java访问各种数据库的一种技术 (1)jdbc工作原理 2.jdbc核心Java类(API) (1)DriverManager类 作用:管理各种数据库的驱 ...

  9. JSP+MySQL验证登录的实现方式

    用IDEA连接MySQL验证登录实现方式核心部分代码 用setString的方法对从数据库中的提取的信息经行比对: try { Class.forName("com.mysql.jdbc.D ...

  10. Eclipse使用Git检出项目

    1.打开Eclipse——File——Import...: 2.在弹出的Import框中选择Git——Projects from Git——NEXT: 3.选择Clone URI——Next: 4.输 ...