Python搭建接口自動(dòng)化測試框架

環(huán)境準(zhǔn)備

  • Python 3.6 + pycharm
  • 用到的庫:requests,HTMLTestRunner塘秦,unittest
    requests:HTTP for Humans建蹄,官網(wǎng)(http://docs.python-requests.org/en/master/)解釋就是牛掰碌更,就是處理http請求的裕偿,關(guān)于http請求,可以看文章:http://www.reibang.com/p/b8f9f89d8869痛单;HTMLTestRunner運(yùn)行測試集用例并生成html測試報(bào)告击费;unittest Python單元測試框架。

開始搭框架

image.png

整個(gè)框架的結(jié)構(gòu)是這樣的桦他,很簡單但是夠清晰:

  • api_call:里面的文件是對服務(wù)端提供的接口進(jìn)行封裝蔫巩,至于為什么中間多出兩級distribute>vo2是為了對版本進(jìn)行很好的標(biāo)志和控制,v02代表我們項(xiàng)目現(xiàn)在是2.0.X 的版本快压,下面是獲取用戶token的接口封裝例子:

class GetAccessToken(Http):
def getAdminToken(self, username):
body = {
}
response = self.post("/api/v1/oauth/token", body)
return response
def getUserToken(self, phone):
body = {
}
response = self.post("/api/v1/oauth/token", body)
return response

該類繼承自Http,Http類的封裝見下文

  • cof:對公用類的封裝圆仔,host文件主要是配置host和port,http是對http常用方法及返回結(jié)果的處理蔫劣,restful文件是對restful接口返回結(jié)果的處理坪郭。
    (1)Http.py下面是對post方法的封裝

class Http():
"""
對http的常用請求方法進(jìn)行封裝
"""
def init(self):
self.host = ""
self.port = ""
# 默認(rèn)的header,內(nèi)容遵循restful接口規(guī)范要求
self.header = {
"Accept": "application/json",
"Content-Type": "application/json"
}
def post(self, url, dictData):
response = requests.post(self.host+url, data=json.dumps(dictData), headers=self.header)
res = dict()
res["request"] = "methon=post" + " " + self.host + ":" + self.port + url + " " + "body = " + json.dumps(dictData)
res["code"] = response.status_code
res["data"] = response.text
return res

init :host和port應(yīng)是從host文件取得脉幢,設(shè)置請求頭
post: 傳的參數(shù)為url和請求體歪沃,請求體的數(shù)字格式為字典,使用requests庫的post方法嫌松,將返回的數(shù)據(jù)作簡單分離處理res["request"]請求的基本信息沪曙, res["code"] = response.status_code請求返回的狀態(tài)嗎,res["data"] = response.text響應(yīng)數(shù)據(jù)萎羔。將這些分離放入一個(gè)字典里并返回字典液走。這一步的處理是為了斷言和出錯(cuò)處理,尤為重要贾陷。
(2)restful.py:restful風(fēng)格接口的返回值處理方法缘眶。對返回的狀態(tài)碼和期望的狀態(tài)碼作比較,如果不一致髓废,給出錯(cuò)誤信息(其實(shí)這部是對撞他碼的斷言)如果一致巷懈,返回正確的數(shù)據(jù),以供數(shù)據(jù)斷言慌洪,在github的代碼中注釋地很詳細(xì)顶燕,文末有地址。

  • runner:下面的HTMLTestRunner是Python的一個(gè)測試報(bào)告生成庫蒋譬,格式為html文檔割岛,這里是Python3的版本愉适,runnerTest.py是測試類:

suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(rides.rideTest))
fp = open(filename, 'wb')
runner = HTMLTestRunner.HTMLTestRunner(
stream = fp,
title ='順道嘉接口測試報(bào)告',
description = '順道嘉接口測試報(bào)告')
runner.run(suite)#執(zhí)行測試
fp.close()#關(guān)閉文件犯助,否則會無法生成文件
簡單解釋一下:第一步創(chuàng)建測試套,往測試套里添加測試集维咸,運(yùn)行剂买。生成測試文件惠爽,詳細(xì)代碼見github,里邊運(yùn)行完后可以發(fā)送測試郵件給相關(guān)人員瞬哼。

  • testcase:測試用例婚肆,直接粘代碼,因?yàn)槲覍懘a真的很愛注釋(菜鳥)

class rideTest(unittest.TestCase):
def setUp(self):
"""
測試類的構(gòu)造方法
該方法會在每個(gè)case運(yùn)行前被調(diào)用一次
"""
# 實(shí)例化接口調(diào)用對象
self.rides = rides.Rides()
self.carpool = carpool.Carpool()
# 隨機(jī)數(shù)對象
self.rnd = CoRandM.CoRand()
self.rf = CoRestful.Restful()
self.nowTime = datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S")
# 記錄創(chuàng)建資源的標(biāo)志
self.flag = 0
response_createOrder = self.rides.postPassengerOrder("88881713123", 4, 16, self.nowTime)
message = "創(chuàng)建訂單失敗"
code = 201
data_dict = self.rf.parse_response(response_createOrder, code, message)
self.ret_id = data_dict['id']
self.set_create_flag()
def set_create_flag(self):
"""
將資源創(chuàng)建標(biāo)志設(shè)置為1坐慰,表示有創(chuàng)建過資源
"""
self.flag = 1
print("創(chuàng)建資源 %s 成功" % str(self.ret_id))
def tearDown(self):
"""
測試類的析構(gòu)方法
該方法會在每個(gè)case運(yùn)行后被調(diào)用一次
"""
# 刪除服務(wù)较性,回收數(shù)據(jù)
if self.flag != 0:
response_del = self.rides.deleteRide(self.ret_id)
message = "刪除訂單失敗"
code = 204
data_dec_del = self.rf.parse_response(response_del, code, message)
self.flag = 0
print("刪除資源 %s 成功" % str(self.ret_id))

def test_fromPendingToRate_ok(self):

    driverPhone = "88889876123"
    driverID = 185
    routeID = 16
    #這里是調(diào)用api_call里面的相應(yīng)方法
    driverInlineResponse = self.carpool.makeDriverOnline(driverPhone, routeID)
   # 給出錯(cuò)誤信息和期望的狀態(tài)碼,若返回的狀態(tài)碼不合預(yù)期结胀,則測試失敗赞咙,返回錯(cuò)誤信息,若合糟港,則返回響應(yīng)數(shù)據(jù)
    message = "司機(jī)出車失敗"
    code = 201
    response_dict = self.rf.parse_response(driverInlineResponse, code, message)
    # 返回?cái)?shù)據(jù)完整性斷言
    assert_that(response_dict, has_key('id'))
    assert_that(response_dict, has_key('route_id'))
    assert_that(response_dict, has_key('status'))
    assert_that(response_dict, has_key('passengers'))
    assert_that(response_dict, has_key('fee'))
    assert_that(response_dict, has_key('route_direction'))

    # 返回?cái)?shù)據(jù)正確性斷言
    assert_that(response_dict['id'], equal_to(self.ret_id))
    assert_that(response_dict['route_id'], equal_to(routeID))
    assert_that(response_dict['status'], equal_to("accepted"))

def test_fromPendingToRate_ok(self):是一個(gè)測試用例攀操,我這里是一個(gè)訂單從創(chuàng)建到完成的用例,創(chuàng)建放在setup方法里實(shí)現(xiàn)秸抚,因?yàn)樯婕暗綌?shù)據(jù)的銷貨速和,放在測試用例里數(shù)據(jù)里,當(dāng)多個(gè)用例一起執(zhí)行時(shí)剥汤,資源沒法唯一正確標(biāo)識颠放。 def setUp(self):每個(gè)用例執(zhí)行前都會執(zhí)行該方法,可以把一些常量在該方法中初始化吭敢。def tearDown(self):每個(gè)用例執(zhí)行后都會執(zhí)行該方法慈迈,可作數(shù)據(jù)銷毀操作。
后面的ini文件是環(huán)境配置文件省有,可在此文件中選擇運(yùn)行環(huán)境痒留。
github地址https://github.com/sunsy22/apiTest
又到了搬磚的時(shí)間,點(diǎn)點(diǎn)點(diǎn)不易

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蠢沿,一起剝皮案震驚了整個(gè)濱河市伸头,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌舷蟀,老刑警劉巖恤磷,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異野宜,居然都是意外死亡扫步,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門匈子,熙熙樓的掌柜王于貴愁眉苦臉地迎上來河胎,“玉大人,你說我怎么就攤上這事虎敦∮卧溃” “怎么了政敢?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長胚迫。 經(jīng)常有香客問我喷户,道長,這世上最難降的妖魔是什么访锻? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任褪尝,我火速辦了婚禮,結(jié)果婚禮上期犬,老公的妹妹穿的比我還像新娘恼五。我一直安慰自己,他們只是感情好哭懈,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布灾馒。 她就那樣靜靜地躺著,像睡著了一般遣总。 火紅的嫁衣襯著肌膚如雪睬罗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天旭斥,我揣著相機(jī)與錄音容达,去河邊找鬼。 笑死垂券,一個(gè)胖子當(dāng)著我的面吹牛花盐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播菇爪,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼算芯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了凳宙?” 一聲冷哼從身側(cè)響起熙揍,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎氏涩,沒想到半個(gè)月后届囚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡是尖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年意系,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饺汹。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蛔添,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情作郭,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布弦疮,位于F島的核電站夹攒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏胁塞。R本人自食惡果不足惜咏尝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望啸罢。 院中可真熱鬧编检,春花似錦、人聲如沸扰才。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽衩匣。三九已至蕾总,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間琅捏,已是汗流浹背生百。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留柄延,地道東北人蚀浆。 一個(gè)月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像搜吧,于是被迫代替她去往敵國和親市俊。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理滤奈,服務(wù)發(fā)現(xiàn)秕衙,斷路器,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • 1僵刮、開啟公眾號開發(fā)者模式 公眾平臺的技術(shù)文檔目的為了簡明扼要的交代接口的使用据忘,語句難免苦澀難懂,甚至對于不同的讀者...
    good7758閱讀 1,518評論 0 1
  • 1 前言 作為一名合格的數(shù)據(jù)分析師搞糕,其完整的技術(shù)知識體系必須貫穿數(shù)據(jù)獲取勇吊、數(shù)據(jù)存儲、數(shù)據(jù)提取窍仰、數(shù)據(jù)分析汉规、數(shù)據(jù)挖掘、...
    whenif閱讀 18,072評論 45 523
  • 早上不想起來,因?yàn)樽隽藗€(gè)夢针史,很有意思晶伦,因此醒后,依然閉著眼啄枕,趁記憶未消失前婚陪,趕緊把做的夢又回想一遍,印在了腦海里频祝,...
    鋤藥兒閱讀 157評論 0 0
  • 跟什么樣的人聊天常空,才算是有質(zhì)量的聊天呢沽一? 古話說“聽君一席話,勝讀十年書”漓糙,說的是聊天對象的重要性铣缠。很多時(shí)候,一個(gè)...
    柯錦川閱讀 1,922評論 11 38