一、用Excel編寫用例(xlsx格式)
截圖僅供參考,實際用例編寫需要根據實際情況來。
二、用例加載、驗證
?1、數據的加載
import xlrd,xlwt #python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫def datacel():try:filepath='.\\test_case\\jenkins_case.xlsx'file=xlrd.open_workbook(filepath)#打開excel文件工作簿me=file.sheets()[3]#指定到具體sheet4表nrows=me.nrows#讀行數#用例IDlistid=[]# 用例名稱listname = []# keylistkey = []#參數listcontent=[]#urllisturl=[]#請求方式listfangshi=[]#斷言 期望值listqiwang=[]for i in range(1,nrows):listid.append(me.cell(i,0).value)listname.append(me.cell(i, 1).value)listkey.append(me.cell(i,2).value)listcontent.append(me.cell(i,3).value)listurl.append(me.cell(i,4).value)listfangshi.append(me.cell(i,5).value)listqiwang.append(me.cell(i,6).value)return listid,listname,listkey,listcontent,listurl,listfangshi,listqiwangexcept:print("數據錯誤,請檢查表格")def makedata():listid, listname, listkey, listcontent, listurl, listfangshi, listqiwang=datacel()make_data=[]for i in range(len(listid)):make_data.append({'url':listurl[i],'key':listkey[i],'content':listcontent[i],'fangshi':listfangshi[i],'qiwang':listqiwang[i]})return make_dataif __name__ == '__main__':data_test = makedata()for i in range(len(data_test)):print(data_test[i])
2、數據使用
import unittest, requests from ddt import ddt,data #數據驅動 from unittest_excel.get_excel import makedata #引用數據加載模塊 data_exce=makedata() #變量=makedata()返回值 list,每個元素是字典、用例 @ddt class TestStringMethods(unittest.TestCase):def setUp(self):print('+++')def tearDown(self):print('---')@data(*data_exce)def test_url(self,data_exce):print(data_exce['url'])print(data_exce['key'])print(data_exce['content'])print(data_exce['fangshi'])print(data_exce['qiwang'])@data(*data_exce)def test_request(self,data_exce):r=requests.post(url=data_exce['url'],json=data_exce['key'])print(data_exce['url'],r.status_code)if __name__ == '__main__':unittest.main()
?3、單個目標驗證
''' 這里暫時只比較了返回的value是否和預期一致的情況,沒有比較目標的鍵值都相同以及目標的層級 dict:待測目標 objkey:目標key objvalue:目標value ''' def dict_get(dict, objvalue, default):tmp = dictfor k,v in tmp.items():# 如果dict中的value和目標value相同,則返回value,這里也可以改成鍵值都相等if v == objvalue:return velse:if (type(v).__name__ == 'list'):#如果類型是list,且不為空if len(v)>=1:for i in range(0,(len(v))) :ret= dict_get(v[i], objvalue, default)#遞歸調用,如果不是返回default,則跳出遞歸if ret is not default:return retif (type(v).__name__ == 'dict'):#如果類型是dict,且不為空if len(v)>=1:for i in range(0,(len(v))) :ret = dict_get(v, objvalue, default)#遞歸調用,如果不是返回default,則跳出遞歸if ret is not default:return retreturn default#找不到時返回的默認值if __name__ == '__main__':test={"sites": [{ "name":"test" , "url":"www.test.com" },{ "name":"google" , "url":"www.google.com" },{ "name":"weibo" , "url":"www.weibo.com" }]}a=dict_get(test,"www.weibo.co",'未找到')print(a)
4、整個response驗證,這里是以單個目標驗證為基礎的方法
from Template_Log.log import LOG,logger from unittest_t3.check_kv import dict_get@logger('斷言測試結果,通過返回pass,失敗返回fail') def assert_in(assert_hope,response):if len(assert_hope.split('=')) > 1:#目標示例: assert_hope:name=google&url=www.google.comdata = assert_hope.split('&')#分割后示例:[name=google,url=www.google.com]result = dict([(item.split('=')) for item in data])#分割后示例: {name:google,url:www.google.com} value1=[]for value in result.values():s=dict_get(response, value, None)#期望的value和響應response對比,如果有相同就返回valueif (s != None):value1.append(s)else:return 'fail'print('斷言通過,斷言的實際值是:',value1)return 'pass'else:LOG.info('填寫測試預期值')raise ('請填寫期望值')
三、實例
import json,ddt import unittest,requests from Template_Log.log import LOG,logger#數據驅動 from unittest_t2.get_excel import makedata from unittest_t3.check_all import assert_in from unittest_t3.xmltojson import Xml2Json data_exce=makedata()@ddt.ddt class TestStringMethods(unittest.TestCase):def setUp(self):LOG.info("start_here")def tearDown(self):LOG.info("end_here")@logger('進入用例test_insert')@ddt.data(*data_exce)def test_insert(self,data_exce):r=requests.post(data_exce['url'],data=data_exce['key'])try:apijson = json.loads(r.text)except Exception:apijson = Xml2Json(r.text).resultprint('返回結果:', r.json())print('期望值:',data_exce['qiwang'])LOG.info('返回結果:%s'%apijson)qingwang=assert_in(data_exce['qiwang'],apijson)LOG.info('斷言結果:%s'%qingwang)self.assertEqual(qingwang,'pass',msg='預期和返回一致')if __name__ == '__main__':unittest.main()
?