数据驱动

是根据数据来测试的,如读取 excel表中的测试用例自动填写测试结果,发送测试报告
包括以下模块:
  • 1.获取用例
  • 2.调用接口
  • 3.校验结果
  • 4.发送测试报告
  • 5.异常处理
  • 6.日志模块

1. 首先设计好测试用例

2.建立文件结构

该自动化测试框架命名为:ATP,bin目录下写主程序,cases目录下放测试用例,conf目录下放配置文件,lib目录下放各个封装好的模块,logs目录下放日志文件,和readme文件。

3.封装模块

common.py:封装读取excel用例、调用接口、检验结果、写入报告这几个模块。

 1 """
2 第一步:读取excel中用例
3 第二步:根据用例发送请求
4 第三步:校验结果
5 第四步:将测试结果、返回报文写入excel
6 """
7 import xlrd,requests
8 from xlutils import copy
9 from lib.log import atp_log
10
11 class OpCase(object):
12 def get_case(self,file_path):
13 cases= [] #定义一个列表存放所有的cases
14 if file_path.endswith('.xls') or file_path.endswith('.xlsx'):
15 try:
16 book = xlrd.open_workbook(file_path)
17 sheet = book.sheet_by_index(0)
18 for i in range(1,sheet.nrows):
19 row_data = sheet.row_values(i) #获取的每一行数据存到列表row_data
20 cases.append(row_data[4:8])
21 atp_log.info('共读取%s条用例'%(len(cases)))
22 self.file_path = file_path #因为该函数已经传了参数路径,为方便write_excel引用,在此实例化
23 except Exception as e:
24 atp_log.error('[%s]用例获取失败,错误信息:%s'%(file_path,e))
25 else:
26 atp_log.error('用例文件不合法,%s'%file_path)
27 return cases
28 def my_request(self,url,method,data):
29 data = self.dataToDict(data)
30 try:
31 if method.upper() == 'POST':
32 res = requests.post(url,data).text
33 elif method.uper() == 'GET':
34 res = requests.get(url,params=data).text
35 else:
36 atp_log.warning('该请求方式暂不支持')
37 res = '该请求方式暂不支持'
38 except Exception as e:
39 msg = '【%s】接口调用失败,%s'%(url,e)
40 atp_log.error(msg)
41 res = msg
42 return res
43 def dataToDict(self,data): #把数据转成字典。
44 res = {}
45 data = data.split(',')
46 for d in data: #
47 k, v = d.split('=')
48 res[k] = v
49 def check_res(self,res,check): #res:实际结果,check:预期结果
50 res = res.replace('": "','=').replace('": ','=')
51 for c in check.split(','):
52 if c not in res:
53 atp_log.info('结果校验失败,预期结果:【%s】,实际结果【%s】'%(c,res))
54 return '失败'
55 return '成功'
56 def write_excel(self,case_res):
57 book = xlrd.open_workbook(self.file_path)
58 new_book = copy.copy(book)
59 sheet = new_book.get_sheet(0)
60 row = 1
61 for case_case in case_res:
62 sheet.write(row,8,case_case[0])
63 sheet.write(row,9,case_case[1])
64 row += 1
65 new_book.save(self.file_path.replace('xlsx','xls'))

log.py:封装日志模块

 1 import logging,os
2 from logging import handlers
3 from conf import setting
4 class Mylogger():
5 def __init__(self,file_name,level='info',backCount=5,when='D'):
6 logger = logging.getLogger() # 先实例化一个logger对象,先创建一个办公室
7 logger.setLevel(self.get_level(level)) # 设置日志的级别
8 # f1 = logging.FileHandler(filename='a.log',mode='a',encoding='utf-8') #找到写日志文件的这个人
9 c1 = logging.StreamHandler() # 负责往控制台输出的
10 b1 = handlers.TimedRotatingFileHandler(filename=file_name, when=when, interval=1, backupCount=backCount, encoding='utf-8')
11 fmt = logging.Formatter('%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')
12 c1.setFormatter(fmt)
13 b1.setFormatter(fmt)
14 logger.addHandler(c1)
15 logger.addHandler(b1)
16 self.logger = logger
17 def get_level(self,str):
18 level = {
19 'debug':logging.DEBUG,
20 'info':logging.INFO,
21 'warm':logging.WARNING,
22 'error':logging.ERROR
23 }
24 str = str.lower()
25 return level.get(str)
26
27 path = os.path.join(setting.LOG_PATH,setting.LOG_NAME)
28 atp_log = Mylogger(path,'debug').logger
29 #直接在这里实例化,用的时候不用再实例化了
30 #别的地方用的时候,直接atp_log.warnning('xxxx')

send_mail.py:封装发送邮件模块

 1 import yagmail
2 from conf import setting
3 from lib.log import atp_log
4 def sendmail(title,content,attrs=None):
5 m = yagmail.SMTP(host=setting.MAIL_HOST,user=setting.MAIL_USER,
6 password=setting.MAIL_PASSWRD,smtp_ssl=True)
7 m.send(to=setting.TO,
8 subject=title,
9 contents = content,
10 attachments = attrs)
11 atp_log.info('发送邮件完成')

4.配置文件

setting.py,配置文件:设置邮件地址、日志默认级别、用例存放路径、日志存放路径、日志文件名

 1 import os
2 BASE_PATH = os.path.dirname(
3 os.path.dirname(os.path.abspath(__file__))
4 ) #三层目录定位到ATP目录
5 MAIL_HOST = 'smtp.qq.com'
6 MAIL_USER='12*****89@qq.com'
7 MAIL_PASSWRD = 'gjn*****bcgh'
8 TO = [
9 '12*****9@qq.com'
10 ]
11 LEVEL = 'debug' #设置日志默认级别
12
13 LOG_PATH = os.path.join(BASE_PATH,'logs') #日志文件在logs目录下
14 CASE_PATH = os.path.join(BASE_PATH,'cases') #用例文件在cases目录下
15 LOG_NAME = 'atp_log' #设置日志文件名

5.将ATP文件Mark directory  as Sources Root

6.编写主程序

start.py

 1 import os,sys
2 BASE_PATH = os.path.dirname(
3 os.path.dirname(os.path.abspath(__file__))
4 )
5 sys.path.insert(0,BASE_PATH)
6
7 from lib.common import OpCase
8 from lib.send_mail import sendmail
9 from conf import setting
10 class CaseRun(object):
11 def find_case(self):
12 op = OpCase()
13 for f in os.listdir(setting.CASE_PATH): #每次循环的时候读一个excel
14 abs_path = os.path.join(setting.CASE_PATH,f)
15 case_list = op.get_case(abs_path)
16 res_list = []
17 pass_count,fail_count= 0,0
18 for case in case_list: #循环每一个excel里面的所有用例
19 url,method,req_data,check = case
20 res = op.my_request(url,method,req_data) #调用完接口返回的结果
21 status = op.check_res(res,check)
22 res_list.append([res,status])
23 if status == '通过':
24 pass_count += 1
25 else:
26 fail_count += 1
27 op.write_excel(res_list)
28 msg = '''
29 xx你好,
30 本次共运行%s条用例,通过%s条,失败%s条。
31 '''%(len(res_list),pass_count,fail_count)
32 sendmail('测试用例运行结果',content=msg,attrs=abs_path)
33
34 CaseRun().find_case()

OK,数据驱动自动化测试框架编写完成,运行 start.py 程序,收到邮件内容如下:

 
 
 

数据驱动之 python + requests + Excel的更多相关文章

  1. python+requests+excel+unittest+ddt接口自动化数据驱动并生成html报告(二)

    可以参考 python+requests接口自动化完整项目设计源码(一)https://www.cnblogs.com/111testing/p/9612671.html 原文地址https://ww ...

  2. python+requests+excel+unittest+ddt接口自动化数据驱动并生成html报告

    1.环境准备: python3.6 requests xlrd openpyxl HTMLTestRunner_api 2.目前实现的功能: 封装requests请求方法 在excel填写接口请求参数 ...

  3. python+requests+excel+unittest+ddt接口自动化数据驱动并生成html报告(已弃用)

    前言 1.环境准备: python3.6 requests xlrd openpyxl HTMLTestRunner_api 2.目前实现的功能: 封装requests请求方法 在excel填写接口请 ...

  4. Python+requests+excel接口测试

    2018-06-14   17:00:13 环境准备: - Python 3.7 - requests库 - xlrd 1.创建Excel文件 2.读取Excel文件 import xlrd clas ...

  5. python+requests+excel 接口测试

    1.EXCEL文件接口保存方式,如图. 2.然后就是读取EXCEL文件中的数据方法,如下: import xlrd class readExcel(object): def __init__(self ...

  6. python+requests+excel 接口自动化框架

    一.项目框架如图: 1.common :这个包都是一些公共的方法,如:手机号加解密,get/post接口请求的方法封装,接口鉴权,发邮件,读写excel文件方法等等 2.result:存放每次运行的l ...

  7. 对比3种接口测试的工具:jmeter+ant;postman;python的requests+unittest或requests+excel

    这篇随笔主要是对比下笔者接触过的3种接口测试工具,从实际使用的角度来分析下3种工具各自的特点 分别为:jmeter.postman.python的requests+unittest或requests+ ...

  8. 基于Python Requests的数据驱动的HTTP接口测试

    发表于:2017-8-30 11:56  作者:顾翔   来源:51Testing软件测试网原创 http://www.51testing.com/html/69/n-3720769-2.html   ...

  9. python requests抓取NBA球员数据,pandas进行数据分析,echarts进行可视化 (前言)

    python requests抓取NBA球员数据,pandas进行数据分析,echarts进行可视化 (前言) 感觉要总结总结了,希望这次能写个系列文章分享分享心得,和大神们交流交流,提升提升. 因为 ...

  10. 转载:python + requests实现的接口自动化框架详细教程

    转自https://my.oschina.net/u/3041656/blog/820023 摘要: python + requests实现的接口自动化框架详细教程 前段时间由于公司测试方向的转型,由 ...

随机推荐

  1. Node.js学习笔记----day05 (Promise详情)

    认真学习,认真记录,每天都要有进步呀!!! 加油叭!!! 一.回调函数 回调的含义:异步任务里面又嵌套了异步 如图: 没有使用回调之前读取文件,没有办法保证每次执行顺序都是 a--->b---& ...

  2. SpringBoot 三大开发工具,你都用过么?

    本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...

  3. 【unity萌新第一步】Unity的Hello World(适合小白)

    Unity萌新的第一步:使用unity写第一个Hello World IT界有个笑话:"我擅长用各种语言写Hello World".我讲这个笑话的目的是,指出:写一个HelloWo ...

  4. JSON Crack 数据可视化工具

    JSON Crack简介 JSON Crack 是一个很方便的 JSON 数据可视化工具. 该项目不是简单的展示 JSON 数据,而是将其转化为类似思维导图的形式,支持放大/缩小.展开/收缩.搜索节点 ...

  5. Python3中的“加和”函数

    技术背景 其实如果没有专门去研究python的一些内置函数的话,我们都没办法发现一些很神奇的功能,即使是我们最熟悉的python中的sum函数.不知道还有多少人,以为这只是一个只能用来做求和的函数? ...

  6. ros_navigation案列操作流程

    1. 启动仿真 source devel/setup.bash export TURTLEBOT3_MODEL=burger roslaunch turtlebot3_gazebo turtlebot ...

  7. javaEE(网络编程、TCP、线程池优化)

    网络编程 Client-Server(CS) Browser/Server(BS) 1.客户端--服务端 安装客户端 更新. 依赖PC 2.浏览器和服务端 分布式 兼容性 一站开发 网络通信: UDP ...

  8. Hugging Face 每周速递: 扩散模型课程完成中文翻译,有个据说可以教 ChatGPT 看图的模型开源了

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...

  9. 钓鱼攻击之:OFFICE CVE-2017-11882

    钓鱼攻击之:OFFICE CVE-2017-11882 目录 钓鱼攻击之:OFFICE CVE-2017-11882 1 环境准备 2 利用过程 2.1 生成验证POC 2.2 CVE-2017-11 ...

  10. K8S 实用工具之一 - 如何合并多个 kubeconfig?

    开篇 引言: 磨刀不误砍柴工 工欲善其事必先利其器 K8S 集群规模,有的公司倾向于少量大规模 K8S 集群,也有的公司会倾向于大量小规模的 K8S 集群. 如果是第二种情况,是否有一个简单的 kub ...