zoukankan      html  css  js  c++  java
  • pytest中mock的使用

    mock安装 

      pip install pytest-mock

    mock使用

    pytest中使用无需导入,只需要导入pytest就可使用,它提供了一个名为mocker的fixture。使用方法:

    def test(mocker):
        mocker.patch()
        ****
    

    mock作用

    1、解决接口依赖:当我们要测试一个接口,而这个接口所依赖的接口还没开发或者没开发完。这时候可以使用mock模拟所依赖的接口完成测试 。

    2、单元测试:当我们所要测试的接口还未开发完,而我们还要完成测试用例代码的编写,我们可以先模拟这个接口进行测试。

    3、调用第三方接口:当我们的接口需要调用第三方,而第三方接口我们还未得到权限或未购买时,可使用mock模拟进行测试。

    4、前后端联调:当前端需要的接口后端还在开发,就可以使用mock模拟后端返回我们需要的数据。

    mock实例

    比如现在有这样一个场景,我们测试三网认证,而认证需要调用第三方聚合的接口,第三方认证接口还未购买。就可以使用mock先模拟测试。

    接口:

    '''
    Code description:实名认证
    Create time:2020-10-30
    Developer:叶修
    '''
    import requests
    
    class Api_Person_Auth(object):
            #第三方认证接口
        def api_person_auth(self,real_name,id_card,mobile):
            url = 'http://v.juhe.cn/telecom/query'#第三方认证接口
            body = {
                    "real_name":real_name,
                    "id_card":id_card,
                    "mobile":mobile
            }
            r = requests.post(url, json=body)#请求第三方认证接口
            #print(r.text)
            return r #返回信息
    
            #我们的认证接口
        def api_my_auth(self,real_name,id_card,mobile):
            #调用第三方认证接口
            response = self.api_person_auth(real_name,id_card,mobile)
            try:
                if response['resultcode'] == '100':
                    return '认证成功'
                elif response['resultcode'] == '101':
                    return '认证失败'
                elif response['resultcode'] == "102":
                    return '有必填参数为空'
                else:
                    return '未定义错误'
            except Exception:
                return '系统异常'
    
    
    if __name__ == '__main__':
       Api_Person_Auth().api_person_auth()

    接口是聚合三网认证接口,没有key的情况下,是不会调用成功的。

    测试用例:

    '''
    Code description: 实名认证
    Create time: 2020/10/30
    Developer: 叶修
    '''
    import sys
    import allure
    import pytest
    from common.logger import Log
    from common.read_yaml import ReadYaml
    from api.api_person_auth.api_person_auth import Api_Person_Auth
    testdata = ReadYaml("person_auth.yml").get_yaml_data()#读取参数化的数据
    
    @allure.feature('实名认证')
    class Test_person_Auth(object):
        log = Log()
        @allure.title('实名认证')
        #使用parametrize参数化请求参数、状态码和返回信息
        @pytest.mark.parametrize('real_name,id_card,mobile,expect', testdata['person_auth'],
                                 ids=['正确传入参数',
                                      '全部参数为空',
                                      '姓名为空',
                                      '姓名错误'])
        def test_person_auth(self, mocker,real_name, id_card, mobile, expect):
            self.log.info('%s,%s' % ((sys._getframe().f_code.co_name, '------认证接口-----')))
            shili = Api_Person_Auth()  # 实例化
            #方法一
            shili.api_person_auth = mocker.patch.object(Api_Person_Auth,'api_person_auth',
                                                        return_value={'resultcode': expect['resultcode']})#引用参数化状态码
            #当传入side_effect时,return_value就会失效,当调用真实的认证方法时,就会使用真实的认证方法,从而达到真实的测试如下:
            # shili.api_person_auth = mocker.patch.object(Api_Person_Auth, 'api_person_auth',
            #                                             return_value={'resultcode': code},side_effect=shili.api_person_auth)
            #方法二
            # mocker.patch第一个参数传模拟对象的具体路径api.api_person_auth.api_person_auth.Api_Person_Auth.api_person_auth
            # shili.api_person_auth = mocker.patch('api.api_person_auth.api_person_auth.Api_Person_Auth.'
            #         'api_person_auth', 'api_person_auth',return_value={'resultcode': '100'})
            #加入side_effect参数,代码稍作修改,要调用真实认证方法
            #msg = shili.api_person_auth(real_name,id_card,mobile)
            #不加入side_effect参数,调用自写的认证方法
            msg = shili.api_my_auth(real_name,id_card,mobile)
            #加入side_effect参数,真实情况下返回msg.json()
            #self.log.info('%s:%s' % ((sys._getframe().f_code.co_name, '获取请求结果:%s' % msg.json())))
            #不加入side_effect参数,模拟情况下直接返回msg
            self.log.info('%s:%s' % ((sys._getframe().f_code.co_name, '获取请求结果:%s' % msg)))
            # 模拟情况下断言
            assert msg == expect['resultmsg']#断言响应信息

    测试数据:

    person_auth:
      -  ['测试','371523199805170016','17854319777',{'resultcode':'100','resultmsg':'认证成功'}]
      -  ['','','',{'resultcode':'102','resultmsg':'有必填参数为空'}]
      -  ['','371523199805170016','17854319777',{'resultcode':'102','resultmsg':'有必填参数为空'}]
      -  ['测试呀','371523199805170016','17854319777',{'resultcode':'101','resultmsg':'认证失败'}]

    测试结果:

    2020-10-30 16:02:10,930 - root - INFO - test_person_auth,------认证接口-----
    2020-10-30 16:02:10,931 - root - INFO - test_person_auth:获取请求结果:认证成功
    2020-10-30 16:02:10,933 - root - INFO - test_person_auth,------认证接口-----
    2020-10-30 16:02:10,933 - root - INFO - test_person_auth:获取请求结果:有必填参数为空
    PASSEDPASSEDPASSED2020-10-30 16:02:10,935 - root - INFO - test_person_auth,------认证接口-----
    2020-10-30 16:02:10,936 - root - INFO - test_person_auth:获取请求结果:有必填参数为空
    2020-10-30 16:02:10,938 - root - INFO - test_person_auth,------认证接口-----
    2020-10-30 16:02:10,939 - root - INFO - test_person_auth:获取请求结果:认证失败
    PASSED

    总结

    mock的基本使用在用例中已经介绍了,这里就不多解释了。工作中具体的使用需要大家实际中磨练。

  • 相关阅读:
    复习一下 .Net: delegate(委托)、event(事件) 的基础知识,从头到尾实现事件!
    雕虫小技: 给枯燥的 .Net 控制台程序(字符界面)来点儿心跳 (关于退格 '\b' 的使用)
    .Net Remoting 事件回调 Client 函数方法完整实例: C# 实现控制台网络聊天室 (Console Remoting ChatRoom)
    一气呵成得到 MSSQL DB 中所有表的字段默认值约束的 DDL SQL 脚本
    根据数据生成 INSERT INTO ... 的 SQL (.Net C#, TSQL Store Procedure 分别实现)
    .Net/C# 与 J2EE/Java Web Service 互操作完整实例
    TSQL: 关于 Varbinary(Hex,Int) 与 Varchar(HexString) 之间的(数据类型)转换
    Linux零碎记录之ulimit【堆栈大小、stack size、进程数限制、文件句柄限制、linux用户空间限制】
    svn之svn:ignore命令行设置
    C语言零碎记录之extern
  • 原文地址:https://www.cnblogs.com/MrqiuS/p/13902209.html
Copyright © 2011-2022 走看看