01
變量提取和引用

變量提取和引用主要是為了解決接口之間的參數(shù)依賴問題。
使用場景:接口 A 的參數(shù)中需要使用接口 B 返回的某個(gè)數(shù)據(jù),那么就要在請求 B 接口之后,提取數(shù)據(jù)保存,給請求 A 接口時(shí)使用。
1
變量提取
在用例集或用例數(shù)據(jù)中,通過 extract 字段指定要提取的變量。
語法:
"extract": {
? "變量名": ("變量保存的級別", "提取方式", "提取表達(dá)式"),
}
變量名:
保存數(shù)據(jù)的變量名
變量保存的級別:
EVN: 全局變量,settings 文件中的 EVN
env : 為局部變量(只對當(dāng)前用例集有效):用例集的 env 字段
提取方式:
re: 正則表達(dá)式提取
jsonpath: 通過 jsonpath 提取
案例:
"extract": {
# 通過jsonpath提取"token": ("env", "jsonpath", "$..token"),
# 通過正則表達(dá)式提取'member_id': ("env", "re", r'"id":(.+?),')
}
2
變量引用
變量引用表達(dá)式:
$}
引用優(yōu)先級:
優(yōu)先引用該用例的局部變量(用例的 env 中的變量),如果局部變量不存在,則會引用全局變量(setting.py 中 ENV 中保存的變量)。
02
用例斷言
關(guān)于測試用例預(yù)期結(jié)果和實(shí)際結(jié)果的比對的,apin 中封裝了一個(gè) verification 字段,只需要在 verification 中定義預(yù)期結(jié)果,實(shí)際結(jié)果提取表達(dá)式,和斷言的方法,即可實(shí)現(xiàn)用例的斷言!
1
基本語法
verification = [
[斷言方式, 預(yù)期結(jié)果, 實(shí)際結(jié)果]
]
2
斷言方式
apin 中目前支持兩種斷言方式:
斷言相等 :eq
預(yù)期結(jié)果和實(shí)際結(jié)果相等
verification = [
['eq', 預(yù)期結(jié)果, 實(shí)際結(jié)果]
]
斷言包含:contains
實(shí)際結(jié)果中包含預(yù)期結(jié)果的內(nèi)容
verification = [
['contains', 預(yù)期結(jié)果, 實(shí)際結(jié)果]
]
3
實(shí)際結(jié)果獲取
關(guān)于斷言的實(shí)際結(jié)果提取,需要使用V{{表達(dá)式}} 來進(jìn)行提取,表達(dá)式支持 jsonpath 和正則表達(dá)式兩種提取方式方式。
正則表達(dá)式提取
# 通過正則表達(dá)式來提取實(shí)際結(jié)果中的msg字段。
verification = [
[
'eq', {'msg':"OK"}, {"msg": "V{{msg:'(.+?)'}}"}]
]
通過 jsonpath 提取
# 通過jsonpath來提取實(shí)際結(jié)果中的msg字段。
verification = [
[
'eq', {'msg':"OK"}, {"msg": 'V{{$..msg}}']
]
4
HTTP 狀態(tài)碼的斷言
上述兩種方式,已可提取結(jié)果返回的數(shù)據(jù),那如果要斷言接口http請求的狀態(tài)碼呢?
apin中也提供了一個(gè)內(nèi)置的字段名,來表示http狀態(tài)碼。
# 斷言接口請求的http狀態(tài)碼是否等于200verification= [
[
'eq', 200, 'status_code']
]
03
函數(shù)工具的使用
apin 支持在測試用例中調(diào)用自定義的函數(shù)來處理數(shù)據(jù),如對數(shù)據(jù)進(jìn)行加密處理、隨機(jī)生成數(shù)據(jù)等等。
1
自定義函數(shù)
apin 創(chuàng)建的項(xiàng)目中有一個(gè) funcTools.py,在該文件中可以自己定義函數(shù),然后在用例中通過 F{xxx()}來調(diào)用。
案例:funcTools.py 文件
importhashlib,random
def md5_encrypt(msg):
"""md5加密"""
md5 = hashlib.md5()
md5.update(msg.encode(
"utf8"))
returnmd5.hexdigest()
def rand_phone():
"""隨機(jī)生成手機(jī)號的函數(shù)"""importrandom
for i in range(8):
phone += str(random.randint(
0, 9))
returnstr(phone)
def get_timestamp():
"""獲取時(shí)間戳"""return time.time()
注意點(diǎn):函數(shù)處理完的數(shù)據(jù)需要 return 返回哦
2
用例中引用函數(shù)
引用表達(dá)式:F
demo1:用例數(shù)據(jù)中的 user,引用前面定義的 rand_phone 函數(shù)
{
? ? 'title': "普通用戶注冊",
? ? 'interface': "member/register",
? ? "method": "post",
? ? 'json': {"user": "F{rand_phone()}", "pwd": "lemon123"},
}
demo2:用例數(shù)據(jù)中的 pwd,引用前面定義的 md5_encrypt 函數(shù)對密碼進(jìn)行 md 加密
注意點(diǎn):引用的函數(shù),傳遞的參數(shù)如果是變量,則不需要在變量應(yīng)用表達(dá)式外加引號
{
'title': "普通用戶登錄",
'interface': "member/login",
"method": "post",
'json': {"user": "13109877890", "pwd": "F{md5_encrypt('lemon123')}"},
}
# 引用函數(shù),變量作為參數(shù)傳遞
{
'title': "普通用戶登錄",
'interface': "member/login",
"method": "post",
'json': {"user": "${{user}}", "pwd": "F{md5_encrypt(${{pwd}})}"},
}
04
項(xiàng)目全局配置
項(xiàng)目中的 setting.py 文件,是整個(gè)項(xiàng)目的配置文件,接下來詳細(xì)介紹一下項(xiàng)目的配置選項(xiàng)。
1
debug 模式運(yùn)行
項(xiàng)目創(chuàng)建之后,默認(rèn)運(yùn)行是開啟了 debug 模式,運(yùn)行過程中會輸出詳細(xì)的 debug 級別日志。
如果不像看運(yùn)行日志,則將 settings 中的 DEBUG 設(shè)置為 Flase 即可。
# 是否開啟debug模式:True為debug模式,F(xiàn)alse為關(guān)閉debug模式DEBUG = False
2
ENV 全局的變量
將 settings.py 中的 ENV 可以設(shè)置項(xiàng)目全局配置
全局的域名
推薦在 ENV 中設(shè)置全局的 host,不建議在每一個(gè)測試用例中去設(shè)置 host,切換測試環(huán)境切換也更方便(如果用例數(shù)據(jù)中沒有自己定義 host,會自動引用全局的 host 地址)。
ENV = {
"host":"http://WWW.XXX.com/",
}
全局的請求頭
如果項(xiàng)目接口有必傳的請求頭數(shù)據(jù),也可以直接在 ENV 中設(shè)置(如果用例數(shù)據(jù)中沒有定義時(shí),也會自動引用全局的 headers)。
ENV = {
"host":"http://WWW.XXX.com/",
"headers": {"UserAgent": "apin-test01"}
}
全局的測試數(shù)據(jù)
如果用例中需要引用事先準(zhǔn)備好的一些測試數(shù)據(jù),如測試賬號、密碼之類的
如:定義一個(gè)測試賬號、測試密碼、用戶 id
ENV = {
? ? "host":"http://WWW.XXX.com/",
? ? "headers": {"UserAgent": "apin-test01"},
? ? "user":"musen@qq.com",
? ? "pwd":"lemon123",
? ? "user_id":111
}
測試用例中直接使用 ${{}} 即可引用,
# 引用user和pwd
{
'title': "登錄",
'interface': "member/register",
"method": "post",
'json': {"mobile_phone": "${{user}}", "pwd": "${{pwd}}"},
}
注意點(diǎn):如果局部環(huán)境和全局變量重名,優(yōu)先引用局部變量。
3
測試報(bào)告
通過setting中的TEST_RESULT,可以配置測試報(bào)告的輸出信息。
TEST_RESULT = {
# 測試報(bào)告文件名"filename": "report.html",
# 測試人員"tester": "測試員",
# 報(bào)告標(biāo)題"title": "測試報(bào)告",
# 報(bào)告樣式 :有1,2,三個(gè)樣式"templates": 1,
# 報(bào)告描述信息"desc": "XX項(xiàng)目測試生成的報(bào)告"
}
4
郵件推送測試結(jié)果
如果要將測試結(jié)果發(fā)送到指定的郵箱中,則在 settings.py 添加 EMAIL 配置即可。
EMAIL = {
# smtp服務(wù)器地址"host": 'smtp.qq.com',
# smtp服務(wù)器端口"port": 465,
# 郵箱賬號"user": "xxxx@qq.com",
# smtps授權(quán)碼"password": "xxxx",
# 收件人列表"to_addrs": ['xxx@qq.com','xxx@qq.com'],
# 是否發(fā)送附件"is_file": True
}
5
測試結(jié)果推送到釘釘群
如果要將測試結(jié)果推送到釘釘群,則在 settings.py 添加 DINGTALK 配置即可。
DINGTALK = {
# 釘釘機(jī)器人的Webhook地址"url": "",
# 如果釘釘機(jī)器人安全設(shè)置了關(guān)鍵字,則需要傳入對應(yīng)的關(guān)鍵字"key": None,
# 如果釘釘機(jī)器人安全設(shè)置了簽名,則需要傳入對應(yīng)的密鑰"secret": None,
# 釘釘群中要@人的手機(jī)號列表,如:[137xxx,188xxx]"atMobiles": [],
# 是否@所有人"isatall": False
}
6
測試結(jié)果推送到企業(yè)微信群
如果要將測試結(jié)果推送到企業(yè)微信群,則在 settings.py 添加 WECHAT 配置即可。
WECHAT = {
# 企業(yè)微信群ID"chatid": "",
# 調(diào)用企業(yè)微信API接口的憑證"access_token": ""
}