拓冰建站拓冰建站
首页 / 资讯中心 / 正文

OpenMetadata Java SDK 测试策略详解:Mock 测试与集成测试的分层设计

OpenMetadata Java SDK 测试策略详解Mock 测试与集成测试的分层设计【免费下载链接】OpenMetadataThe Open Context Layer for Data and AI , OpenMetadata is the open platform for building trusted data context and business semantics for humans, AI assistants, and agents.项目地址: https://gitcode.com/GitHub_Trending/op/OpenMetadata本文基于 OpenMetadata 仓库中 SDK 集成测试目录下的说明文档 integration/README.md 展开讲解openmetadata-sdk模块Mock 测试SDK 内 集成测试service 模块内的双层测试策略。读完后你将理解为什么 SDK 层的实体操作测试不依赖真实服务器、*.java.disabled文件的定位与迁移路径、BaseSDKTest的公共测试基座如何工作以及如何用 Maven 命令在 CI 环境中快速运行这些测试。测试分层总览Mock 测试 vs 集成测试README 文档 开篇即明确了核心原则本目录下及 SDK 内以.java.disabled结尾的文件是集成测试它们需要一个运行中的 OpenMetadata 服务器、数据库和搜索引擎才能工作因此日常构建不依赖这些测试SDK 行为验证由 Mock 测试完成。两套测试的分工如下维度Mock 测试SDK 模块内集成测试openmetadata-service 模块是否依赖运行中的服务器否全程 Mockito 模拟是真实服务器 数据库 搜索引擎验证目标SDK 是否正确转换请求/响应、错误处理与边界场景端到端工作流、真实持久化与检索行为测试基类BaseSDKTestEntityResourceTest文档指定位于 service 模块测试基础设施中运行成本秒级构建内随跑需要完整测试环境搭建这种SDK 测试验证 SDK 行为、service 测试验证服务器行为的清晰边界正是文档所强调的Clear Separation设计目标。Mock 测试用 Mockito 模拟客户端与服务 API文档指出 SDK 采用类似 Stripe Java SDK 的 Mock 测试思路用 Mockito 模拟OpenMetadataClient与各个 service API只验证 SDK 对请求和响应的转换逻辑不发起真实 HTTP 调用。当前仓库中这一策略有大量落地实现entities目录下已存在 15 个实体 Mock 测试类例如DatabaseServiceMockTest.javaTableEntityOperationsTest.javaContainerMockTest.javaGlossaryMockTest.javaDomainMockTest.javaPipelineMockTest.javaMlModelMockTest.javaUserMockTest.javaTeamMockTest.javaTestCaseMockTest.javaTopicMockTest.javaDashboardMockTest.javaClassificationMockTest.javaQueryMockTest.javaSearchIndexMockTest.java此外还有服务层与流式 API 的测试GlossaryTermRelationsMockTest.java、OntologyServicesMockTest.java、TablesFluentAPITest.java、RestoreFluentAPITest.java 等。从源码看 Mock 模式DatabaseServiceMockTest 的实现以 DatabaseServiceMockTest.java 为例其模式与文档描述完全一致——Mock掉OpenMetadataClient和DatabaseServiceService再把模拟客户端注入实体类的静态默认客户端Mock private OpenMetadataClient mockClient; Mock private DatabaseServiceService mockDatabaseServiceApi; BeforeEach void setUp() { MockitoAnnotations.openMocks(this); when(mockClient.databaseServices()).thenReturn(mockDatabaseServiceApi); org.openmetadata.sdk.entities.DatabaseService.setDefaultClient(mockClient); } Test void testCreateDatabaseService() { MysqlConnection mysqlConnection new MysqlConnection() .withHostPort(localhost:3306) .withUsername(test_user) .withDatabaseName(test_database); DatabaseConnection connection new DatabaseConnection().withConfig(mysqlConnection); CreateDatabaseService createRequest new CreateDatabaseService() .withName(test_mysql_service) .withServiceType(DatabaseServiceType.Mysql) .withConnection(connection); // ... 构造期望的 DatabaseService 返回值并 when(mockDatabaseServiceApi.create(...)) 打桩 // Act走 SDK 的实体静态方法而不是直接调用 mock DatabaseService result org.openmetadata.sdk.entities.DatabaseService.create(createRequest); // Assert既校验返回值字段也 verify 底层 API 确实被调用 assertEquals(test_mysql_service, result.getName()); verify(mockDatabaseServiceApi).create(any(CreateDatabaseService.class)); }这个测试覆盖了create/retrieve/update/delete四类操作文件共 150 行体现了文档所说的验证 SDK 正确转换请求和响应、测试错误处理与边界场景。关键点在于断言对象是SDK 静态实体 API 的入参到 mock API 的透传行为而非服务器行为。BaseSDKTestSDK 测试的公共基座部分 SDK 测试继承自 BaseSDKTest。从源码看它在BeforeEach中完成了所有公共准备工作通过MockitoAnnotations.openMocks(this)开启并跟踪 Mockito 模拟对象AfterEach中关闭构造OpenMetadataConfigbaseUrl为http://localhost:8585/api、testMode(true)、accessToken为测试邮箱、连接/读超时各 5000ms用该配置初始化OpenMetadataClient再执行OM.init(client)将客户端注入OM门面提供子类扩展点additionalSetUp()/additionalTearDown()提供测试工具方法generateTestName(prefix)前缀 UUID 前 8 位保证实体名唯一、cleanupEntity(entity)清理时捕获异常避免误杀测试、assertEntitiesEqual(...)忽略 version、updatedAt 等服务端生成字段后比较实体。值得注意的是基座中的TEST_SERVER_URL默认指向localhost:8585——即 OpenMetadata 的默认 API 端口。Mock 测试下该地址只用于配置装配不会真正发起请求这也说明为何这些测试可以在无任何外部依赖的 CI 环境运行。集成测试.java.disabled文件及其迁移路径文档将需要真实服务器的测试以.java.disabled后缀保留在 SDK 目录中封存既不参与构建又保留了测试资产。当前仓库中可以找到这样的实例OpenMetadataHttpClientTest.java.disabled——一个 HTTP 客户端层面的网络测试正属于必须连通真实服务器才有意义的范畴。文档给出了把这类测试正式启用到openmetadata-service模块的三步操作原文档内容完整继承将.java.disabled文件移动到openmetadata-service/src/test/java/org/openmetadata/service/resources/改为继承EntityResourceTest而不是BaseSDKTest使用openmetadata-service提供的测试基础设施。迁移后测试获得的能力包括以EntityResourceTest为基类接入 service 模块的完整测试基础设施、可针对真实数据库和搜索引擎执行、可测试端到端工作流。由于 service 模块的测试工程规模较大openmetadata-service/src/test/java下含八百余个测试文件这类集成测试天然适合放在那里统一运行。需要说明的是这一步是按需迁移——只有当某项行为确实需要真实服务器语义如持久化、检索、鉴权链路时才值得迁移纯粹验证 SDK 请求/响应转换的测试应继续留在 Mock 层。运行 Mock 测试文档给出的运行方式如下在openmetadata-sdk模块下执行# 运行 SDK 全部 Mock 测试 mvn test # 运行单个 Mock 测试 mvn test -DtestTableMockTest由于仓库根目录同样是 Maven 聚合工程根 pom.xml 下挂载 openmetadata-sdk/pom.xml 等模块也可以从仓库根目录用-pl参数指定模块运行例如针对上文示例类mvn test -pl openmetadata-sdk -DtestDatabaseServiceMockTest适用前提本地已具备 Java 与 Maven 构建环境且已能解析各模块依赖如按仓库根目录构建说明先完成整体构建。这一策略的收益文档最后总结了五点收益结合仓库现状可以逐条对应验证快速反馈Fast FeedbackMock 测试无外部依赖、秒级完成随mvn test进入每次构建可靠性Reliable不经过网络与真实服务器消除了因环境不稳定导致的 flaky 失败完整覆盖Complete Coverage错误分支如 BaseSDKTest 中cleanupEntity对清理异常的容错设计所暗示的思路与边界条件在 Mock 下更容易构造和断言CI/CD 友好CI/CD Friendly任何环境零搭建即可运行职责清晰Clear SeparationSDK 测试只回答SDK 是否正确service 模块集成测试只回答服务器是否端到端正确。小结OpenMetadata SDK 的测试组织可以概括为一句话转换逻辑交给 Mock端到端交给 service 模块。日常开发中修改 SDK 的实体/服务类后直接运行模块内 Mock 测试即可获得秒级反馈当需要验证真实服务器链路时再按文档的三步迁移法将.java.disabled测试升级为基于EntityResourceTest的集成测试。相关入口文件集成测试说明文档、SDK 测试基座 BaseSDKTest、Mock 测试示例 DatabaseServiceMockTest。【免费下载链接】OpenMetadataThe Open Context Layer for Data and AI , OpenMetadata is the open platform for building trusted data context and business semantics for humans, AI assistants, and agents.项目地址: https://gitcode.com/GitHub_Trending/op/OpenMetadata创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门