顧名思義,接口測試是對系統或組件之間的接口進行測試,主要是校驗數據的交換,傳遞和控制管理過程,以及相互邏輯依賴關係。其中接口協議分爲HTTP,WebService,Dubbo,Thrift,Socket等類型,測試類型又主要分爲功能測試,性能測試,穩定性測試,安全性測試等。
在分層測試的「金字塔」模型中,接口測試屬於第二層服務集成測試範疇。相比UI層(主要是WEB或APP)自動化測試而言,接口自動化測試收益更大,且容易實現,維護成本低,有着更高的投入產出比,是每一個公司開展自動化測試的首選。html
下面咱們以一個HTTP接口爲例,完整的介紹接口自動化測試流程:從需求分析到用例設計,從腳本編寫、測試執行到結果分析,並提供完整的用例設計及測試腳本。python
基本的接口功能自動化測試流程以下:
需求分析 -> 用例設計 -> 腳本開發 -> 測試執行 -> 結果分析git
接口名稱:豆瓣電影搜索
接口文檔地址:https://developers.douban.com/wiki/?title=movie_v2#search
接口調用示例:
1) 按演職人員搜索:https://api.douban.com/v2/movie/search?q=張藝謀
2) 按片名搜索:https://api.douban.com/v2/movie/search?q=大話西遊
3) 按類型搜索:https://api.douban.com/v2/movie/search?tag=喜劇github
需求分析是參考需求、設計等文檔,在瞭解需求的基礎上還需清楚內部的實現邏輯,而且能夠在這一階段提出需求、設計存在的不合理或遺漏之處。
如:豆瓣電影搜索接口,我理解的需求便是支持對片名,演職人員及標籤的搜索,並分頁返回搜索結果。json
用例設計是在理解接口測試需求的基礎上,使用MindManager或XMind等思惟導圖軟件編寫測試用例設計,主要內容包括參數校驗,功能校驗、業務場景校驗、安全性及性能校驗等,經常使用的用例設計方法有等價類劃分法,邊界值分析法,場景分析法,因果圖,正交表等。
針對豆瓣電影搜索接口功能測試部分,咱們主要從參數校驗,功能校驗,業務場景校驗三方面,設計測試用例以下:api
依據上面編寫的測試用例設計,咱們使用python+nosetests框架編寫了相關自動化測試腳本。能夠完整實現接口自動化測試、自動執行及郵件發送測試報告功能。安全
必要的lib庫以下,使用pip命令安裝便可:服務器
pip install nose pip install nose-htmloutput pip install requests
使用requests庫,咱們能夠很方便的編寫上述接口調用方法(如搜索q=劉德華,示例代碼以下):框架
#coding=utf-8 import requests import json url = 'https://api.douban.com/v2/movie/search' params=dict(q=u'劉德華') r = requests.get(url, params=params) print 'Search Params:\n', json.dumps(params, ensure_ascii=False) print 'Search Response:\n', json.dumps(r.json(), ensure_ascii=False, indent=4)
在實際編寫自動化測試腳本時,咱們須要進行一些封裝。以下代碼中咱們對豆瓣電影搜索接口進行了封裝,test_q方法只需使用nosetests提供的yield方法便可很方便的循環執行列表qs中每個測試集:性能
class test_doubanSearch(object): @staticmethod def search(params, expectNum=None): url = 'https://api.douban.com/v2/movie/search' r = requests.get(url, params=params) print 'Search Params:\n', json.dumps(params, ensure_ascii=False) print 'Search Response:\n', json.dumps(r.json(), ensure_ascii=False, indent=4) def test_q(self): # 校驗搜索條件 q qs = [u'白夜追兇', u'大話西遊', u'周星馳', u'張藝謀', u'周星馳,吳孟達', u'張藝謀,鞏俐', u'周星馳,大話西遊', u'白夜追兇,潘粵明'] for q in qs: params = dict(q=q) f = partial(test_doubanSearch.search, params) f.description = json.dumps(params, ensure_ascii=False).encode('utf-8') yield (f,)
咱們按照測試用例設計,依次編寫每一個功能的自動化測試腳本便可。
在手工測試接口的時候,咱們須要經過接口返回的結果判斷本次測試是否經過,自動化測試也是如此。
對於本次的接口,咱們搜索「q=劉德華」,咱們須要判斷返回的結果中是否含有「演職人員劉德華或片名劉德華」,搜索「tag=喜劇」時,須要判斷返回的結果中電影類型是否爲「喜劇」,結果分頁時須要校驗返回的結果數是否正確等。完整結果校驗代碼以下:
class check_response(): @staticmethod def check_result(response, params, expectNum=None): # 因爲搜索結果存在模糊匹配的狀況,這裏簡單處理只校驗第一個返回結果的正確性 if expectNum is not None: # 指望結果數目不爲None時,只判斷返回結果數目 eq_(expectNum, len(response['subjects']), '{0}!={1}'.format(expectNum, len(response['subjects']))) else: if not response['subjects']: # 結果爲空,直接返回失敗 assert False else: # 結果不爲空,校驗第一個結果 subject = response['subjects'][0] # 先校驗搜索條件tag if params.get('tag'): for word in params['tag'].split(','): genres = subject['genres'] ok_(word in genres, 'Check {0} failed!'.format(word.encode('utf-8'))) # 再校驗搜索條件q elif params.get('q'): # 依次判斷片名,導演或演員中是否含有搜索詞,任意一個含有則返回成功 for word in params['q'].split(','): title = [subject['title']] casts = [i['name'] for i in subject['casts']] directors = [i['name'] for i in subject['directors']] total = title + casts + directors ok_(any(word.lower() in i.lower() for i in total), 'Check {0} failed!'.format(word.encode('utf-8'))) @staticmethod def check_pageSize(response): # 判斷分頁結果數目是否正確 count = response.get('count') start = response.get('start') total = response.get('total') diff = total - start if diff >= count: expectPageSize = count elif count > diff > 0: expectPageSize = diff else: expectPageSize = 0 eq_(expectPageSize, len(response['subjects']), '{0}!={1}'.format(expectPageSize, len(response['subjects'])))
對於上述測試腳本,咱們使用nosetests命令能夠方便的運行自動化測試,並使用插件生成html格式測試報告。
運行命令以下:
nosetests -v test_doubanSearch.py:test_doubanSearch --with-html --html-file=TestReport.html
測試完成以後,咱們可使用smtplib模塊提供的方法發送html格式測試報告。基本流程是讀取測試報告 -> 添加郵件內容及附件 -> 鏈接郵件服務器 -> 發送郵件 -> 退出,示例代碼以下:
import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart def send_mail(): # 讀取測試報告內容 with open(report_file, 'r') as f: content = f.read().decode('utf-8') msg = MIMEMultipart('mixed') # 添加郵件內容 msg_html = MIMEText(content, 'html', 'utf-8') msg.attach(msg_html) # 添加附件 msg_attachment = MIMEText(content, 'html', 'utf-8') msg_attachment["Content-Disposition"] = 'attachment; filename="{0}"'.format(report_file) msg.attach(msg_attachment) msg['Subject'] = mail_subjet msg['From'] = mail_user msg['To'] = ';'.join(mail_to) try: # 鏈接郵件服務器 s = smtplib.SMTP(mail_host, 25) # 登錄 s.login(mail_user, mail_pwd) # 發送郵件 s.sendmail(mail_user, mail_to, msg.as_string()) # 退出 s.quit() except Exception as e: print "Exceptioin ", e
打開nosetests運行完成後生成的測試報告,能夠看出本次測試共執行了51條測試用例,50條成功,1條失敗。
失敗的用例能夠看到傳入的參數是:{"count": -10, "tag": "喜劇"},此時返回的結果數與咱們的指望結果不一致(count爲負數時,指望結果是接口報錯或使用默認值20,但實際返回的結果數目是189。趕忙去給豆瓣提bug啦- -)
豆瓣電影搜索接口的完整自動化測試腳本,我已上傳到的GitHub。下載地址:https://github.com/lovesoo/test_demo/tree/master/test_douban
下載完成以後,在當前腳本目錄下,使用以下命令便可進行完整的接口自動化測試並使用郵件發送最終測試報告(執行命令以前,別忘了修改腳本中郵件發件人及收件人信息爲你本身的實際信息):
python test_doubanSearch.py
最終發送測試報告郵件,截圖以下:
1) requests: http://cn.python-requests.org/zh_CN/latest/
2) nosetests: http://nose.readthedocs.io/en/latest/testing.html
3) nose-html-reporting: https://pypi.python.org/pypi/nose-html-reporting
獲取更多信息,歡迎加入軟件測試學習羣:747981058