在日常测试过程中或者研发开发过程中,目前接口暂时没有开发完成,测试人员又要提前介入接口测试中,测试人员不仅仅只是简单的编写测试用例,也可以通过一些 mock 的方法进行来提前根据接口测试的情况进行模拟返回接口的信息,进行模拟接口各种场景的异常。
mock 是指模拟,也就是模拟接口返回的信息,用已有的信息替换它需要返回的信息,从实现对所依赖的模块的测试。
一般有两种场景:
前端 mock 可以通过一些工具来完成:
后端的 Mock 则是从接口的角度,如果一个接口 A 返回的数据需要依赖于另一个接口 B,当敏捷开发中 B 接口还未开发完全时候这里会需要用到 Mock。
对于测试人员,对接口测试的时候,部分接口尚未开发完成,在约定了接口定义之后,也可以使用 Mock 来模拟。
今天给大家介绍一款 Python Mock 工具:requests-mock
requests-mock 是一个用于模拟 HTTP 请求的 Python 库,它可以帮助开发人员在测试和开发过程中模拟各种 HTTP 请求和响应。使用 requests-mock,可以用来模拟接口的各种场景,就像真正的服务器一样。
特点:
适用场景:
单元测试:
开发人员可以使用 requests-mock 模拟 HTTP 请求和响应,以便在单元测试中测试他们的代码。
集成测试:
在进行集成测试时,requests-mock 可以帮助开发人员模拟外部服务的行为,以验证系统的整体功能。
开发过程中的快速原型验证:
在开发过程中,开发人员可以使用 requests-mock 快速验证他们的代码对于不同的 HTTP 响应的处理情况。
通过 Mock 能够帮助我们模拟系统各种行为,包括网络请求、文件读写、数据库操作、系统时间等等。这能够在测试代码时降低对外部依赖的需求,从而提高代码的可测试性。
安装必要的模块:requests, requests_mock。
pip install requests
pip install requests_mock
示例一:使用 Mock 模拟 GET、Post 请求
以下是一个使用 requests-mock 模拟 GET 请求和 POST 请求的示例:
import requests
import requests_mock
# 模拟GET请求
with requests_mock.Mocker() as m:
# 模拟post请求内容,返回的json格式,返回码为200
m.get('http://example.com/api/data', json={"name":"测试开发技术"}, status_code=200)
response = requests.get('http://example.com/api/data')
print(response.json())
# 模拟POST请求
with requests_mock.Mocker() as m:
# 模拟post请求内容,返回的json格式,返回码为200
m.post('http://example.com/api/submit',json={"name":"测试开发技术"}, status_code=201)
response = requests.post('http://example.com/api/submit', data={'key': 'value'})
print(response.json())
在上面的示例中,我们使用 requests-mock 模拟了一个 GET 请求和一个 POST 请求。在每个模拟的上下文中,我们使用 requests_mock.Mocker() 创建了一个模拟器,并使用 m.get() 和 m.post() 分别定义了 GET 请求和 POST 请求的模拟响应。然后,我们使用 requests 库发送了实际的 GET 和 POST 请求,并打印了模拟的响应内容。
示例二:requests-mock 在测试脚本中的用法
import requests
import requests_mock
def get_data():
response = requests.get('http://example.com/api')
return response.json()
def test_get_data():
adapter = requests_mock.Adapter()
mock_response = {"status": "ok", "datas": [{"name": "狂师", "description": "公众号:测试开发技术"}]}
adapter.register_uri('GET', 'http://example.com/api', json=mock_response)
with requests.Session() as session:
session.mount('http://', adapter)
data = get_data()
assert data["status"] == "ok"
assert len(news_data["datas"]) == 1
assert news_data["datas"][0]["name"] == "狂师"
示例三:requests-mock 模拟请求错误异常
正常请求接口的时候,都会出现接口异常情况,比如超时哈,或者请求服务器异常等操作,接下来小编通过 requests-mock 进行模拟服务器异常的情况。
import requests
import requests_mock
from requests.exceptions import ConnectionError, Timeout
def test_exception():
with requests_mock.Mocker() as m:
# 模拟请求超时处理
m.get('http://example.com/api',exc=Timeout)
# 通过pytest.raises进行捕捉异常,如果存在异常,则判断为pass
with pytest.raises(Timeout):
requests.get('http://example.com/api',timeout=3)
# 模拟服务器错误
m.get('http://example.com/api', exc=ConnectionError)
# 发送请求并断言是否抛出了预期的异常
with pytest.raises(ConnectionError):
requests.get('http://example.com/api')
更多内容可以学习《测试工程师 Python 工具开发实战》书籍、《大话性能测试 JMeter 实战》书籍