怎樣從0開始搭建一個測試框架_7
前面我們都是用的UI自動化的用例來實現的,如果我們想做接口框架怎麼辦?今天就擴展一下接口測試模塊,這裏我們需要用到requests庫(接口是HTTP類型的,其他類型也有對應的庫)
我們先在ReadMe.md中補上新加的依賴庫。然後在utils中創建一個client.py的文件,在其中創建一個HTTPClient類:
"""
添加用於接口測試的client,對於HTTP接口添加HTTPClient,發送http請求。
還可以封裝TCPClient,用來進行tcp鏈接,測試socket接口等等。
"""
import requests
from utils.log import logger
METHODS = ['GET', 'POST', 'HEAD', 'TRACE', 'PUT', 'DELETE', 'OPTIONS', 'CONNECT']
class UnSupportMethodException(Exception):
"""當傳入的method的參數不是支持的類型時拋出此異常。"""
pass
class HTTPClient(object):
"""
http請求的client。初始化時傳入url、method等,可以添加headers和cookies,但沒有auth、proxy。
>>> HTTPClient('http://www.baidu.com').send()
<Response [200]>
"""
def __init__(self, url, method='GET', headers=None, cookies=None):
"""headers: 字典。 例:headers={'Content_Type':'text/html'},cookies也是字典。"""
self.url = url
self.session = requests.session()
self.method = method.upper()
if self.method not in METHODS:
raise UnSupportMethodException('不支持的method:{0},請檢查傳入參數!'.format(self.method))
self.set_headers(headers)
self.set_cookies(cookies)
def set_headers(self, headers):
if headers:
self.session.headers.update(headers)
def set_cookies(self, cookies):
if cookies:
self.session.cookies.update(cookies)
def send(self, params=None, data=None, **kwargs):
response = self.session.request(method=self.method, url=self.url, params=params, data=data, **kwargs)
response.encoding = 'utf-8'
logger.debug('{0} {1}'.format(self.method, self.url))
logger.debug('請求成功: {0}\n{1}'.format(response, response.text))
return response
接下來寫個用例,但是我們接口的用例跟UI混在一起總是不好,所以我們可以在test下創建一個interface的目錄,裏面創建test_baidu_http.py的用例文件。
這裏你也可以在test下分成API和UI兩層,分別在其中再進行分層,看情況而定吧。
test_baidu_http.py:
import unittest
from utils.config import Config, REPORT_PATH
from utils.client import HTTPClient
from utils.log import logger
from utils.HTMLTestRunner import HTMLTestRunner
class TestBaiDuHTTP(unittest.TestCase):
URL = Config().get('URL')
def setUp(self):
self.client = HTTPClient(url=self.URL, method='GET')
def test_baidu_http(self):
res = self.client.send()
logger.debug(res.text)
self.assertIn('百度一下,你就知道', res.text)
if __name__ == '__main__':
report = REPORT_PATH + '\\report.html'
with open(report, 'wb') as f:
runner = HTMLTestRunner(f, verbosity=2, title='從0搭建測試框架 灰藍', description='接口html報告')
runner.run(TestBaiDuHTTP('test_baidu_http'))
這裏我們加了一句斷言,沒有斷言怎麼能叫用例,我們之前寫的UI用例,也可以自己動手加上斷言。
現在我們的框架既可以做UI測試,也能做接口測試了。如果你的接口類型不是HTTP的,請自己封裝對應的Client類。socket庫測TCP接口、suds庫測SOAP接口,不論你是什麼類型的接口,總能找到對應的Python庫的。
所有的代碼我都放到了GITHUB上傳送,可以自己下載去學習,有什麼好的建議或者問題,可以留言或者加我的QQ羣:455478219討論。