怎樣從0開始搭建一個測試框架_7——接口

怎樣從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討論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章