目录:导读
- 前言
- 一、Python编程入门到精通
- 二、接口自动化项目实战
- 三、Web自动化项目实战
- 四、App自动化项目实战
- 五、一线大厂简历
- 六、测试开发DevOps体系
- 七、常用自动化测试工具
- 八、JMeter性能测试
- 九、总结(尾部小惊喜)
前言
Mock原理/实现机制
在某些时候,后端在开发接口的时候,处理逻辑非常复杂,在测试的时候,后端在未完成接口的情况下该如何去测试呢?
我们需要测试,但是有些请求又需要修改一下参数,或者改变一下request实现的方式,比如修改状态码,产生的图片要进行替换,或者是替换执行文件等
Mock简介
Mock是Python中一个用于支持单元测试的库,它的主要功能是使用mock对象替代掉指定的Python对象,以达到模拟对象的行为。
在项目的单元测试过程中,会遇到:
接口的依赖;
外部接口调用;
测试环境非常复杂;
单元测试应该只针对当前单元进行测试,所有的内部或外部的依赖应该是稳定的,已经在别处进行测试过的。
使用mock 就可以对外部依赖组件实现进行模拟并且替换掉,从而使得单元测试将焦点只放在当前的单元功能。
解决测试依赖
例如,我们要测试A模块,然后A模块依赖于B模块的调用。但是,由于B模块的改变,导致了A模块返回结果的改变,从而使A模块的测试用例失败。其实,对于A模块,以及A模块的用例来说,并没有变化,不应该失败才对。
这个时候就是mock发挥作用的时候了。通过mock模拟掉影响A模块的部分(B模块)。至于mock掉的部分(B模块)应该由其它用例来测试。
简单的案例实现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()函数编写测试用例。
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()
mock实现get数据模拟
举个例子来说:我们有一个简单的客户端实现,用来访问一个URL,当访问正常时,需要返回状态码200,不正常时,需要返回状态码404。
首先,我们的客户端代码实现如下:
import requests
def send_request(url):
r = requests.get(url)
return r.status_code
def visit_ustack():
return send_request('http://www.xxxxx.com')
# 外部模块调用visit_ustack()来访问baidu的官网。下面我们使用mock对象在单元测试中分别测试访问正常和访问不正常的情况。
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')
找到要替换的对象:需要测试的是visit_ustack这个函数,那么需要替换掉send_request这个函数。
实例化Mock类得到一个mock对象,并且设置这个mock对象的行为。在成功测试中,我们设置mock对象的返回值为字符串“200”,在失败测试中,我们设置mock对象的返回值为字符串"404"。
使用这个mock对象替换掉我们想替换的对象。替换掉了client.send_request
写测试代码。调用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。
接口测试面试
项目中如何做接口测试?
通过测试工具…进行参数、请求参数、返回参数效验?
接口开发过程中如何进行case编写?
规则文档熟悉通过mock校验格式?
如何理解Mock?
模拟返回参数,模拟接口?
Mock在工作中的运行?
帮助前端实现正常开发?
下面是我整理的2023年最全的软件测试工程师学习知识架构体系图 |
一、Python编程入门到精通
二、接口自动化项目实战
三、Web自动化项目实战
四、App自动化项目实战
五、一线大厂简历
六、测试开发DevOps体系
七、常用自动化测试工具
八、JMeter性能测试
九、总结(尾部小惊喜)
不要停下脚步,把梦想变成行动,让汗水浇灌未来。每一次努力都是自我超越的机会,没有放弃,就有成功的可能。勇往直前,迎接生命的挑战,用汗水和奋斗书写精彩人生!
只有不断地努力奋斗,才能让梦想变为现实。每一次的失败都是成长的机会,坚持下去你就会发现自己变得更加强大。别忘了,过程虽难,但结果会值得一切!
只要你有梦想,勇于追求,不断努力,就一定能够实现自己的价值和人生目标。无论遇到什么困难和挑战,都要坚持自己的信念,不放弃、不退缩,相信成功一定属于你!