目录
性能优化:使用缓存(functools.lru_cache)。
测试工作中常用到的测试桩mock能力
在我们的测试工作过程中,可能会遇到前端服务开发完成,依赖服务还在开发中;或者我们需要压测某个服务,而这个服务的依赖组件(如测试环境MQ
) 无法支撑并发访问的场景。这个时候我们可能就需要一个服务,来替代测试环境的这些依赖组件或服务,而这就是本文的主角--测试桩。
测试桩可以理解为一个代理,它可以用于模拟应用程序中的外部依赖项,如数据库、网络服务或其他API,它可以帮助我们在开发和测试过程中隔离应用程序的不同部分,从而使测试更加可靠和可重复。
应用场景
测试桩使用的一般有以下几种场景:
场景 | 使用测试桩的原因与目的 |
---|---|
单元测试 | 隔离被测代码与其他组件或外部依赖的交互,便于在不考虑其他部分的情况下对被测代码进行测试。 |
集成测试 | 当某些组件未实现或不可用时,使用测试桩模拟这些组件,以便继续进行集成测试。 |
性能测试 | 快速生成高负载和大量并发请求,评估系统在高负载条件下的性能表现。 |
故障注入和恢复测试 | 模拟故障(如网络故障、服务宕机等),验证系统在遇到故障时的行为和恢复能力。 |
API测试 | 使用测试桩模拟API的响应,以便在API实现完成之前就可以进行客户端开发和测试。 |
第三方服务测试 | 在开发和测试阶段避免与真实的第三方服务进行交互,降低额外成本和不稳定的测试结果。测试桩用于模拟这些第三方服务,使得在不影响真实服务的情况下进行测试。 |
本文将选取常用的几个场景循序渐进地介绍测试桩的开发和优化。
简单测试桩
如果在测试环境中不方便安装其他的库,我们可以使用Python标准库中的一个模块http.server
模块创建一个简单的HTTP请求测试桩。
# simple_stub.py
# 测试桩接收GET请求并返回JSON数据。
import json
from http.server import BaseHTTPRequestHandler, HTTPServer
class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
content = json.dumps({"message": "Hello, this is a test stub!"}).encode("utf-8")
self.send_response(200)
self.send_header("Content-Type", "application/json")
self.send_header("Content-Length", f"{len(content)}")
self.end_headers()
self.wfile.write(content)
if __name__ == "__main__":
server_address = ("", 8000)
httpd = HTTPServer(server_address, SimpleHTTPRequestHandler)
print("Test stub is running on port 8000")
httpd.serve_forever()
运行上面的代码,将看到测试桩正在监听8000端口。您可以使用浏览器或curl
命令访问 http://localhost:8000
,将会收到 {'message': 'Hello, this is a test stub!'}
的响应。
http.server
扩展:一行命令实现一个静态文件服务器
http.server
模块可以作为一个简单的静态文件服务器,用于在本地开发和测试静态网站。要启动静态文件服务器,请在命令行中运行以下命令:
python3 -m http.server [port]
其中[port]是可选的端口号,不传递时默认为8000。服务器将在当前目录中提供静态文件。
<