• 接口自动化测试之Mock


    软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程,刷完面试就稳了,你也可以当高薪软件测试工程师(自动化测试)

    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模块)应该由其它用例来测试。

    例子

    1. import requests
    2. from unittest import mock
    3. def request_lemonfix():
    4. """
    5. :return:
    6. """
    7. res = requests.get('http://www.baidu.com')
    8. return res.status_code.encode('utf-8')
    9. if __name__ == '__main__':
    10. request_lemonfix = mock.Mock(return_value="我已经替换了数据")
    11. print(request_lemonfix())
    12. 结果:
    13. 我已经替换了数据
    14. ```
    2.简单的案例实现mock
    • 基本功能
    1. # function.py
    2. def multiply(x, y):
    3. return x * y
    4. def add_and_multiply(x, y):
    5. addition = x + y
    6. multiple = multiply(x, y) # 回调函数
    7. 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数据模拟
    1. 举个例子来说:我们有一个简单的客户端实现,用来访问一个URL,当访问正常时,需要返回状态码200,不正常时,需要返回状态码404。首先,我们的客户端代码实现如下:
    2. ```
    3. import requests
    4. def send_request(url):
    5. r = requests.get(url)
    6. return r.status_code
    7. def visit_ustack():
    8. return send_request('http://www.ustack.com')
    9. ```
    10. # 外部模块调用visit_ustack()来访问baidu的官网。下面我们使用mock对象在单元测试中分别测试访问正常和访问不正常的情况。
    11. ```
    12. import unittest
    13. import mock
    14. import client
    15. class TestClient(unittest.TestCase):
    16. def test_success_request(self):
    17. success_send = mock.Mock(return_value='200')
    18. client.send_request = success_send
    19. self.assertEqual(client.visit_ustack(), '200')
    20. def test_fail_request(self):
    21. fail_send = mock.Mock(return_value='404')
    22. client.send_request = fail_send
    23. self.assertEqual(client.visit_ustack(), '404')
    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数据

    1. [
    2. {
    3. "response" :
    4. {
    5. "text" : "Hello, Moco"
    6. }
    7. }
    8. ]
    9. ```
    10. 使用命令启动:
    11. java -jar moco-runner-0.12.0-standalone.jar http -p 8801 -c config.json
    12. 访问http://localhost:8801
    13. 就会显示 Hello, Moco

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

    1. [
    2. {
    3. "request":{
    4. "uri":"/monitorApplication/alert/confirm",
    5. "method":"PUT",
    6. "text":"{\"id\":\"123\"}"
    7. },
    8. "response":{
    9. "status":200,
    10. "json":{
    11. "code":"0",
    12. "msg":"OK!",
    13. "data":null
    14. }
    15. }
    16. }
    17. ]
    5.接口测试基础面试
    • 项目中如何做接口测试?

      通过测试工具...进行参数、请求参数、返回参数效验

    • 接口开发过程中如何进行case编写

      规则文档熟悉通过mock校验格式

    • 如何理解Mock

      模拟返回参数,模拟接口

    • Mock在工作中的运行?

      帮助前端实现正常开发

    下面是配套学习资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

    软件测试面试小程序

    被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!

    涵盖以下这些面试题板块:

    1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux

    6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 ,10、开放性测试题,11、安全测试,12、计算机基础

     

    文档获取方式:

    这份文档,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

  • 相关阅读:
    Hadoop问题:start-all.sh显示未找到命令
    【Cherno的OpenGL视频】How to make your uniform faster in OpenGL
    saltstack学习2grains&pillar
    前端面试题记录(大环境不太友好的2022篇)
    网络安全(黑客)自学
    shell 输入和输出
    数据库测试的认知和分类详解
    七月集训(第26天) —— 并查集
    MySQL数据库忘记密码之修改密码
    2_1 计算机组成与体系结构
  • 原文地址:https://blog.csdn.net/2301_76643199/article/details/133207035