Mock工具wiremock-py

wiremock-py是一个基于WireMock的Python工具,用于快速生成不同测试场景的mock数据,解决前后端同步测试问题。它支持通过JSON、Python和JS代码动态生成mock数据,并允许多人使用各自的mock server进行独立测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

wiremock-py

wiremock-py 是基于WireMock实现的, 使用Python批量生成不同 测试场景 下不同HTTP API的 mock 数据, 然后作为mock server快速全面地对 API 进行测试。

背景

在数澜地产应用的前端测试中, 前端一般依赖于后端的数据, 前端通过后端在网关上发布的 HTTP API 获取数据. 要对前端进行充分的测试, 理想的做法是, 等待后端部署完成, 并且在数据层直接输入不同类型的数据源, 然后前端直接调用后端发布在网关上的 API 进行测试。

然而现实的情况是, 前端和后端的开发进度不完全一致, 如果前端先开发完成了, 必须要等后端对应的 API 开发完成后才能开始测试, 而且数据层的数据也不容易构造.

为了解决这个问题, 网关平台做了简单的 mock 功能, 每个 API 可以填写一个 mock数据, 然后前端调用 API 时直接使用这个 mock数据:

这种方式下, 网关充当了mock server:

但由于大家都使用同一个网关, 一个 API 只能保存一份 mock 数据, 所以有以下一些缺点:

  • 不同的测试场景需要不同的 mock 数据来测试, 此时需要删掉上个测试场景的 mock 数据, 再创建新场景的 mock 数据才能进行测试

  • 不能根据测试场景来按照一定的规则动态生成 API 对应的 mock 数据

  • 不能多人同时使用测试同一个 API时, 只能都使用同一份 mock 数据, 不能各用各的

wiremock-py 可以解决上述这些问题: wiremock-py 通过传入不同的测试场景参数来生成不同的 mock 数据, 同时不同测试场景下使用的 mock 数据可以保存起来; 生成 mock 数据时, wiremock-py 支持使用Pythonjs代码来动态生成 mock 数据(也支持直接使用 json 数据, 如果 mock 数据中的数据量很大, 人工手写 mock 时的数据量会很大, 使用代码生成则比较容易); 不同的测试人员使用各自自己的 mock server, 不会影响到其他测试人员的测试。

测试人员需要做的是: 确定哪些 API 需要进行 mock 以及不同测试场景下对应的 mock 规则是什么。

依赖环境

  • Java 1.8.0_144

  • Node v8.6.0

  • Python 3.4.3

演示

快速开始

贸数v1.1.0版本 测试环境为例演示使用 wiremock-py 对楼层客流分布店铺客流分布两张图分布在3种场景下的测试方法

先确定本地浏览器能过正常访问 http://mall-data.com:9012

准备

克隆代码

git clone http://git.dtwave-inc.com:30000/baomi.wbm/wiremock-py.git

安装依赖

cd wiremock-py

pip install -r requirements.txt

npm install mockjs

生成目录

python mock.py -g "demo"

➜  wiremock-py git:(master) ✗ python mock.py -g "demo"
DEBUG:root:mockdir=, scene=, target=, proxy_port=5506, generate=demo, wiremock=False, rewrite=False
DEBUG:root:正在生成目录 /Users/wangbaomi/autotest/wiremock-py/demo
DEBUG:root:创建目录成功: demo
DEBUG:root:创建目录成功: demo/js
DEBUG:root:创建目录成功: demo/json
DEBUG:root:创建目录成功: demo/python
DEBUG:root:创建目录成功: demo/wiremock
DEBUG:root:创建文件成功: demo/mappings.json
DEBUG:root:生成目录完成: /Users/wangbaomi/autotest/wiremock-py/demo

编写 mock 规则

填写 mappings.json、json、python、js 数据

mappings.json 中填写内容:

[
    {
        "response": {
            "default": {
                "proxyBaseUrl": "target"
            }
        },
        "mapping_name": "request url not start with /api",
        "request": {
            "method": "ANY",
           
<think>我们之前已经设计了一个通用的LangGraph-RAG适配层接口。现在用户询问如何测试该适配层的兼容性。我们需要设计一套测试方案,确保适配层能够与不同RAG系统(如Dify、FastGPT、RAGFlow、LangChain)正确交互。测试目标:1.验证适配层接口与不同RAG系统的兼容性2.确保状态管理在不同RAG系统中一致3.验证异常处理机制的正确性测试策略:1.模拟测试MockTesting):针对IRAGAdapter接口,模拟不同RAG系统的响应,验证适配层的转换逻辑。2.集成测试(IntegrationTesting):将适配层与实际的RAG系统(如RAGFlow、LangChain等)连接,进行端到端测试。3.兼容性矩阵测试:覆盖不同的RAG系统和不同的使用场景。具体测试方案:###一、模拟测试(单元测试级别)为每个适配器实现编写测试用例,使用Mock对象模拟RAG系统的行为。```pythonimportpytestfromunittest.mockimportMagicMockfrommy_adapterimportRAGFlowAdapter,IRAGAdapterdeftest_retrieve_success():#模拟RAGFlow的返回mock_response={"chunks":[{"text":"answer1","metadata":{}}],"scores":[0.95],"session_state":{"query_history":["test"]}}#创建适配器实例,并注入模拟客户端adapter=RAGFlowAdapter()adapter._client=MagicMock()adapter._client.search.return_value=mock_response#构造查询query=RAGQuery(query="testquery")#调用被测试方法result=adapter.retrieve(query)#验证结果转换是否正确assertlen(result.content)==1assertresult.content[0].text=="answer1"assertresult.scores[0]==0.95assertresult.next_state.query_history==["test"]```###二、集成测试使用实际部署的RAG系统进行测试,验证整个通信链路。1.**测试环境搭建**:-部署目标RAG系统(如RAGFlow)-配置适配层连接该RAG系统2.**测试用例设计**:-**基础检索测试**:发送简单查询,验证返回结果和状态更新-**多轮对话测试**:发送连续查询,验证状态传递的正确性-**异常测试**:模拟RAG系统异常(如超时、鉴权失败),验证适配层错误处理```python#集成测试示例(使用真实连接)deftest_ragflow_integration():adapter=RAGFlowAdapter(config=load_config("ragflow"))query=RAGQuery(query="什么是LangGraph?",state_hint=RAGState(session_id="test123"))#执行检索result=adapter.retrieve(query)#验证基本结果assertlen(result.content)>0assertall(0<=score<=1forscoreinresult.scores)#验证状态更新assert"test123"==result.next_state.session_idassert"什么是LangGraph?"inresult.next_state.query_history```###三、兼容性矩阵测试针对不同的RAG系统,执行相同的测试用例集,验证适配层的广泛兼容性。|测试用例|RAGFlow|Dify|LangChain|FastGPT||--------------------------|---------|------|-----------|---------||单次检索|✔|✔|✔|✔||多轮对话状态传递|✔|✘*|✔|✘*||文档批量导入|✔|✔|✔|✔||错误处理(无效API密钥)|✔|✔|✔|✔|>*注:需根据具体RAG系统是否支持状态管理确定###四、性能与稳定性测试1.**压力测试**:模拟高并发请求,验证适配层的资源使用和稳定性。2.**长会话测试**:模拟长时间运行的会话(如100轮对话),验证状态管理的可靠性。###五、测试工具推荐1.**pytest**:编写和执行测试用例2.**locust**:进行压力测试3.**WireMock**:模拟RAG系统的HTTP响应(用于模拟测试)###六、自动化测试流程```mermaidgraphTDA[代码提交]-->B[执行单元测试]B-->C{通过?}C---->D[执行集成测试]C---->E[失败告警]D-->F{所有RAG系统通过?}F---->G[生成测试报告]F---->E```通过以上测试方案,可以系统地验证适配层与不同RAG系统的兼容性,确保设计符合要求[^1]。§§相关问题§§1.多RAG系统并行调用时如何保证状态一致性?2.适配层如何支持RAG系统的实时文档更新通知?3.如何监控LangGraph-RAG适配层的性能指标?</think>## 如何测试LangGraph-RAG适配层的兼容性 以下是系统化的兼容性测试方案,覆盖核心接口和通信协议: ### 一、核心接口兼容性测试 ```mermaid graph TD A[测试准备] --> B[状态容器测试] A --> C[查询协议测试] A --> D[结果标准化测试] ``` 1. **状态容器验证**: ```python def test_state_serialization(): # 验证状态对象在不同RAG系统的序列化兼容性 original_state = RAGState( session_id="test_123", query_history=["Q1", "Q2"], document_context={"source": "manual.pdf"} ) # 测试RAGFlow状态转换 ragflow_state = convert_to_ragflow_format(original_state) restored_state = convert_from_ragflow_format(ragflow_state) assert original_state == restored_state # 必须通过 # 重复测试LangChain/Dify/FastGPT等系统 ``` *验证点*:状态对象在不同RAG系统中的双向转换一致性[^1] 2. **查询协议边界测试**: ```python test_cases = [ ("正常查询", RAGQuery(query="标准问题")), ("空查询", RAGQuery(query="")), ("超长查询", RAGQuery(query="X"*10000)), ("特殊字符", RAGQuery(query="SQL: SELECT * FROM...")) ] ``` *验证点*:不同RAG系统对异常输入的容错处理差异 3. **结果标准化测试**: ```python def test_result_normalization(): # 模拟不同RAG系统的原生响应 ragflow_response = {"chunks": [{"text": "A"}], "confidence": 0.9} langchain_response = {"documents": [{"content": "A"}], "score": 90} # 验证标准化转换 assert normalize_rag_result(ragflow_response).content[0].text == "A" assert normalize_rag_result(langchain_response).scores[0] == 0.9 # 百分制转小数 ``` ### 二、通信协议兼容性测试 ```mermaid sequenceDiagram Tester->>Adapter: 发送模拟请求 Adapter->>RAG-Mock: 转换协议 RAG-Mock-->>Adapter: 返回预设响应 Adapter-->>Tester: 验证结果一致性 ``` 1. **协议矩阵测试**: | 协议类型 | 测试用例 | 预期行为 | |----------|---------------------------|------------------------| | HTTP SSE | 发送10个分块结果 | 适配层应完整拼接内容 | | Webhook | 模拟文档更新通知 | 触发状态更新$S_{t+1}$ | | WebSocket| 中断连接后重连 | 自动恢复状态同步 | 2. **实时性验证**: ```python def test_streaming_latency(): start = time.time() # 模拟每秒发送1个数据块 with Adapter.stream_retrieve(query) as stream: for chunk in stream: process(chunk) assert time.time() - start < 3.0 # 总延迟阈值 ``` ### 三、跨系统兼容性测试套件 ```python # 自动化测试框架 compatibility_matrix = [ ("RAGFlow", "v1.2", ragflow_config), ("LangChain", "0.0.15", langchain_config), ("Dify", "cloud", dify_cloud_config) ] for system, version, config in compatibility_matrix: adapter = load_adapter(system, config) run_test_suite(adapter) # 执行统一测试用例集 generate_compatibility_report(system, version) ``` **关键指标**: 1. 接口方法覆盖率:$ \frac{\text{已实现方法}}{\text{IRAGAdapter方法}} \times 100\% $ 2. 状态转换准确率:$ \frac{\text{正确状态转换次数}}{\text{总测试次数}} $ 3. 异常处理通过率 ### 四、持续测试方案 1. **容器化测试环境**: ```dockerfile FROM python:3.10 # 安装所有支持RAG系统的适配器 RUN pip install ragflow-adapter langchain-adapter dify-adapter COPY compatibility_suite.py . CMD ["pytest", "-v", "--cov"] ``` 2. **监控仪表盘**: ```mermaid pie title 兼容性通过率 “RAGFlow” : 38 “LangChain” : 32 “Dify” : 20 “FastGPT” : 10 ``` > 通过该测试方案,可系统验证适配层与不同RAG框架(RAGFlow/LangChain/Dify/FastGPT)的兼容性,确保设计满足$ \text{“一次编写,多处运行”} $目标[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值