• python+requests 搭建api自动化测试框架


    python中的unittest测试,确实很方便。但是只对每个api都要定义TestCase,这就很繁琐。
    那要是针对每个api,做单独的配置,让测试自动运行就方便很多。
    下面,我们用requests库来搭建自己的测试框架。

    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方法需要的header

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

    3,先进行api登录,登录之后才可以对api进行调用

     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的每一个api,进行测试 

    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进行遍历测试,并对结果进行统计

     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())) + '
    '
                log_str = '
    '.join(result) + '
    '
                open('fail_log', 'a').write(date_str + log_str)
    
        if __name__ == "__main__":
            manager.run(default_command='runserver')
    

      

    8,用命令python main.py api 进行api自动化测试,可以得到如下测试结果

       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自动化、接口、框架搭建学习资料!技术大牛解惑答疑,同行一起交流。

      

      

      

  • 相关阅读:
    《Effective Java》第16条:要在仅有类中使用访问方法而非公有域
    leetcode 769. Max Chunks To Make Sorted 最多能完成排序的块(中等)
    leetcode 240. Search a 2D Matrix II 搜索二维矩阵 II(中等)
    leetcode 232. Implement Queue using Stacks 用栈实现队列(简单)
    leetcode 23. Merge k Sorted Lists 合并K个升序链表(困难)
    《Effective Java》第9条:trywithresources优先于tryfinally
    leetcode 48. Rotate Image 旋转图像(Medium)
    leetcode 155. Min Stack最小栈(中等)
    leetcode 739. Daily Temperatures 每日温度(中等)
    leetcode 20. Valid Parentheses 有效的括号(中等)
  • 原文地址:https://www.cnblogs.com/www642830685/p/13568295.html
Copyright © 2020-2023  润新知