接口自動化你必須知道的高級技巧——接口自動化神器apin進(jìn)階操作

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": ""

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容