python+requestsはapi自動化テストの枠組みを構築します.(ソース無料ダウンロード)

15326 ワード

pythonのunittestテストは、確かに便利です.しかし、どのアプリに対してもTestCaseを定義するだけでは煩わしい.それぞれのアプリに対して独自の設定をすれば、テストを自動で実行させることができます.次に、私たちはrequestsライブラリを使って自分のテストフレームを構築します.
1.まず、配置が必要なapiのリストを定義する.
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方法を定義するために必要なheader
    headers = {
        'Accept': 'application/json',
        'Content-Type': 'application/json,application/x-www-form-urlencoded'
    }
3,まずアプリ登録を行い、ログインしてからアプリを呼び出すことができます.
    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などの方法の統一伝値と呼び出しを実現する.
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の各アプリに対して、テストを行います.
def test_result(url):
        try:
            rs = url_call(url['request_method'], url['request_url'],
                          url['request_data'])
            if "404 Not Found" 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 (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、リストを巡回テストし、結果を統計します.
    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,flashkを使いますscriptはapパッケージを行い、呼び出しを行い、エラーをfailuに記録します.ログログ
#!/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
'
log_str = '\r
'
.join(result) + '\r
'
open('fail_log', 'a').write(date_str + log_str) if __name__ == "__main__": manager.run(default_command='runserver')
8,コマンドpython main.py appiでapi自動化テストを行います.下記のテスト結果が得られます.
    test_ip_urlSuccess! request_id: 13 ,url:http://127.0.0.1:5000/api/test method:GET request_data:{'command': 'true', 'Name': 'office_pooxl'}                                                       
    test_ip_urlFAIL!,  :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% 
最後に、リストを配置すれば、apiの自動化テストができ、希望のテストレポートが得られます.
*完全コードと具体的な枠组みは私の资源の中に入れて、みんなに无料で使うようにします.住所:http://download.csdn.net/detail/u010445540/9800522 requestsの書き方、unittestの書き方とページseleniumのテストを封入しました.私のgithubに入ってダウンロードしてください........