• 接口自动化测试之Mock


    一.Mock实现原理和实现机制

    在某些时候,后端在开发接口的时候,处理逻辑非常复杂,在测试的时候,后端在未完成接口的情况下该如何去测试呢?

    我们需要测试,但是有些请求又需要修改一下参数,或者改变一下request实现的方式,比如修改状态码,产生的图片要进行替换,或者是替换执行文件等

    1.Mock介绍

    Mock这个词在英语中有模拟的这个意思,因此我们可以猜测出这个库的主要功能是模拟一些东西。准确的说,Mock是Python中一个用于支持单元测试的库,它的主要功能是使用mock对象替代掉指定的Python对象,以达到模拟对象的行为。

    2.在项目的单元测试过程中,会遇到:

    1、接口的依赖
    2、外部接口调用
    3、测试环境非常复杂
    单元测试应该只针对当前单元进行测试, 所有的内部或外部的依赖应该是稳定的, 已经在别处进行测试过的.使用mock 就可以对外部依赖组件实现进行模拟并且替换掉, 从而使得单元测试将焦点只放在当前的单元功能。

    3.解决测试依赖

    例如,我们要测试A模块,然后A模块依赖于B模块的调用。但是,由于B模块的改变,导致了A模块返回结果的改变,从而使A模块的测试用例失败。其实,对于A模块,以及A模块的用例来说,并没有变化,不应该失败才对。
    这个时候就是mock发挥作用的时候了。通过mock模拟掉影响A模块的部分(B模块)。至于mock掉的部分(B模块)应该由其它用例来测试。

    4.例子

    import requests
    from unittest import mock
    
    def request_lemonfix():
        """
    
        :return:
        """
        res = requests.get('http://www.baidu.com')
        return res.status_code.encode('utf-8')
    
    
    if __name__ == '__main__':
        request_lemonfix = mock.Mock(return_value="我已经替换了数据")
        print(request_lemonfix())
        
    结果:
    我已经替换了数据
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    二.简单的案例实现mock

    基本功能

    # function.py
    def multiply(x, y):
    return x * y
    
    def add_and_multiply(x, y):
        addition = x + y
        multiple = multiply(x, y) # 回调函数
        return (addition, multiple)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    针对 add_and_multiply()函数编写测试用例

    import mock
    import requests
    import unittest
    
    url = "www.baidu.com/login"
    data = {
        "user_id": "001",
        "password": "caichen"
    }
    
    
    def post_request(url, data):
        """登陆百度账号"""
        res = requests.post(url, data).json()
        return res
    
    
    class TestLogin(unittest.TestCase):
        """单元测试"""
        def setUp(self) -> None:
            print("case开始执行")
    
        def tearDown(self) -> None:
            print("case执行结束")
    
        def test_01(self):
            """模拟数据判断是否正确"""
            url = "www.baidu.com/login/tieba"
            data = {
                "user_id": "001"
            }
            sucess_test = mock.Mock(return_value=data)
            post_request = sucess_test
            res = post_request
            self.assertEqual("654321", res())
            # self.assertEqual({'user_id': '001'},res())
    
    
    if __name__ == '__main__':
        unittest.main()
    
    # 错误结果
    F
    case开始执行
    ======================================================================
    case执行结束
    FAIL: test_01 (__main__.TestLogin)
    模拟数据判断是否正确
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "C:/Users/x1c/Desktop/untitled/mocktest.py", line 35, in test_01
        self.assertEqual("654321", res())
    AssertionError: '654321' != {'user_id': '001'}
    
    ----------------------------------------------------------------------
    Ran 1 test in 0.001s
    
    FAILED (failures=1)
    
    # 正常结果
    case开始执行
    .
    case执行结束
    ----------------------------------------------------------------------
    Ran 1 test in 0.000s
    
    OK
    
    • 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

    三.mock实现get数据模拟

    举个例子来说:我们有一个简单的客户端实现,用来访问一个URL,当访问正常时,需要返回状态码200,不正常时,需要返回状态码404。首先,我们的客户端代码实现如下:
    
    
    • 1
    • 2

    import requests

    def send_request(url):
    r = requests.get(url)
    return r.status_code

    def visit_ustack():
    return send_request(‘http://www.ustack.com’)

    
    # 外部模块调用visit_ustack()来访问baidu的官网。下面我们使用mock对象在单元测试中分别测试访问正常和访问不正常的情况。
    
    • 1
    • 2

    import unittest
    import mock
    import client

    class TestClient(unittest.TestCase):

    def test_success_request(self):
    success_send = mock.Mock(return_value=‘200’)
    client.send_request = success_send
    self.assertEqual(client.visit_ustack(), ‘200’)

    def test_fail_request(self):
    fail_send = mock.Mock(return_value=‘404’)
    client.send_request = fail_send
    self.assertEqual(client.visit_ustack(), ‘404’)

    1.找到要替换的对象:我们需要测试的是visit_ustack这个函数,那么我们需要替换掉send_request这个函数。
    
    2.实例化Mock类得到一个mock对象,并且设置这个mock对象的行为。在成功测试中,我们设置mock对象的返回值为字符串“200”,在失败测试中,我们设置mock对象的返回值为字符串"404"。
    
    3.使用这个mock对象替换掉我们想替换的对象。我们替换掉了client.send_request
    
    4.写测试代码。我们调用client.visit_ustack(),并且期望它的返回值和我们预设的一样。
    
    上面这个就是使用mock对象的基本步骤了。在上面的例子中我们替换了自己写的模块的对象,其实也可以替换标准库和第三方模块的对象,方法是一样的:先import进来,然后替换掉指定的对象就可以了。
    
    **四.Mock和mockrunner的区别**
    
    Mockrunner用在J2EE环境中进行应用程序的模拟测试。它不仅支持Struts actions,servlets,过滤器和标签类,还包括一个JDBC和一个JMS测试框架,可以用于测试基于EJB的应用程序。
    
    Mockrunner扩展了JUnit并模拟了必要的行为,而无需调用实际的基础结构。它不需要正在运行的应用程序服务器或数据库。此外,它不会调用web容器或Struts ActionServlet。它非常快速,使用户可以在测试的所有步骤中操纵所有涉及的类和模拟对象。它可以用于为基于J2EE的应用程序编写非常复杂的单元测试,而不会产生任何开销。Mockrunner不支持任何类型的容器内测试。
    
    Mockrunner不会读取任何配置文件,例如web.xml或struts-config.xml。您可以使用Mockrunner API指定所有参数。因此,可以将servlet,过滤器,标签和Struts动作作为可重用组件进行测试,而不管您在一个或另一个应用程序中使用的设置如何。无法测试配置文件中的定义。如果要这样做,可以将StrutsTestCase用于基于Struts的应用程序或Cactus。
    
    Mockrunner支持Java版本从1.3到1.6以及J2EE 1.3,J2EE 1.4和JavaEE5。尚不支持EJB 3.0。Mockrunner支持Struts版本1.1、1.2和1.3。
    
    下载地址:Mockrunner download | SourceForge.net
    
    1.mockrunner必须配置java环境
    2.使用命令启动:java -jar moco-runner-0.12.0-standalone.jar http -p 8801 -c config.json
    3.配置config.json文件就可以进行mock数据
    
    
    [
    {
    "response" :
      {
        "text" : "Hello, Moco"
      }
    }
    ]
        ```
    
    使用命令启动:
    java -jar moco-runner-0.12.0-standalone.jar http -p 8801 -c config.json
    访问http://localhost:8801
    就会显示 Hello, Moco
    
    • 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

    ​4.MockRunner在工作中运用 构建一个复杂的链接规则

    [
    {
    "request":{
        "uri":"/monitorApplication/alert/confirm",
        "method":"PUT",
        "text":"{\"id\":\"123\"}"
    },
    "response":{
        "status":200,
        "json":{
            "code":"0",
            "msg":"OK!",
            "data":null
        }
    }
    }
    ]
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    五.接口测试基础面试

    项目中如何做接口测试?
    通过测试工具…进行参数、请求参数、返回参数效验
    接口开发过程中如何进行case编写
    规则文档熟悉通过mock校验格式
    如何理解Mock
    模拟返回参数,模拟接口
    Mock在工作中的运行?
    帮助前端实现正常开发
    好了各位,以上就是这篇文章的全部内容了

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

    在这里插入图片描述

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

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

    点击文末小卡片领取

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

    自学推荐B站视频:

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

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

  • 相关阅读:
    14-Linux之yum软件管理
    Linux中常用的软件:Squid
    20行Python代码,轻轻松松获取各路书本,你还在花钱买着看嘛~
    图扑软件受邀亮相 IOTE 2023 国际物联网展
    百趣代谢组学资讯:慢性肾病的延缓方法有了!
    10.前端打包与nginx部署
    ffmpeg深度学习滤镜
    @Elasticsearch之企业级高可用分布式集群(es分布式架构,集群规划,分布式集群调优策略)
    各大电商平台关于预制菜品种酸菜鱼销售量
    消息中间件-RocketMQ
  • 原文地址:https://blog.csdn.net/weixin_57805858/article/details/125599673