python+requests 搭建api自動化測試框架

python中的unittest測試,確實很方便。可是隻對每一個api都要定義TestCase,這就很繁瑣。
那要是針對每一個api,作單獨的配置,讓測試自動運行就方便不少。
下面,咱們用requests庫來搭建本身的測試框架。python

1.首先,定義須要配置的api的list。面試

 

url_prex='http://127.0.0.1:5000'

    [{'request_id': 1,
         'request_name': 'api_url',
         'request_method': 'GET',#或者是post,put之類的
         'request_url': url_prex + '/api/test',
         'request_data': None,
         'respone_status_code': 200,
         'respone_data': "success"
         },
        {'request_id': 2,
         'request_name': 'api_url',
         'request_method': 'POST',#或者是post,put之類的
         'request_url': url_prex + '/api/test',
         'request_data': {'name':'testname'},
         'respone_status_code': 200,
         'respone_data': "success"
         },
    ]

 

  

2.定義post方法須要的headerjson

 

 headers = {
        'Accept': 'application/json',
        'Content-Type': 'application/json,application/x-www-form-urlencoded'
    }

 

 

3,先進行api登陸,登陸以後才能夠對api進行調用flask

 req = requests.session()
    req.get('http://127.0.0.1:5000/auth/login',
            data={'userName': 'admin', 'password': "admin"})

    url_prex = 'http://99.1.15.23:8080'

  

4.封裝requests的方法,實現單一的get,post,delete,put等方法的統一傳值和調用。api

def url_call(method, url, data):
        try:
            if not method or method.upper() == 'GET':
                response = req.request('GET',
                                       url,
                                       params=data)
            else:
                response = req.request(method,
                                       url,
                                       headers=headers,
                                       data=data)
        except Exception as e:
            raise e
        return response

 

 

5,針對list的每個api,進行測試 session

 

def test_result(url):
        try:
            rs = url_call(url['request_method'], url['request_url'],
                          url['request_data'])
            if "<title>404 Not Found</title>" in rs.text:
                return u'%s 測試結果爲: %s!,緣由:request_url 地址錯誤! request_id: %s,url:%s method:%s request_data:%s' % (
                    url['request_name'], 'FAIL', url['request_id'],
                    url['request_url'], url['request_method'],
                    change_request_data_str(url['request_data'])), False
            if "Traceback <em>(most recent call last)" in rs.text:
                return u'%s 測試結果爲: %s!,緣由:被調用的api發生了Exception! request_id: %s,url:%s method:%s request_data:%s' % (
                    url['request_name'], 'Api Exception', url['request_id'],
                    url['request_url'], url['request_method'],
                    change_request_data_str(url['request_data'])), False
            if url['respone_status_code'] and rs.status_code != url[
                'respone_status_code']:
                return u'%s 測試結果爲: %s!,緣由:status_code不一致! request_id: %s, url:%s method:%s request_data:%s' % (
                    url['request_name'], 'FAIL', url['request_id'],
                    url['request_url'], url['request_method'],
                    change_request_data_str(url['request_data'])), False
            if url['respone_data'] and url['respone_data'] not in rs.text:
                return u'%s 測試結果爲: %s!,緣由:期待的數據不在結果中! request_id: %s ,url:%s method:%s request_data:%s' % (
                    url['request_name'], 'FAIL', url['request_id'],
                    url['request_url'], url['request_method'],
                    change_request_data_str(url['request_data'])), False
        except Exception as e:
            return u'%s 測試結果爲: %s!,緣由:測試程序發生了內部錯誤,%s! request_id: %s ,url:%s method:%s request_data:%s' % (
                url['request_name'], 'FAIL', e.__str__(), url['request_id'],
                url['request_url'], url['request_method'],
                change_request_data_str(url['request_data'])), False
        return u'%s 測試結果爲: %s! request_id: %s ,url:%s method:%s request_data:%s' % (
            url['request_name'], 'Success', url['request_id'], url['request_url'],
            url['request_method'],
            change_request_data_str(url['request_data'])), True

 

 

6,對list進行遍歷測試,並對結果進行統計app

 

 def url_test():
        result_false_list = []
        begin_time = time.time()
        for url in url_map:
            result_str, result_status = test_result(url)
            print result_str
            if not result_status:
                result_false_list.append(result_str)
        percent = float(
            url_map.__len__() - result_false_list.__len__()) * 100 / float(
            url_map.__len__())
        print u"總用時:%s ,測試總數:%s,失敗個數:%s,測試成功率爲:%.2f%%" % (
            time.time() - begin_time, url_map.__len__(),
            result_false_list.__len__(), percent)
        return result_false_list

 

 

7,用flask_script進行app封裝,和調用,並把錯誤記錄到fail_log日誌框架

 

#!/usr/bin/env python
    # -*- coding: UTF-8 -*-

    import sys

    from flask import Flask
    from flask_script import Manager

    reload(sys)
    sys.setdefaultencoding('utf-8')

    app = Flask(__name__)
    manager = Manager(app)

    @manager.command
    def api():
        from tests.api.requests_help import url_test
        result = url_test()
        if result:
            import time
            date_str = time.strftime('%Y-%m-%d %H:%M:%S',
                                     time.localtime(time.time())) + '\r\n'
            log_str = '\r\n'.join(result) + '\r\n'
            open('fail_log', 'a').write(date_str + log_str)

    if __name__ == "__main__":
        manager.run(default_command='runserver')

 

  

8,用命令python main.py api 進行api自動化測試,能夠獲得以下測試結果post

 

   test_ip_url 測試結果爲: Success! request_id: 13 ,url:http://127.0.0.1:5000/api/test method:GET request_data:{'command': 'true', 'Name': 'office_pooxl'}                                                       
    test_ip_url 測試結果爲: FAIL!,緣由:status_code不一致! request_id: 14, url:http://127.0.0.1:5000/api/test/name method:GET request_data:{'virtualName': 'NameServer', 'ip': '110.65.139.196'} 

    總用時:24.8880000114 ,測試總數:2,失敗個數:1,測試成功率爲:50.00% 

 

  

 點贊關注~~加入咱們,瞭解更多,642830685,免費領取最新軟件測試大廠面試資料和Python自動化、接口、框架搭建學習資料!技術大牛解惑答疑,同行一塊兒交流。學習

  

相關文章
相關標籤/搜索