python+ddt+unittest+excel+request实现接口自动化
接口自动化测试流程:需求分析-用例设计--脚本开发--测试执行--结果分析
1.获取接口文档,根据文档获取请求方式,传输协议,请求参数,响应参数,判断测试是否通过设计用例
2.脚本开发:使用requests模块进行接口调用
request内容包含什么?
① 封装了各种请求类型,get、post 等;
② 以关键字参数的方式,封装了各种请求参数,params、data、headers、token 等;
③ 封装了响应内容,status_code、json()、cookies、url 等;
④ session 会话对象,可以跨请求。
3.使用unitest执行测试,编写断言进行结果校验
4.发送邮件报告
5.结合测试报告进行结果分析
数据校验(方便维护)
1.连接数据库,操作数据库
2.testsql.py 写查询sql,数据校验(断言sql查询与api返回校验)
3.testapi测试接口
关于测试数据总结:
1.对于全部是独立的接口项目,可以用数据驱动方式,用excel管理测试的接口数据
2.对于一些一次性消耗的数据,比如注册,每次注册不一样的数,可以用随机数生成
3.对于一个接口有多组测试参数,可以参数化,数据存yaml,text,json、excel都可以
4.对于可以反复使用的数据,比如订单的各种状态需要造数据的情况下,可以放到数据库,每次数据初始化,用完在清理
5.对于账号密码,邮箱配置的全局参数,可以用命令行参数,写到配置文件
6.对于少量的静态数据,比如一个接口的测试数据,可以写到py文件的开头
封装读取excel,返回字典
import xlrd
from conf import *
class ExcelUtil():
'''从excel中获取测试用例,输出结果为[{列名1:第一列1,列名2:第一列2}, {列名1:第二列1,列名2:第二列2}...]'''
def __init__(self, excelPath, sheetIndex=0):
self.data = xlrd.open_workbook(excelPath)
self.table = self.data.sheet_by_index(sheetIndex)
# 获取第一行作为key值
self.keys = self.table.row_values(0)
# 获取总行数
self.rowNum = self.table.nrows
# 获取总列数
self.colNum = self.table.ncols
def dict_data(self):
if self.rowNum <= 1:
print("总行数小于1")
else:
r = []
j = 1
for i in list(range(self.rowNum-1)):
s = {}
# 从第二行取对应values值
s['rowNum'] = i+2
values = self.table.row_values(j)
# print(values)
for x in list(range(self.colNum)):
s[self.keys[x]] = values[x]
r.append(s)
j += 1
return r
if __name__ == "__main__":
filepath = xlsPath+'/test.xlsx'
sheetIndex = 0
data = ExcelUtil(filepath, sheetIndex)
print(data.dict_data())
返回结果:
[{'姓名': 1.0, '年龄': 18.0}, {'姓名': 1.0, '年龄': 20.0}]
使用ddt数据驱动读取Excel数据
数据驱动原理:
1.测试数据为多个字典的list类型 list = [{"a":1},{"b":1}] list = [1,2,3,4]
2.测试类前加修饰@ddt.ddt
3.case前加修饰@ddt.data(数据)
#usr/bin/python
#encoding:utf-8
from ddt import ddt, data, unpack
import unittest
from debug import ExcelUtil
from conf import *
filepath = xlsPath + '/test.xlsx'
sheetIndex = 0
s = ExcelUtil(filepath, sheetIndex).dict_data()
@ddt
class DoubanTest(unittest.TestCase):
@classmethod
def setUp(self):
print("****Start Test*******")
@classmethod
def tearDown(self):
print("****End Test*******")
# @data([1, 2, 3, 6])
# @unpack
# def test_add(self,testdata1,testdata2,testdata3,exceptdata):
# sum = testdata1 + testdata2 + testdata3
# self.assertEqual(sum,exceptdata)
@data(*s)
def test_print(self,a):
print(a)
if __name__=='__main__':
unittest.main()
返回结果:
****Start Test*******
{'rowNum': 2, '姓名': 1.0, '年龄': 18.0}
****End Test*******
****Start Test*******
{'rowNum': 3, '姓名': 1.0, '年龄': 20.0}
****End Test*******