环境:python2.7
功能:实现接口自动化测试
整体结构:
1,common:存放发送请求的,返回响应的内容,具体的请求方式与返回内容,根据个人的不同而定
2、report:存放html报告结果
3,testCase:存放测试用例
4、testData:测试的数据,包括url,header,参数等
5、tools:工具包,其中HTMLTestURunner.py是为了生成html报告,myTools.py里主要存放处理的一些方法
6、all_test.py:批量执行所有的用例
common中的send_request.py
import requests
import json
class SendRequest():
def sendJsonRequests(self,url,dict,header=None):
re=requests.post(url,json=dict,headers=header)
return re.text
def sendDataRequests(self,url,dict,header=None):
re=requests.post(url,data=dict,headers=header)
return re.text
发送请求,返回响应的内容
testCase中的 test_loan_center_interface_API.py
import unittest
from unittest import TestCase
from common.send_request import SendRequest
import json
from ddt import ddt,data,unpack
from tools.myTools import *
test_loan_center_interface_data = get_test_case_data("C:\\Users\\Lenovo\\PycharmProjects\\FAMCAuto\\testData\\testData.xlsx","test_loan_center_interface")
@ddt
class LoanCenterInterfaceAPI(unittest.TestCase):
def setUp(self):
pass
def sendRequest(self,url,dict,header=None):
result = SendRequest().sendJsonRequests(url,dict,header)
return json.dumps(json.loads(result)["meta"],ensure_ascii=False)#字典转中文输出
@data(*test_loan_center_interface_data)
def test_loan_center_interface(self,data):
if data["paral"]=="" or data["paral"].encode("utf-8").isspace():
result = self.sendRequest(data["url"], " ")
else:
result = self.sendRequest(data["url"], json.loads(data["paral"]))
exception=json.dumps(json.loads(data["except"]), ensure_ascii=False, encoding='UTF-8')#处理字典中文输出显示
results=json.dumps(json.loads(result), ensure_ascii=False, encoding='UTF-8')#处理字典中文输出显示
self.assertEqual(exception,results)
testCase中的 test_get_weixin_taobao_info_API.py
import unittest
from unittest import TestCase
from common.send_request import SendRequest
import json
from ddt import ddt,data,unpack
from tools.myTools import *
test_get_weixin_taobao_info = get_test_case_data("C:\\Users\\Lenovo\\PycharmProjects\\FAMCAuto\\testData\\testData.xlsx","test_get_weixin_taobao_info")
#print test_get_weixin_taobao_info
@ddt
class GetWeiXinTaoBaoInfo(unittest.TestCase):
def setUp(self):
pass
def sendRequest(self,url,dict,header=None):
result = SendRequest().sendJsonRequests(url,dict,header)
return json.dumps(json.loads(result)["meta"],ensure_ascii=False)#字典转中文输出
@data(*test_get_weixin_taobao_info)
def test_get_weixin_taobao_info(self,data):
header=get_dc(data["header"].encode("utf-8"))
if data["paral"]=="" or data["paral"].encode("utf-8").isspace():
result = self.sendRequest(data["url"], " ",header)
else:
result = self.sendRequest(data["url"], json.loads(data["paral"]),header)
result1=json.loads(result)
if "bizNo" in result1.keys():
result1.pop("bizNo")
results = json.dumps(result1, ensure_ascii=False, encoding='UTF-8')# 处理字典中文输出显示
exception=json.dumps(json.loads(data["except"]), ensure_ascii=False, encoding='UTF-8')#处理字典中文输出显示
self.assertEqual(exception,results)
说明:
test_loan_center_interface_data 和test_get_weixin_taobao_info 的值通过get_test_case_data函数处理excel后,以列表字典的形式返回,再以
@data(*test_loan_center_interface_data)和@data(*test_get_weixin_taobao_info)传入测试用例中,到达参数化的目的,
这样只要在excel对应的位置填入要使用的测试用例的方法名就可以用这一个测试用例,可以减少很多代码的重复,利于维护,实际中
test_loan_center_interface_data 大概有10个接口,40几条用例在共用这个
tools中的myTools.py
import xlrd,sys
from openpyxl import load_workbook
from openpyxl import Workbook
import cx_Oracle
import json
def get_excel_dict( path, index=0):
paralList=[]
workbook=xlrd.open_workbook(path)#打开文件
sheet=workbook.sheets()[index]#sheet索引从0开始
firstRowDataList=sheet.row_values(0)#第一行数据
#print firstRowDataList
for rownum in range(1, sheet.nrows):#循环每一行数据
list = sheet.row_values(rownum)
#print type(list[3])
dict={}
dictTestCaseName={}
for caseData in list:
dict[firstRowDataList[list.index(caseData)]] =caseData #每一行数据与第一行数据对应转为字典
#json.dumps(json.loads(caseData), ensure_ascii=False)
dictTestCaseName[list[2]]=dict#转为字典后与用例名字对应转为字典
paralList.append(dictTestCaseName)#将处理后的数据放入列表里
return (paralList)
说明:get_excel_dict函数是处理excel表格里面的数据,使表格里的数据以字典的形式返回
testData.xlsx表格里面的数据格式如下(可以自己定义):
为了简洁:数据用数字代替,只是方便演示,真实的测试数据不是这样的
get_excel_dict返回的结果如下:
[{3.0: {u'paral': u'4', u'API': 1.0, u'testCaseName': 3.0, u'fileName': 2.0}},
{555.0: {u'paral': u'55', u'API': 11.0, u'testCaseName': 555.0, u'fileName': 22.0}},
{555.0: {u'paral': u'666', u'API': 111.0, u'testCaseName': 555.0, u'fileName': 444.0}}]
返回一个字典列表,每个字典里面的键值是对应的testcasename
def get_test_case_data(filename,testCaseName):
testData = get_excel_dict(filename)
#print(testData)
getTestCaseDataList = []
for data in testData:
if (data.keys()[0]) == testCaseName:
getTestCaseDataList.append(data[testCaseName])
return getTestCaseDataList
说明:
get_test_case_data函数是为了获取对应case所需要用到的数据,
filename:testDate.xlsx
testCaseName:测试用例的名字,
testCaseName传555,返回的结果就是
[ {u'paral': u'55', u'API': 11.0, u'testCaseName': 555.0, u'fileName': 22.0},{u'paral': u'666', u'API': 111.0, u'testCaseName': 555.0, u'fileName': 444.0}]
假如有10条用例会用到555这个用例,那返回来的列表里面就有10个参数,这个555就对应测试用例里面的
test_get_weixin_taobao_info和test_get_weixin_taobao_info
用例写好了需要写一个 脚本,可以批量执行所有的用例,all_test.py就是这个作用
import unittest
from tools import HTMLTestRunner
import time
from unittest import TestLoader
#用例目录
test_suite_dir="C:\Users\Lenovo\PycharmProjects\FAMCAuto\\testCase\\"
report_dir="C:\Users\Lenovo\PycharmProjects\FAMCAuto\\report\\"
def creatsuite():
testunit=unittest.TestSuite()
test_dir=test_suite_dir#定义测试文件查找的目录
#定义discover方法参数
package_tests=unittest.defaultTestLoader.discover(test_dir,pattern='test_*.py',top_level_dir=None)
#discover方法筛选出来的用例循环添加到测试套件中
for test_suite in package_tests:
for test_case in test_suite:
testunit.addTest(test_case)
print(testunit)
return testunit
alltestnames=creatsuite()
if __name__=="__main__":
now=time.strftime("%Y-%m-%d %H_%M_%S")
test_report=report_dir
filename=test_report+now+" result.html"
fp=open(filename,'wb')
runner=HTMLTestRunner.HTMLTestRunner(stream=fp,
title=u"FAMC测试报告",
description=u"测试用例执行结果")
runner.run(alltestnames)
fp.close()
只要运行这个文件就可以自动运行所有的用例,并生成报告
python+unittest+DDT的框架基本就是这样的啦,自己第一次用这个框架,有些地方不足,后面再慢慢改之~~~