網(wǎng)站名稱備案青島神馬排名優(yōu)化
首先配置好開發(fā)環(huán)境,下載安裝Python并下載安裝pycharm,在pycharm中創(chuàng)建項目功能目錄。如果不會的可以百度Google一下,該內(nèi)容網(wǎng)上的講解還是比較多比較全的!
大家可以先簡單了解下該項目的目錄結(jié)構(gòu)介紹,后面會針對每個文件有詳細注解和代碼。
common:
——configDb.py:這個文件主要編寫數(shù)據(jù)庫連接池的相關(guān)內(nèi)容,本項目暫未考慮使用數(shù)據(jù)庫來存儲讀取數(shù)據(jù),此文件可忽略,或者不創(chuàng)建。本人是留著以后如果有相關(guān)操作時,方便使用。
——configEmail.py:這個文件主要是配置發(fā)送郵件的主題、正文等,將測試報告發(fā)送并抄送到相關(guān)人郵箱的邏輯。
——configHttp.py:這個文件主要來通過get、post、put、delete等方法來進行http請求,并拿到請求響應(yīng)。
——HTMLTestRunner.py:主要是生成測試報告相關(guān)
——Log.py:調(diào)用該類的方法,用來打印生成日志
result:
——logs:生成的日志文件
——report.html:生成的測試報告
testCase:
——test01case.py:讀取userCase.xlsx中的用例,使用unittest來進行斷言校驗
testFile/case:
——userCase.xlsx:對下面test_api.py接口服務(wù)里的接口,設(shè)計了三條簡單的測試用例,如參數(shù)為null,參數(shù)不正確等
caselist.txt:配置將要執(zhí)行testCase目錄下的哪些用例文件,前加#代表不進行執(zhí)行。當(dāng)項目過于龐大,用例足夠多的時候,我們可以通過這個開關(guān),來確定本次執(zhí)行哪些接口的哪些用例。
config.ini:數(shù)據(jù)庫、郵箱、接口等的配置項,用于方便的調(diào)用讀取。
getpathInfo.py:獲取項目絕對路徑
geturlParams.py:獲取接口的URL、參數(shù)、method等
readConfig.py:讀取配置文件的方法,并返回文件中內(nèi)容
readExcel.py:讀取Excel的方法
runAll.py:開始執(zhí)行接口自動化,項目工程部署完畢后直接運行該文件即可
test_api.py:自己寫的提供本地測試的接口服務(wù)
test_sql.py:測試數(shù)據(jù)庫連接池的文件,本次項目未用到數(shù)據(jù)庫,可以忽略
二、Python+unittest+requests+HTMLTestRunner完整的接口自動化測試框架搭建_01——測試接口服務(wù)
首先,我們想搭建一個接口自動化測試框架,前提我們必須要有一個可支持測試的接口服務(wù)。有人可能會說,現(xiàn)在我們的環(huán)境不管測試環(huán)境,還是生產(chǎn)環(huán)境有現(xiàn)成的接口。但是,一般工作環(huán)境中的接口,不太滿足我們框架的各種條件。舉例如,接口a可能是get接口b可能又是post,等等等等。因此我決定自己寫一個簡單的接口!用于我們這個框架的測試!
按第一講的目錄創(chuàng)建好文件,打開test_api.py,寫入如下代碼
import flask
import json
from flask import request'''
flask: web框架,通過flask提供的裝飾器@server.route()將普通函數(shù)轉(zhuǎn)換為服
'''
# 創(chuàng)建一個服務(wù),把當(dāng)前這個python文件當(dāng)做一個服務(wù)
server = flask.Flask(__name__)
# @server.route()可以將普通函數(shù)轉(zhuǎn)變?yōu)榉?wù) 登錄接口的路徑、請求方式
@server.route('/login', methods=['get', 'post'])
def login():# 獲取通過url請求傳參的數(shù)據(jù)username = request.values.get('name')# 獲取url請求傳的密碼,明文pwd = request.values.get('pwd')# 判斷用戶名、密碼都不為空if username and pwd:if username == 'xiaoming' and pwd == '111':resu = {'code': 200, 'message': '登錄成功'}return json.dumps(resu, ensure_ascii=False) # 將字典轉(zhuǎn)換字符串else:resu = {'code': -1, 'message': '賬號密碼錯誤'}return json.dumps(resu, ensure_ascii=False)else:resu = {'code': 10001, 'message': '參數(shù)不能為空!'}return json.dumps(resu, ensure_ascii=False)if __name__ == '__main__':server.run(debug=True, port=8888, host='127.0.0.1')
執(zhí)行test_api.py,在瀏覽器中輸入http://127.0.0.1:8888/login?name=xiaoming&pwd=11199回車,驗證我們的接口服務(wù)是否正常~
?
?變更我們的參數(shù),查看不同的響應(yīng)結(jié)果確認(rèn)接口服務(wù)一切正常
?三、Python+unittest+requests+HTMLTestRunner完整的接口自動化測試框架搭建_02——配置文件讀取
在我們第二講中,我們已經(jīng)通過flask這個web框架創(chuàng)建好了我們用于測試的接口服務(wù),因此我們可以把這個接口抽出來一些參數(shù)放到配置文件,然后通過一個讀取配置文件的方法,方便后續(xù)的使用。同樣還有郵件的相關(guān)配置~
按第一講的目錄創(chuàng)建好config.ini文件,打開該文件寫入如下:
# -*- coding: utf-8 -*-
[HTTP]
scheme = http
baseurl = 127.0.0.1
port = 8888
timeout = 10.0[EMAIL]
on_off = on;
subject = 接口自動化測試報告
app = Outlook
addressee = songxiaobao@qq.com
cc = zhaobenshan@qq.com
在HTTP中,協(xié)議http,baseURL,端口,超時時間。
在郵件中on_off是設(shè)置的一個開關(guān),=on打開,發(fā)送郵件,=其他不發(fā)送郵件。subject郵件主題,addressee收件人,cc抄送人。
在我們編寫readConfig.py文件前,我們先寫一個獲取項目某路徑下某文件絕對路徑的一個方法。按第一講的目錄結(jié)構(gòu)創(chuàng)建好getpathInfo.py,打開該文件
import osdef get_Path():path = os.path.split(os.path.realpath(__file__))[0]return pathif __name__ == '__main__':# 執(zhí)行該文件,測試下是否OKprint('測試路徑是否OK,路徑為:', get_Path())
填寫如上代碼并執(zhí)行后,查看輸出結(jié)果,打印出了該項目的絕對路徑:
繼續(xù)往下走,同理,按第一講目錄創(chuàng)建好readConfig.py文件,打開該文件,以后的章節(jié)不在累贅
import os
import configparser
import getpathInfo#引入我們自己的寫的獲取路徑的類path = getpathInfo.get_Path()#調(diào)用實例化,還記得這個類返回的路徑為C:\Users\songlihui\PycharmProjects\dkxinterfaceTest
config_path = os.path.join(path, 'config.ini')#這句話是在path路徑下再加一級,最后變成C:\Users\songlihui\PycharmProjects\dkxinterfaceTest\config.ini
config = configparser.ConfigParser()#調(diào)用外部的讀取配置文件的方法
config.read(config_path, encoding='utf-8')class ReadConfig():def get_http(self, name):value = config.get('HTTP', name)return valuedef get_email(self, name):value = config.get('EMAIL', name)return valuedef get_mysql(self, name):#寫好,留以后備用。但是因為我們沒有對數(shù)據(jù)庫的操作,所以這個可以屏蔽掉value = config.get('DATABASE', name)return valueif __name__ == '__main__':#測試一下,我們讀取配置文件的方法是否可用print('HTTP中的baseurl值為:', ReadConfig().get_http('baseurl'))print('EMAIL中的開關(guān)on_off值為:', ReadConfig().get_email('on_off'))
執(zhí)行下readConfig.py,查看數(shù)據(jù)是否正確
?一切OK
四、Python+unittest+requests+HTMLTestRunner完整的接口自動化測試框架搭建_03——讀取Excel中的case
配置文件寫好了,接口我們也有了,然后我們來根據(jù)我們的接口設(shè)計我們簡單的幾條用例。首先在前兩講中我們寫了一個我們測試的接口服務(wù),針對這個接口服務(wù)存在三種情況的校驗。正確的用戶名和密碼,賬號密碼錯誤和賬號密碼為空
?
?
?我們根據(jù)上面的三種情況,將對這個接口的用例寫在一個對應(yīng)的單獨文件中testFile\case\userCase.xlsx?,userCase.xlsx內(nèi)容如下:
?緊接著,我們有了用例設(shè)計的Excel了,我們要對這個Excel進行數(shù)據(jù)的讀取操作,繼續(xù)往下,我們創(chuàng)建readExcel.py文件
import os
import getpathInfo# 自己定義的內(nèi)部類,該類返回項目的絕對路徑
#調(diào)用讀Excel的第三方庫xlrd
from xlrd import open_workbook
# 拿到該項目所在的絕對路徑
path = getpathInfo.get_Path()class readExcel():def get_xls(self, xls_name, sheet_name):# xls_name填寫用例的Excel名稱 sheet_name該Excel的sheet名稱cls = []# 獲取用例文件路徑xlsPath = os.path.join(path, "testFile", 'case', xls_name)file = open_workbook(xlsPath)# 打開用例Excelsheet = file.sheet_by_name(sheet_name)#獲得打開Excel的sheet# 獲取這個sheet內(nèi)容行數(shù)nrows = sheet.nrowsfor i in range(nrows):#根據(jù)行數(shù)做循環(huán)if sheet.row_values(i)[0] != u'case_name':#如果這個Excel的這個sheet的第i行的第一列不等于case_name那么我們把這行的數(shù)據(jù)添加到cls[]cls.append(sheet.row_values(i))return cls
if __name__ == '__main__':#我們執(zhí)行該文件測試一下是否可以正確獲取Excel中的值print(readExcel().get_xls('userCase.xlsx', 'login'))print(readExcel().get_xls('userCase.xlsx', 'login')[0][1])print(readExcel().get_xls('userCase.xlsx', 'login')[1][2])
結(jié)果為:
完全正確~?
五、Python+unittest+requests+HTMLTestRunner完整的接口自動化測試框架搭建_04——requests請求配置文件有了,讀取配置文件有了,用例有了,讀取用例有了,我們的接口服務(wù)有了,我們是不是該寫對某個接口進行http請求了,這時候我們需要使用pip install requests來安裝第三方庫,在common下configHttp.py,configHttp.py的內(nèi)容如下:
import requests
import jsonclass RunMain():def send_post(self, url, data): # 定義一個方法,傳入需要的參數(shù)url和data# 參數(shù)必須按照url、data順序傳入result = requests.post(url=url, data=data).json() # 因為這里要封裝post方法,所以這里的url和data值不能寫死res = json.dumps(result, ensure_ascii=False, sort_keys=True, indent=2)return resdef send_get(self, url, data):result = requests.get(url=url, params=data).json()res = json.dumps(result, ensure_ascii=False, sort_keys=True, indent=2)return resdef run_main(self, method, url=None, data=None): # 定義一個run_main函數(shù),通過傳過來的method來進行不同的get或post請求result = Noneif method == 'post':result = self.send_post(url, data)elif method == 'get':result = self.send_get(url, data)else:print("method值錯誤!!!")return resultif __name__ == '__main__': # 通過寫死參數(shù),來驗證我們寫的請求是否正確result1 = RunMain().run_main('post', 'http://127.0.0.1:8888/login', {'name': 'xiaoming','pwd':'111'})result2 = RunMain().run_main('get', 'http://127.0.0.1:8888/login', 'name=xiaoming&pwd=111')print(result1)print(result2)
執(zhí)行該文件,驗證結(jié)果正確性:
?
?我們發(fā)現(xiàn)和瀏覽器中進行請求該接口,得到的結(jié)果一致,說明沒有問題,一切OK
六、Python+unittest+requests+HTMLTestRunner完整的接口自動化測試框架搭建_05——參數(shù)動態(tài)化
在上一講中,我們寫了針對我們的接口服務(wù),設(shè)計的三種測試用例,使用寫死的參數(shù)(result = RunMain().run_main('post', 'http://127.0.0.1:8888/login', 'name=xiaoming&pwd='))來進行requests請求。本講中我們寫一個類,來用于分別獲取這些參數(shù),來第一講的目錄創(chuàng)建geturlParams.py,geturlParams.py文件中的內(nèi)容如下:
import readConfig as readConfigreadconfig = readConfig.ReadConfig()class geturlParams():# 定義一個方法,將從配置文件中讀取的進行拼接def get_Url(self):new_url = readconfig.get_http('scheme') + '://' + readconfig.get_http('baseurl') + ':8888' + '/login' + '?'#logger.info('new_url'+new_url)return new_urlif __name__ == '__main__':# 驗證拼接后的正確性print(geturlParams().get_Url())
通過將配置文件中的進行拼接,拼接后的結(jié)果:http://127.0.0.1:8888/login?和我們請求的一致
Python接口自動化測試零基礎(chǔ)入門到精通(2023最新版)