在测试接口时,一个接口会先写好测试用例,这个用例主要针对功能,传入参时考虑到各种场景,正常的,异常的,如:参数缺省,参数传一个六位数字写用例时考虑边界情况等。
一个接口设计用例时有可能会十几条到几十条都有可能,多个接口就有很多了,这时候我们可以考虑到自动化测试接口。
采用数据驱动方式,把数据写在excel表格中,代码做封装,用数据驱动测试,两部分相互独立。python中用ddt模块来做数据驱动,代码简单好维护,调试也方便。
自己写的框架,结构如下:
common:公共层,放读取表格数据,发送request请求,生成测试报告的.py文件
data:放excel数据
report:放测试报告
testcase:写测试用例
run_main.py:运行用例并生成测试报告
HTMLTestRunner.py文件是从网上下载的模板,可以直接使用。
readExcel.py读取表格数据,返回的是一个列表,里面的数据以字典格式存放,通过索引得到字典然后取字典的值
1 #! /usr/bin/env python
2 #-*- coding:utf-8 -*-
3
4 """
5 @version: 1.06 @author: fky7 @site:8 @software: PyCharm9 @file: readExcel.py10 @time: 2018/3/24 9:3711 """
12 importxlrd13
14 classReadExcel():15 def readExcel(fileName,SheetName="Sheet1"):16 data =xlrd.open_workbook(fileName)17 table =data.sheet_by_name(SheetName)18
19 #获取总行数、总列数
20 nrows =table.nrows21 ncols =table.ncols22 if nrows > 1:23 #获取第一行的内容,列表格式
24 keys =table.row_values(0)25 #print(keys)
26
27 listApiData =[]28 #获取每一行的内容,列表格式
29 for col in range(1,nrows):30 values =table.row_values(col)31 #keys,values这两个列表一一对应来组合转换为字典
32 api_dict =dict(zip(keys, values))33 #print(api_dict)
34 listApiData.append(api_dict)35
36 returnlistApiData37 else:38 print("表格未填写数据")39 returnNone40
41 if __name__ == '__main__':42 s = ReadExcel.readExcel("E:\\fukun_apitest\\data\\yoyo_apiTest.xlsx","Sheet1")43 print(s)
sendRequest.py中的文件,读取表格的数据作为request请求的参数:
#-*- coding:utf-8 -*-
"""@version: 1.0
@author: fky
@site:
@software: PyCharm
@file: sendRequests.py
@time: 2018/3/24 11:40"""
from common.readExcel importReadExcelimportrequestsimportjsonclassSendRequests():defsendRequests(self,s,apiData):try:#从读取的表格中获取响应的参数作为传递
method = apiData["method"]
url= apiData["url"]if apiData["params"] == "":
par=Noneelse:
par= eval(apiData["params"])if apiData["headers"] == "":
h=Noneelse:
h= apiData["headers"]if apiData["body"] == "":
body_data=Noneelse:
body_data= eval(apiData["body"])
type= apiData["type"]
v=Falseif type == "json":
body=json.dumps(body_data)if type == "data":
body=body_dataelse:
body=body_data#发送请求
re = s.request(method=method,url=url,headers=h,params=par,data=body,verify=v)returnreexceptException as e:print(e)if __name__ == '__main__':
s=requests.session()
testData= ReadExcel.readExcel("apiTest.xlsx", "Sheet1")
response= SendRequests().sendRequests(s,testData[3])print(response.json())
用例部分(case_01_yoyo.py)
#! /usr/bin/env python#-*- coding:utf-8 -*-
"""@version: 1.0
@author: fky
@site:
@software: PyCharm
@file: case_01.py
@time: 2018/3/16 10:58"""
importunittestimportrequestsfrom ddt importddt,data,unpackfrom common.sendRequests importSendRequestsfrom common.readExcel importReadExcelimportos#path = os.path.dirname(os.getcwd())+"\\data\\yoyo_apiTest.xlsx"#print(path)
testData = ReadExcel.readExcel("E:\\fukun_apitest\\data\\yoyo_apiTest.xlsx", "Sheet1")
@ddtclassTest1(unittest.TestCase):defsetUp(self):
self.s=requests.session()deftearDown(self):pass@data(*testData)deftest_yoyo_api(self,data):
re=SendRequests().sendRequests(self.s, data)#print(re.json())
#切割字符串取后面的部分
expect_result1 = data["expect_result"].split(":")[1]#转换为字符串
expect_result =eval(expect_result1)#断言
self.assertEqual(re.json()["origin"], expect_result, "返回错误,实际结果是%s"%re.json()["origin"])if __name__ == '__main__':
unittest.main()
run_main.py,跑用例最后生成测试报告:
#! /usr/bin/env python#-*- coding:utf-8 -*-
"""@version: 1.0
@author: fky
@site:
@software: PyCharm
@file: run_main.py
@time: 2018/3/16 10:58"""
importunittestimporttimeimportosfrom common.HTMLTestRunner_jpg importHTMLTestRunnerdef run_case(dir = "testcase"):
case_dir= os.getcwd() + "\\" +dirprint(case_dir)
test_case=unittest.TestSuite()
discover= unittest.defaultTestLoader.discover(case_dir,pattern="case_01_yoyo.py",top_level_dir=None)returndiscoverif __name__ == '__main__':
current_time= time.strftime("%Y-%m-%d-%H_%M_%S", time.localtime(time.time()))
report_path=os.getcwd() + "\\report\\" + current_time + '.html' #生成测试报告的路径
print(report_path)
fp= open(report_path, "wb")
runner= HTMLTestRunner(stream=fp, title=u"自动化测试报告", description=u'yoyo接口',verbosity=2)
runner.run(run_case())
fp.close()
报告结果
--------------------------------------------------------------------------------------------
更新于2019-12-16日下午18:03
不好意思好久没看微博,今天才看见有人提问了,所有重新检查了下项目文件
case_02_qq.py 这个用例经测试是可以成功执行的,各位网友可以自行到github下载或克隆使用: