写在前面的话
我是LeClaire,一个没有测试理论基础的测试,从接触测试到工作都是野路子,毕业的前两年只会点点点,数据库只会select * from xxx表,语言什么的表示看不懂啊,linux系统操作不会啊。再经历过面试越来越难的经历后,想着学点东西吧,可是不想花钱去报班,咋办,19年6月份到csdn逛了一圈,发现了新大陆,对于一个测试来说,从这里完全可以学到自己所需要的东西,东拼西凑的学回来python的相关自动化,下面就来介绍一下python配合excel配合unitest搭建的接口测试吧。
python3.7(其他版本也可以)请到这里(https://blog.csdn.net/weixin_43790276/article/details/89439352)进行学习Windows环境下安装,安装完之后再安装pycharm或者vscode编译器,方便编写代码,我这里用的是vscode,下边看具体的功能。
接口的参数信息非常的接近于python的字典类型:“name”:“value”的形式,简直是一毛一样。所以在经过度娘拼接,这里写了一个从excel导入入参的形式的函数,把sheet的第一行作为字典的name,也就是入参的字段,第二行开始作为字段的值value具体的代码如下:
1,先pip install xlrd这是python操作excel的库
import xlrd
import xdrlib,sys
class ExcelUtil:
#定义获取excel的方式,excel_path(excel存放的路径),sheet_name, 取哪个工作簿进行参数入参获取
def __init__(self,excel_path,sheet_name):
self.data=xlrd.open_workbook(excel_path)
self.table=self.data.sheet_by_name(sheet_name)
#获取第一行的值作为keys
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 range(self.rowNum-1):
s={}
values = self.table.row_values(j)
for x in range(self.colNum):
s[self.keys[x]] = values[x]
r.append(s)
j += 1
return r
if __name__=="__main__":
excel_path=''
sheet_name=''
data=ExcelUtil(excel_path,sheet_name)
python进行接口测试的方法主要是基于requests的库进行http、https的访问,所以需要导入requests库,安装方法还是通过pip install requests,在python中任何缺少库类的报错都可以通过pip install xx来安装。为了组装测试条件还需要unittest库的支持,请pip install unittest,从之前写的excesl操作函数里边导入Excelutil进行参数输入。测试案例相关的代码如下:
import requests
import unittest
from excel_optest import ExcelUtil
import json
import os, sys
class Generalist(unittest.TestCase):
#创建对象的方法,setUp,unittest在每个case运行之前运行,这里主要是创建测试的接口,url,这里以我目前的项目为例:
def setUp(self):
self.base_url_1="http://10.10.13.211:19188/api/addCouseSub"
def test_addCouseSub_0(self):
data=ExcelUtil('F:/AutoTestting/TestData/TCcollege.xls','课程订阅').dict_data()[0]
r=requests.post(self.base_url_1,params=data)
result=r.json()
self.assertEqual(result['code'], '-1')
self.assertEqual(result['msg'],'订阅传入参数异常,更新失败')
#couseId为空
def test_addCouseSub_1(self):
data=ExcelUtil('F:/AutoTestting/TestData/TCcollege.xls','课程订阅').dict_data()[1]
r=requests.post(self.base_url_1,params=data)
result=r.json()
self.assertEqual(result['code'], '-1')
self.assertEqual(result['msg'],'订阅传入参数异常,更新失败')
#commAccount为空
def test_addCouseSub_2(self):
data=ExcelUtil('F:/AutoTestting/TestData/TCcollege.xls','课程订阅').dict_data()[2]
r=requests.post(self.base_url_1,params=data)
result=r.json()
self.assertEqual(result['code'], '-1')
self.assertEqual(result['msg'],'订阅传入参数异常,更新失败')
#参数正确已订阅
def test_addCouseSub_3(self):
data=ExcelUtil('F:/AutoTestting/TestData/TCcollege.xls','课程订阅').dict_data()[3]
r=requests.post(self.base_url_1,params=data)
result=r.json()
self.assertEqual(result['code'], '1')
self.assertEqual(result['msg'],'已经订阅该课程')
#参数正确订阅成功
def test_addCouseSub_4(self):
data=ExcelUtil('F:/AutoTestting/TestData/TCcollege.xls','课程订阅').dict_data()[4]
r=requests.post(self.base_url_1,params=data)
result=r.json()
self.assertEqual(result['code'], '0')
self.assertEqual(result['msg'],'订阅成功')
if __name__=='__main__':
unittest.main()
注意,每个测试案例的文件名需要已test开头,test_1,test_2这样的形式,data里边的内容就是post请求的入参,通过这条语句拼接成完整的requests入参:r=requests.post(self.base_url_1,params=data)即url+prams,post请求分为head和data。self.assertEqual为出参交易,通过这个方法可以校验出参的正确性,result[‘code’]即,服务器返回的状态码,对状态码进行对比,result[‘msg’]即返回的message,对返回的 message进行对比,如果不同就会校验出错。
最后需要调用主函数对unittest.main对真个测试案例进行组装
那么问题来了,在进行着一系列的操作后我们只是对测试案例进行了组装,并没有执行,因为我们需要把测试案例和执行的操作进行分开编写,这样就可以不用每个案例都嵌套一个执行函数,方便一次性执行多个案例了。
在执行函数在我们需要导入sys,HTMLTestRunner,注意了,这个库是不能进行pip install的,需要自己网上进行下载,由于python2和python3版本的HTMLTestRunner,是不同的,这里我放上python3版本的,下载之后放在python的安装目录的Lib下边
下载链接:https://pan.baidu.com/s/1Sdlzsfov3ecvPCgMnLiYOA
百度网盘:
执行函数代码:
#coding=utf-8
import time, sys
from HTMLTestRunner import HTMLTestRunner
import unittest
#测试案例的路径:test_dir
test_dir= "F:/AutoTestting/testcase"
#调用discover方法,遍历执行一test开头的测试案例脚本
discover=unittest.defaultTestLoader.discover(test_dir,pattern='test*.py')
#运行测试案例生成html报告的函数
def ReportBulid():
now=time.strftime("%Y-%m-%d %H_%M_%S")
#F:/AutoTestting/report/,测试报告html格式存放的路径
filename='F:/AutoTestting/report/'+now+'result.html'
fp=open(filename,'wb')
runner=HTMLTestRunner(stream=fp,title="通财学院测试报告",description='通财学院')
runner.run(discover)
fp.close()
if __name__=="__main__":
ReportBulid()
运行命令:.
.点表示执行结果和预期一致,F表示该接口有报错。
执行结果:
好了,这个接口的测试组装过程就这些,后续有在linux环境执行,并配合django进行可视化的测试搭建,下次再见!
github项目地址:https://github.com/simpl8/unittest.git