• 看腾讯大老如何做接口自动化测试


    一、自动化分类

    (1)接口自动化

    python/java+requests+unittest框架来实现 python/java+RF(RobotFramework)框架来实现——对于编程要求不高

    (2)Web UI功能自动化

    python/java+selenium+unittest+ddt+PO框架来实现 python/java+RFS(RobotFrameWork+Selenium)框架来实现——对于编程要求不高

    (3)App自动化

    python/java+appnium+unittes框架来实现 python/java+RF(RobotFramework)框架来实现——对于编程要求不高

    二、接口自动化与Web自动化的区别

    (1)接口自动化是没有界面的,不需要对界面元素定位操作,不需要考虑界面延迟的问题,执行效率更高 (2)接口自动化用的是requests测试库,Web自动化用的selenium测试库 (3)接口自动化的覆盖率可以达到100%(绝大部分的接口都可以实现自动化) Web自动化的覆盖率能达到80-90%算OK(可能会有某些功能是没办法实现自动化的)

    三、怎么做接口自动化

    1、流程

    A. 确定业务范围,哪些业务功能的接口可以做自动化——接口自动化的覆盖率可以达到 100%

    B. 时间进度安排,人员分配

    C. 确定自动化测试框架

    D. 准备数据——准备接口用例数据

    E. 编写接口自动化脚本

    2、搭建接口自动化测试环境

    (1)、安装python3.x——配置python的环境变量

    (2)、安装PyCharm——python开发工具

    (3)、安装测试库 Requests库—— 提供了丰富的用来发请求,对请求进行处理的API函数 xlrd,xlwt库—— 提供了对Excel文件进行操作的API函数 Pymysql库—— 提供了对Mysql数据库进行操作的API函数 paramsunittest库—— 实现参数化的库 Json库—— 提供了对Json格式的数据进行操作的API函数(python自带的基础库) Re库—— 可以使用这个库中的API函数对HMTL数据进行操作

    3、准备数据——准备接口用例数据

    我们把接口用例数据放入在Excel表格中,因为每一个接口都包含:请求地址,请求方式,请求参数,以及响应数据;所以在Excel表格中按照以下方式来组织我们的接口用例数据,包含以下几个内容: 用例名称,请求地址,请求方式,请求头,请求参数,预期结果(断言) 然后我们会封装一个函数去读取Excel数据,以参数的形式传递到脚本中,具体操作步骤如下:

    4、编写自动化测试脚本

    1、步骤:
        A、导包
    import requests
        B、组织请求参数
    url = ‘http://localhost/fw/index.php?ctl=user&act=dologin&fhash=hbUjHVrQIgHkwdMdNGnPrSiIkVBeWcrOvJpmsXgyNuMewKfKGy’
    par = {   
             ‘email’: ‘Jason’,   
             ‘user_pwd’: ‘TWlKaGRrRFJrQXJZZlFXYkh5WlNQZ2tpZkFZQlVlUUhyRE5SdndSUGdKanFDTG1LYUYlMjV1NjVCOSUyNXU3RUY0emdwMTIzNDU2JTI1dThGNkYlMjV1NEVGNg==‘,    
            ‘auto_login’: 0,   
            ‘ajax’: 1
    }
        C、发送请求
    res = requests.post(url, data=par)
    res = requests.get(url,params=par)
        D、提取响应对象中的数据,并做断言
    1、提取响应*body*内容**
         res.text     —— 如果返回的是html格式的数据,使用res.text提取`
         res.json()   —— 如果后台返回的是json格式的数据,则使用这个API函数来提取`
    2、提取响应头***
         res.headers
    3、提取状态码,响应信息
         res.status_code
         res.reason
    4、提取cookie值
         res.cookies()
    2、传递请求头
    header = {
        ‘User-Agent’: ‘Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0’,
        ‘Accept’: ‘application/xml’,
    }
    res = requests.post(url,data=par,headers=header)    
    3、传递cookie,token值
        通过请求头来传递 —— 直接从浏览器上查看cookie值,并传递到后台。
    header = {
        ‘Cookie’: ‘PHPSESSID=3724b412550a557825da5528dd6198c6’                  
    }
    res = requests.post(url,data=par,***headers=heade***r,allow_redirects=False) 
        发请求的时候通过cookies这个参数来传递
    import requests
    #1. 登录,获取cookie值
    def getCookie():
        url = ‘http://localhost/fw/index.php?ctl=user&act=dologin&fhash=hbUjHVrQIgHkwdMdNGnPrSiIkVBeWcrOvJpmsXgyNuMewKfKGy’
        par = {
            ‘email’: ‘Jason’,
            ‘user_pwd’: ‘TWlKaGRrRFJrQXJZZlFXYkh5WlNQZ2tpZkFZQlVlUUhyRE5SdndSUGdKanFDTG1LYUYlMjV1NjVCOSUyNXU3RUY0emdwMTIzNDU2JTI1dThGNkYlMjV1NEVGNg==‘,
            ‘auto_login’: 0,
            ‘ajax’: 1
        }
        res = requests.post(url, data=par)
        return res.cookies
    #2. 调用充值接口
    #2.1 获取cookie值
    cookie = getCookie()
    #2.2 发充值请求
    url = ‘http://localhost/fw/member.php?ctl=uc_money&act=incharge_done’
    par = {
        ‘check_ol_bl_pay’:’on’,
        ‘money’:1000,
        ‘bank_id’:0,
        ‘memo’:234567890,
        ‘payment’:5,
    }
    #发充值请求
    res1 = requests.post(url,data=par,cookies=cookie,allow_redirects=False)            # 自动重定向的,可以取消自动重定向
    print(res1.status_code)
    print(res1.reason)
    print(res1.headers)
        先创建一个session对象,所有请求都使用这个session对象来发送
    import requests
    #1. 发登录请求
    url = ‘http://localhost/fw/index.php?ctl=user&act=dologin&fhash=hbUjHVrQIgHkwdMdNGnPrSiIkVBeWcrOvJpmsXgyNuMewKfKGy’
    par = {
        ‘email’: ‘Jason’,
        ‘user_pwd’: ‘TWlKaGRrRFJrQXJZZlFXYkh5WlNQZ2tpZkFZQlVlUUhyRE5SdndSUGdKanFDTG1LYUYlMjV1NjVCOSUyNXU3RUY0emdwMTIzNDU2JTI1dThGNkYlMjV1NEVGNg==‘,
        ‘auto_login’: 0,
        ‘ajax’: 1
    }
    #创建一个seesion对象,后期使用这个session对象来发请求
    ses = requests.session()
    #发登录请求,返回的cookie值会自动化保存到session对象中
    response1 = ses.post(url,data=par)
    #2. 发充值请求
    url = ‘http://localhost/fw/member.php?ctl=uc_money&act=incharge_done’
    par = {
        ‘check_ol_bl_pay’:’on’,
        ‘money’:1000,
        ‘bank_id’:0,
        ‘memo’:234567890,
        ‘payment’:5,
    }
    response2 = ses.post(url,data=par,allow_redirects=False)
    print(response2.headers)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92

    5、工程管理维护与优化
    (1)、数据驱动——实现接口用例数据与脚本的分离 我们把接口用例数据放入在Excel表格中,因为每一个接口都包含:请求地址,请求方式,请求参数,以及响应数据;所以在Excel表格中按照以下方式来组织我们的接口用例数据,包含以下几个内容: 用例名称,请求地址,请求方式,请求头,请求参数,预期结果(断言) 然后我们会封装一个函数去读取Excel数据,以参数的形式传递到脚本中,具体操作步骤如下:

       安装xlrd库
        pip install xlrd
        调用xlrd库中的API函数来实现对Excel表格数据的读取
    #封装一个读取Excel表格数据的函数
    #对Excel表格数据的读取需要用到一个库——xlrd库
    import xlrd
    def get_data(filename,sheetname):
        #1. 打开Excel文件
        workbook = xlrd.open_workbook(filename)    
        #2. 打开Excel文件中的某张表
        sheet = workbook.sheet_by_name(sheetname)   
        #3. 读取表中的内容
        list = []
        for I in range(1,sheet.nrows):
            data = sheet.row_values(i)
            list.append(data)  
        return list
    if __name__==‘__main__’:
        result = get_data(‘D:\\JMeter\\1947_Project\\cxy-project02\\data\\接口用例数据.xls’,’登录’)
        print(result)
        问题解决1
    工程问题:
        1、没有安装xlrd
        2、没有把xlrd导入工程
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    (2)、unittest框架 作用:用来管理用例,加载用例,执行用例 原理:有几个核心组件 1、测试固件 setUp() 每条用例执行之前,首先会执行这个setUp()方法,在setUp()方法中完成准备初始化工作 比如:连接数据库,后期在将Web UI功能自动化的时候,可以在这里去打开浏览器,配置 tearDown() 每条用例执行完成之后,回收一些资源,比如:关闭数据库,关闭浏览器 2、测试用例 每一条用例需要实现一个用例方法,每个用例方法都必须要以test开头 3、测试套件 执行用例的时候,需要创建测试套件,把用例加入测试套件。 4、加载器 用来加载用例的,把测试用例加入测试套件中 5、执行器 用来执行测试套件中的用例的 如何使用unittest框架来编写用例

    #1. 导包
    import time
    import unittest
    import requests
    from common.excelUtils import get_data
    import paramunittest
    #读取excel表格中的数据
    list = get_data(‘D:\\JMeter\\1947_Project\\cxy-project02\\data\\接口用例数据.xls’,’登录’)
    #2. 定义一个类,去继承unittest.TestCase
    @paramunittest.parametrized(*list)                  # 引用list中的所有数据
    class FwLogin(unittest.TestCase):
        def setParameters(self,case_name,url,method,headers,params,assert_info):
            ‘’’
            有多少条用例,这个函数就会执行多少次,每执行一条用例之前先会执行这个函数,把数据提取出来。
            :param case_name:
            :param url:
            :param method:
            :param headers:
            :param params:
            :param assert_info:
            :return:
            ‘’’
            self.case_name = str(case_name)
            self.url = str(url)
            self.method = str(method)
            self.headers = str(headers)
            self.params = str(params)
            self.assert_info = str(assert_info)
        #1. 实现一个用例方法
        def test_login_case(self):
            time.sleep(5)
            #1. 组织参数
            self.headers= eval(self.headers)                # 将字符串转化为字典
            self.params = eval(self.params)
            #2. 发请求
            if self.method == ‘POST’:
                response = requests.post(self.url,data=self.params,headers=self.headers)
            else:
                response = requests.get(self.url,params=self.params,headers=self.headers)
            #3. 检查,断言
            self.check_result(response)
        def check_result(self,response):
            ‘’’
            断言  检查结果的
            :param response:
            :return:
            ‘’’
            self.assert_info = eval(self.assert_info)           #预期结果
            try:
                self.assertEqual(response.status_code,200,’响应状态码错误’)
                self.assertEqual(response.reason,’OK’,’响应的响应码错误’)
                self.assertDictEqual(response.json(),self.assert_info,’响应的正文内容不一致!’)
                print(‘%s测试用例通过!’ %self.case_name)
            except AssertionError as e:
                print(‘%s测试用例不通过!%s’ %(self.case_name,e))
     
    if __name__ == ‘__main__’:
        unittest.main()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    最后感谢每一个认真阅读我文章的人,下面这个网盘链接也是我费了几天时间整理的非常全面的,希望也能帮助到有需要的你!

    在这里插入图片描述

    这些资料,对于想转行做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。希望对大家有所帮助……

    如果你不想一个人野蛮生长,找不到系统的资料,问题得不到帮助,坚持几天便放弃的感受的话,可以点击下方小卡片加入我们群,大家可以一起讨论交流,里面会有各种软件测试资料和技术交流。

    点击文末小卡片领取

    敲字不易,如果此文章对你有帮助的话,点个赞收个藏来个关注,给作者一个鼓励。也方便你下次能够快速查找。

    自学推荐B站视频:

    零基础转行软件测试:25天从零基础转行到入职软件测试岗,今天学完,明天就业。【包括功能/接口/自动化/python自动化测试/性能/测试开发】

    自动化测试进阶:2022B站首推超详细python自动化软件测试实战教程,备战金三银四跳槽季,进阶学完暴涨20K

  • 相关阅读:
    刚关上灯准备睡时 女朋友抱着我说那个不明白 怎么办?
    sp.coo_matrix(), sp.eye()
    Vue中使用VueAMap
    VUE3 页面路由 router
    Java学习笔记(二十二)
    机器学习数学基础
    郑州中创|业绩下滑、股价大跌……Meta为何继续坚持元宇宙
    LiveNVR监控流媒体Onvif/RTSP功能-海康摄像头海康NVR通过EHOME协议ISUP协议接入支持转GB28181级联
    Java中的类和对象 (二)
    中心经纬度计算周边8宫格GeoHash编码
  • 原文地址:https://blog.csdn.net/xfw17397388089/article/details/125599415