51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 744|回复: 0
打印 上一主题 下一主题

[资料] Mock的接口自动化测试如何测?

[复制链接]
  • TA的每日心情
    擦汗
    昨天 09:05
  • 签到天数: 1048 天

    连续签到: 1 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2023-1-29 10:11:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
     1.Mock实现原理和实现机制
      在某些时候,后端在开发接口的时候,处理逻辑非常复杂,在测试的时候,后端在未完成接口的情况下该如何去测试呢?
      我们需要测试,但是有些请求又需要修改一下参数,或者改变一下request实现的方式,比如修改状态码,产生的图片要进行替换,或者是替换执行文件等
      Mock介绍
      Mock这个词在英语中有模拟的这个意思,因此我们可以猜测出这个库的主要功能是模拟一些东西。准确的说,Mock是Python中一个用于支持单元测试的库,它的主要功能是使用mock对象替代掉指定的Python对象,以达到模拟对象的行为。
      在项目的单元测试过程中,会遇到:
      1、接口的依赖
      2、外部接口调用
      3、测试环境非常复杂
      单元测试应该只针对当前单元进行测试, 所有的内部或外部的依赖应该是稳定的, 已经在别处进行测试过的.使用mock 就可以对外部依赖组件实现进行模拟并且替换掉, 从而使得单元测试将焦点只放在当前的单元功能。
      解决测试依赖
      例如,我们要测试A模块,然后A模块依赖于B模块的调用。但是,由于B模块的改变,导致了A模块返回结果的改变,从而使A模块的测试用例失败。其实,对于A模块,以及A模块的用例来说,并没有变化,不应该失败才对。
      这个时候就是mock发挥作用的时候了。通过mock模拟掉影响A模块的部分(B模块)。至于mock掉的部分(B模块)应该由其它用例来测试。
      2.简单的案例实现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)
      针对 add_and_multiply()函数编写测试用例。
    1. import mock
    2.   import requests
    3.   import unittest
    4.   url = "www.baidu.com/login"
    5.   data = {
    6.       "user_id": "001",
    7.       "password": "caichen"
    8.   }
    9.   def post_request(url, data):
    10.       """登陆百度账号"""
    11.       res = requests.post(url, data).json()
    12.       return res
    13.   class TestLogin(unittest.TestCase):
    14.       """单元测试"""
    15.       def setUp(self) -> None:
    16.           print("case开始执行")
    17.       def tearDown(self) -> None:
    18.           print("case执行结束")
    19.       def test_01(self):
    20.           """模拟数据判断是否正确"""
    21.           url = "www.baidu.com/login/tieba"
    22.           data = {
    23.               "user_id": "001"
    24.           }
    25.           sucess_test = mock.Mock(return_value=data)
    26.           post_request = sucess_test
    27.           res = post_request
    28.           self.assertEqual("654321", res())
    29.           # self.assertEqual({'user_id': '001'},res())
    30.   if __name__ == '__main__':
    31.       unittest.main()
    32.   # 错误结果
    33.   F
    34.   case开始执行
    35.   ======================================================================
    36.   case执行结束
    37.   FAIL: test_01 (__main__.TestLogin)
    38.   模拟数据判断是否正确
    39.   ----------------------------------------------------------------------
    40.   Traceback (most recent call last):
    41.     File "C:/Users/x1c/Desktop/untitled/mocktest.py", line 35, in test_01
    42.       self.assertEqual("654321", res())
    43.   AssertionError: '654321' != {'user_id': '001'}
    44.   ----------------------------------------------------------------------
    45.   Ran 1 test in 0.001s
    46.   FAILED (failures=1)
    47.   # 正常结果
    48.   case开始执行
    49.   .
    50.   case执行结束
    51.   ----------------------------------------------------------------------
    52.   Ran 1 test in 0.000s
    53.   OK
    复制代码


    3.mock实现get数据模拟
      举个例子来说:我们有一个简单的客户端实现,用来访问一个URL,当访问正常时,需要返回状态码200,不正常时,需要返回状态码404。首先,我们的客户端代码实现如下:
    1.  ```
    2.   import requests
    3.   def send_request(url):
    4.       r = requests.get(url)
    5.       return r.status_code
    6.   def visit_ustack():
    7.       return send_request('http://www.ustack.com')
    8.   ```
    9.   # 外部模块调用visit_ustack()来访问baidu的官网。下面我们使用mock对象在单元测试中分别测试访问正常和访问不正常的情况。
    10.   ```
    11.   import unittest
    12.   import mock
    13.   import client
    14.   class TestClient(unittest.TestCase):
    15.   def test_success_request(self):
    16.       success_send = mock.Mock(return_value='200')
    17.       client.send_request = success_send
    18.       self.assertEqual(client.visit_ustack(), '200')
    19.   def test_fail_request(self):
    20.       fail_send = mock.Mock(return_value='404')
    21.       client.send_request = fail_send
    22.       self.assertEqual(client.visit_ustack(), '404')
    23.      
    24.   ```
    复制代码


    1.找到要替换的对象:我们需要测试的是visit_ustack这个函数,那么我们需要替换掉send_request这个函数。
      2.实例化Mock类得到一个mock对象,并且设置这个mock对象的行为。在成功测试中,我们设置mock对象的返回值为字符串“200”,在失败测试中,我们设置mock对象的返回值为字符串"404"。
      3.使用这个mock对象替换掉我们想替换的对象。我们替换掉了client.send_request
      4.写测试代码。我们调用client.visit_ustack(),并且期望它的返回值和我们预设的一样。
      上面这个就是使用mock对象的基本步骤了。在上面的例子中我们替换了自己写的模块的对象,其实也可以替换标准库和第三方模块的对象,方法是一样的:先import进来,然后替换掉指定的对象就可以了。
      4.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
      ·mockrunner必须配置java环境
      · 使用命令启动:java -jar moco-runner-0.12.0-standalone.jar http -p 8801 -c config.json
      · 配置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
      · MockRunner在工作中运用 构建一个复杂的链接规则
      · [ { "request":{ "uri":"/monitorApplication/alert/confirm", "method":"PUT", "text":"{\"id\":\"123\"}" }, "response":{ "status":200, "json":{ "code":"0", "msg":"OK!", "data":null } } } ]
      5.接口测试基础面试
      · 项目中如何做接口测试
      · 通过测试工具...进行参数、请求参数、返回参数效验
      · 接口开发过程中如何进行case编写
      · 规则文档熟悉通过mock校验格式
      · 如何理解Mock
      · 模拟返回参数,模拟接口
      · Mock在工作中的运行?
      · 帮助前端实现正常开发



    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-19 02:40 , Processed in 0.062136 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表