1、編寫EXCEL用例
2、Python操作excel
讀取excel數據
把excel讀取的數據關聯到請求代碼裡
寫入測試結果到表裡
import xlrdfrom xlutils.copy import copyimport jsondef get_excelData(sheetName,startRow,endRow): resList=[] excelDir = '../data/接口自動化測試用例模板.xls' workBook = xlrd.open_workbook(excelDir,formatting_info=True) workSheetName = workBook.sheet_names() worksheet= workBook.sheet_by_name(sheetName) for one in range(startRow-1,endRow): reqBodyData = worksheet.cell(one,9).value reqpData = worksheet.cell(one,11).value resList.append((reqBodyData,reqpData)) return resList
def set_excelData(): excelDir = '../data/接口自動化測試用例模板.xls' workBook = xlrd.open_workbook(excelDir,formatting_info=True) workBookNew = copy(workBook) workSheetNew = workBookNew.get_sheet(0) return workBookNew,workSheetNew
def get_excelData2(sheetName,caseName): ''' :param sheetName: 表名 :param caseName: 某一個接口的用戶名稱 :return: ''' resList=[] excelDir = '../data/接口自動化測試用例模板.xls' workBook = xlrd.open_workbook(excelDir,formatting_info=True) workSheetName = workBook.sheet_names() worksheet= workBook.sheet_by_name(sheetName) idx = 0 for one in worksheet.col_values(0): if caseName in one: reqBodyData = worksheet.cell(idx,9).value reqpData = worksheet.cell(idx,11).value resList.append((json.loads(reqBodyData),json.loads(reqpData))) idx +=1 return resList
if __name__ == '__main__': for one in get_excelData('登錄模塊'): print(one) for one in get_excelData2('登錄模塊','Login'): print(one)3、Pytest執行測試用例
import requestsfrom config.config import HOSTimport hashlibimport jsondef get_md5(psw): md5 =hashlib.md5() md5.update(psw.encode('utf-8')) return md5.hexdigest()
class Login: def login(self,inData,getToken=True): url = f'{HOST}/account/sLogin' inData = json.loads(inData) inData['password']=get_md5(inData['password']) payload = inData resp = requests.post(url,data=payload) if getToken: return resp.json()['data']['token'] else: return resp.json()
if __name__ == '__main__': print(Login().login({'username':'sq0001','password':'123456'}))from tools.getExcel import get_excelData2,set_excelDataimport json,pytestfrom lib.login import Loginimport allure,osclass TestLogin: @pytest.mark.parametrize('inData,respData',get_excelData2('登錄模塊','Login')) # parametrize('變量',值) def test_login(self,inData,respData): res=Login().login(json.dumps(inData),getToken=False) assert res['msg'] ==respData['msg']
if __name__ == '__main__': pytest.main(['test_func01.py', '-s', '--alluredir', '../report/tmp']) os.system('allure generate ../report/tmp -o ../report/report --clean') os.system('allure server ../report/tmp')4、環境的初始化和數據清除
需要創建configtest文件 ,
Pytest的fixtrue操作
初始化文件,自動識別,放在工程裡對整個工程有效,放在包裡對該包有效
import pytestfrom config.config import HOSTfrom lib.login import Loginfrom lib.myShop import MyShop'''scope='session' 整個包執行一次scope='function' 包裡的方法都執行autouse=True 自動執行'''@pytest.fixture(scope='session',autouse=True)def start_demo(requests): print('--開始執行自動化測試---')
def fin(): print('--自動化測試結束--') requests.addfinalizer(fin)
@pytest.fixture(scope='function')#需要才調,不要加autouse=Truedef update_shop_init(): print('---我的作用是商鋪更新的初始化操作---') token=Login().login({'username': 'sq0001', 'password': '123456'},getToken=True) shopId=MyShop(token).shop_list({'page':1,'limit':20})['data']['records'][0]['id'] imageInfo = MyShop(token).file_upload('123.png','../data/123.png') return shopId,imageInfoimport requestsfrom config.config import HOSTfrom lib.login import Login
class MyShop: def __init__(self,inToken): self.header = {'Authorization':inToken} def shop_list(self,inData): payload = inData url = f'{HOST}/shopping/myShop' resp= requests.get(url,headers = self.header,params=payload) return resp.json()
def file_upload(self,fileName,fileDir): ''' :param fileName:文件名 :param fileDir: 文件路徑 :return: 文件上傳的參數為files ''' user_file = {'file':(fileName,open(fileDir,'rb'),'image/png')} resp = requests.post(f'{HOST}/file',files=user_file,heards=self.header) return resp.json()['data']['realFileName'] def shop_update(self,inData,shopId,imageInfo): ''' :param inData: :param shopId: :param imageInfo: :return: ''' inData['id']= shopId inData['image_path'] = imageInfo inData['image'] = f"{HOST}/file/getImgStream?fileName={imageInfo}" payload = inData url = f'{HOST}/shopping/updatemyshop' resp= requests.post(url,headers = self.header,params=payload) return resp.json()
if __name__ == '__main__': token=Login().login({'username': 'sq0001', 'password': '123456'},getToken=True) res=MyShop(token).shop_list({'page':1,'limit':20}) id=res['data']['records'][0]['id'] res = MyShop(token).file_upload('123.png','../data/123.png')
from lib.myShop import MyShopfrom lib.login import Loginfrom tools.getExcel import get_excelData2import pytest,osclass TestMyShop: def setup_class(self): self.token = Login().login({'username':'sq0001','password':'123456'},getToken=True) @pytest.mark.parametrize('inData,respData',get_excelData2('我的商鋪','listshopping')) def test_shop_list(self,inData,respData): res = MyShop(self.token).shop_list(inData) if res.get('code') !=None: assert res['code'] ==respData['code'] else: assert res['error'] == respData['error']
@pytest.mark.parametrize('inData,respData', get_excelData2('我的商鋪', 'updateshopping')) def test_shop_update(self, inData, respData,update_shop_init): res = MyShop(self.token).shop_update(inData,update_shop_init[0],update_shop_init[1]) if res.get('code') != None: assert res['code'] == respData['code'] else: assert res['error'] == respData['error']'''pytest 輸出的信息 . 用例通過 F 用例失敗 --沒有語法報錯 E 語法錯誤 清除接口案例跑完之後的數據: for one in os.listdir('../report/tmp') if 'json' in one: os.remove(f'../report/tmp/{one}') '''if __name__ == '__main__': pytest.main(['test_myShop.py', '-s', '--alluredir', '../report/tmp']) os.system('allure generate ../report/tmp -o ../report/report --clean')