test: Add RHI integration tests and update unit tests

- Add CommandQueue unit tests for WaitForIdle and synchronization
- Add SwapChain unit tests for Present and buffer operations
- Add Texture unit tests for various texture types and mipmaps
- Fix RHIIntegrationFixture with proper logging and debug output
- Update minimal integration test with RHI abstraction layer
- Add GT reference image for minimal test
- Update TEST_SPEC.md documentation
This commit is contained in:
2026-03-25 20:50:49 +08:00
parent 04a80d10e7
commit a9b9a6ebfc
12 changed files with 731 additions and 129 deletions

View File

@@ -2,10 +2,10 @@
## 1. 测试框架
| 组件 | 用途 |
|------|------|
| Google Test | 单元测试框架 |
| CTest | CMake 测试发现和执行 |
| 组件 | 用途 |
| ----------- | -------------------- |
| Google Test | 单元测试框架 |
| CTest | CMake 测试发现和执行 |
---
@@ -70,6 +70,12 @@ tests/
│ ├── CMakeLists.txt
│ ├── fixtures/
│ └── test_*.cpp
├── integration/ # RHI 抽象层集成测试 (共享夹具,参数化测 D3D12/OpenGL)
│ ├── CMakeLists.txt
│ ├── fixtures/
│ │ ├── RHIIntegrationFixture.h
│ │ └── RHIIntegrationFixture.cpp
│ └── minimal/ # 最小渲染测试
├── d3d12/ # D3D12 后端封装测试
│ ├── CMakeLists.txt
│ ├── unit/ # D3D12 单元测试
@@ -88,45 +94,48 @@ tests/
### 2.1 RHI 测试分层架构
RHI 测试分为个层次,各层测试目标不同:
RHI 测试分为个层次,各层测试目标不同:
| 层次 | 位置 | 测试目标 | 测试方式 |
|------|------|----------|----------|
| **RHI抽象层** | `tests/RHI/unit/` | RHI接口定义、跨平台抽象、后端选择 | 参数化测试 (TEST_P),一份代码同时测试 D3D12/OpenGL |
| **D3D12后端单元** | `tests/RHI/D3D12/unit/` | D3D12 API封装实现 | 参数化测试 (TEST_F)直接测试D3D12封装 |
| **OpenGL后端单元** | `tests/RHI/OpenGL/unit/` | OpenGL API封装实现 | 非参数化测试 (TEST_F)直接测试OpenGL封装 |
| **集成测试** | `tests/RHI/*/integration/` | 多组件协作、渲染管线完整性 | Python脚本对比渲染输出PPM文件 |
| 层次 | 位置 | 测试目标 | 测试方式 |
| ------------------ | -------------------------- | --------------------------------- | ------------------------------------------------------------------- |
| **RHI抽象层单元** | `tests/RHI/unit/` | RHI接口定义、跨平台抽象、后端选择 | 参数化测试 (TEST_P),一份代码同时测试 D3D12/OpenGL |
| **RHI抽象层集成** | `tests/RHI/integration/` | RHI接口渲染管线完整性验证 | 参数化测试 (TEST_P)共享夹具同时测 D3D12/OpenGLPython脚本对比PPM |
| **D3D12后端单元** | `tests/RHI/D3D12/unit/` | D3D12 API封装实现 | 非参数化测试 (TEST_F)直接测试D3D12封装 |
| **OpenGL后端单元** | `tests/RHI/OpenGL/unit/` | OpenGL API封装实现 | 非参数化测试 (TEST_F)直接测试OpenGL封装 |
| **后端集成测试** | `tests/RHI/*/integration/` | 多组件协作、渲染管线完整性 | Python脚本对比渲染输出PPM文件 |
**注意**层测试不是冗余,而是测试不同层次的封装。各层测试可以验证:
- RHI抽象层测试验证接口兼容性和跨平台一致性
**注意**层测试不是冗余,而是测试不同层次的封装。各层测试可以验证:
- RHI抽象层单元测试验证接口兼容性和跨平台一致性
- RHI抽象层集成测试验证RHI接口的渲染管线完整性
- 后端专用测试验证各后端实现的正确性
- 集成测试验证完整渲染管线和多组件协作
- 后端集成测试验证完整渲染管线和多组件协作
---
## 3. 模块命名
| 模块 | 可执行文件 | CTest 名称前缀 |
|------|----------|---------------|
| math | math_tests | Math_* |
| Core | core_tests | Core_* |
| containers | containers_tests | Containers_* |
| memory | memory_tests | MemoryTest_* |
| threading | threading_tests | Threading_* |
| debug | debug_tests | Debug_* |
| Resources/Texture | resources_texture_tests | Texture_* |
| Resources/Mesh | resources_mesh_tests | Mesh_* |
| Resources/Material | resources_material_tests | Material_* |
| Resources/Shader | resources_shader_tests | Shader_* |
| Resources/AudioClip | resources_audioclip_tests | AudioClip_* |
| input | input_tests | Input*/WindowsInput* |
| scene | scene_tests | Scene*/SceneManager_* |
| components | components_tests | Component_*|TransformComponent_* |
| RHI/unit (抽象层) | rhi_unit_tests | D3D12/RHITestFixture.*<br>OpenGL/RHITestFixture.* |
| RHI/D3D12/unit (后端) | rhi_d3d12_tests | D3D12TestFixture.*<br>SwapChainTestFixture.* |
| RHI/OpenGL/unit (后端) | rhi_opengl_tests | OpenGLTestFixture.* |
| RHI/D3D12/integration | d3d12_*_test | d3d12_minimal_test<br>d3d12_triangle_test<br>d3d12_quad_test<br>d3d12_sphere_test |
| RHI/OpenGL/integration | opengl_*_test | opengl_minimal_test<br>opengl_triangle_test<br>opengl_quad_test<br>opengl_sphere_test |
| 模块 | 可执行文件 | CTest 名称前缀 |
| ---------------------------- | ------------------------- | ------------------------------------------------------------------------------------- |
| math | math_tests | Math_* |
| Core | core_tests | Core_* |
| containers | containers_tests | Containers_* |
| memory | memory_tests | MemoryTest_* |
| threading | threading_tests | Threading_* |
| debug | debug_tests | Debug_* |
| Resources/Texture | resources_texture_tests | Texture_* |
| Resources/Mesh | resources_mesh_tests | Mesh_* |
| Resources/Material | resources_material_tests | Material_* |
| Resources/Shader | resources_shader_tests | Shader_* |
| Resources/AudioClip | resources_audioclip_tests | AudioClip_* |
| input | input_tests | Input*/WindowsInput* |
| scene | scene_tests | Scene*/SceneManager_* |
| components | components_tests | Component_* | TransformComponent_* |
| RHI/unit (抽象层单元) | rhi_unit_tests | D3D12/RHITestFixture.*<br>OpenGL/RHITestFixture.* |
| RHI/integration (抽象层集成) | rhi_integration_minimal | D3D12/MinimalTest.*<br>OpenGL/MinimalTest.* |
| RHI/D3D12/unit (后端) | rhi_d3d12_tests | D3D12TestFixture.*<br>SwapChainTestFixture.* |
| RHI/OpenGL/unit (后端) | rhi_opengl_tests | OpenGLTestFixture.* |
| RHI/D3D12/integration | d3d12_*_test | d3d12_minimal_test<br>d3d12_triangle_test<br>d3d12_quad_test<br>d3d12_sphere_test |
| RHI/OpenGL/integration | opengl_*_test | opengl_minimal_test<br>opengl_triangle_test<br>opengl_quad_test<br>opengl_sphere_test |
### 3.1 RHI 参数化测试说明
@@ -152,10 +161,10 @@ INSTANTIATE_TEST_SUITE_P(OpenGL, RHITestFixture, ::testing::Values(RHIType::Open
**格式**: `Component_Category_SubBehavior`
| 部分 | 说明 | 示例 |
|------|------|------|
| Component | 被测组件 | Memory, Buffer, Texture |
| Category | 操作类别 | Create, Get, Set, Map, Reset |
| 部分 | 说明 | 示例 |
| ----------- | -------- | ------------------------------------- |
| Component | 被测组件 | Memory, Buffer, Texture |
| Category | 操作类别 | Create, Get, Set, Map, Reset |
| SubBehavior | 具体行为 | DefaultHeap, GPUAddress, ValidPointer |
**示例**:
@@ -344,10 +353,10 @@ TEST_F(ComponentTest, Create_ReturnsValidPointer) {
### 7.2 断言选择
| 断言 | 用途 |
|------|------|
| 断言 | 用途 |
| ---------- | ---------------------- |
| `ASSERT_*` | 致命错误,立即终止测试 |
| `EXPECT_*` | 非致命错误,继续执行 |
| `EXPECT_*` | 非致命错误,继续执行 |
---
@@ -376,32 +385,34 @@ jobs:
### 9.1 模块构建和运行时间
| 模块 | 构建时间 | 运行时间 | 测试数量 |
|------|---------|---------|---------|
| math | ~6s | ~26s | 140 |
| Core | ~6s | ~4s | 25 |
| containers | ~3s | ~10s | 51 |
| memory | ~3s | ~4s | 19 |
| threading | ~5s | ~4s | 13 |
| debug | ~3s | ~2s | 8 |
| components | ~3s | ~8s | 39 |
| scene | ~4s | ~2s | 14 |
| Resources/Texture | ~4s | ~31s | 36 |
| Resources/Mesh | ~4s | ~31s | 29 |
| Resources/Material | ~4s | ~31s | 14 |
| Resources/Shader | ~4s | ~31s | 13 |
| Resources/AudioClip | ~4s | ~31s | 15 |
| input | ~4s | ~9s | 40 |
| RHI/unit (抽象层) | ~20s | ~60s | 138 (69×2后端) |
| D3D12 unit | ~3s | ~55s | 54 |
| OpenGL unit | ~46s | ~11s | 61 |
| D3D12 integration | ~10s | ~20s | 4 |
| OpenGL integration | ~60s | ~20s | 4 |
| **总计** | - | - | **860 (+1 disabled)** |
| 模块 | 构建时间 | 运行时间 | 测试数量 |
| ------------------------ | -------- | -------- | --------------------- |
| math | ~6s | ~26s | 140 |
| Core | ~6s | ~4s | 25 |
| containers | ~3s | ~10s | 51 |
| memory | ~3s | ~4s | 19 |
| threading | ~5s | ~4s | 13 |
| debug | ~3s | ~2s | 8 |
| components | ~3s | ~8s | 39 |
| scene | ~4s | ~2s | 14 |
| Resources/Texture | ~4s | ~31s | 36 |
| Resources/Mesh | ~4s | ~31s | 29 |
| Resources/Material | ~4s | ~31s | 14 |
| Resources/Shader | ~4s | ~31s | 13 |
| Resources/AudioClip | ~4s | ~31s | 15 |
| input | ~4s | ~9s | 40 |
| RHI/unit (抽象层) | ~20s | ~60s | 138 (69×2后端) |
| RHI/integration (抽象层) | ~10s | ~20s | 2 (minimal×2后端) |
| D3D12 unit | ~3s | ~55s | 54 |
| OpenGL unit | ~46s | ~11s | 61 |
| D3D12 integration | ~10s | ~20s | 4 |
| OpenGL integration | ~60s | ~20s | 4 |
| **总计** | - | - | **860 (+1 disabled)** |
**注意**
- RHI/unit 抽象层测试数量为 69 个用例,每个用例同时在 D3D12 和 OpenGL 两个后端上执行,共 138 次测试运行
- 集成测试包含 minimal/triangle/quad/sphere 四个场景,每个后端各 4 个
- RHI/integration 抽象层集成测试验证 RHI 接口的渲染管线完整性,通过参数化同时测试两个后端
- 后端集成测试包含 minimal/triangle/quad/sphere 四个场景,每个后端各 4 个
- Resources 模块测试已按类型拆分到独立子目录中
### 9.2 分模块构建命令(推荐)
@@ -521,19 +532,20 @@ ctest -R "opengl_minimal_test|opengl_triangle_test|opengl_quad_test|opengl_spher
## 附录 A. RHI 测试分层详解
### A.1 为什么需要层测试?
### A.1 为什么需要层测试?
RHIRender Hardware Interface抽象层测试的目的是确保
1. **接口兼容性** - RHI定义的抽象接口在不同后端都能正常工作
2. **跨平台一致性** - 同样的代码逻辑在D3D12和OpenGL上行为一致
3. **后端实现正确性** - 各后端的封装实现符合RHI接口约定
4. **渲染管线完整性** - 多组件协作和完整渲染流程正确性
5. **RHI接口完整性** - RHI抽象层接口的渲染管线完整性验证
### A.2 层测试的关系
### A.2 层测试的关系
```
┌─────────────────────────────────────────────────────────────┐
RHI 抽象层测试 (unit/)
│ RHI 抽象层单元测试 (unit/) │
│ TEST_P: 一份代码,验证 D3D12/OpenGL 接口兼容 │
│ 实例: D3D12/RHITestFixture.* / OpenGL/RHITestFixture.* │
└─────────────────────────────────────────────────────────────┘
@@ -541,7 +553,7 @@ RHIRender Hardware Interface抽象层测试的目的是确保
┌───────────────────┴───────────────────┐
▼ ▼
┌─────────────────────────┐ ┌─────────────────────────┐
│ D3D12 后端测试 │ │ OpenGL 后端测试
│ D3D12 后端单元测试 │ │ OpenGL 后端单元测试 │
│ (D3D12/unit/) │ │ (OpenGL/unit/) │
│ TEST_F: D3D12 专用 │ │ TEST_F: OpenGL 专用 │
│ 验证 D3D12 封装实现 │ │ 验证 OpenGL 封装实现 │
@@ -550,30 +562,41 @@ RHIRender Hardware Interface抽象层测试的目的是确保
┌───────────────────┴───────────────────┐
▼ ▼
┌─────────────────────────┐ ┌─────────────────────────┐
│ D3D12 集成测试 │ │ OpenGL 集成测试 │
│ (D3D12/integration/) │ │ (OpenGL/integration/) │
│ minimal/triangle/ │ │ minimal/triangle/ │
│ quad/sphere │ │ quad/sphere
│ Python脚本对比PPM │ │ Python脚本对比PPM
│ D3D12 集成测试 │ │ OpenGL 集成测试 │
│ (D3D12/integration/) │ │ (OpenGL/integration/) │
│ minimal/triangle/ │ │ minimal/triangle/ │
│ quad/sphere │ │ quad/sphere │
│ Python脚本对比PPM │ │ Python脚本对比PPM │
└─────────────────────────┘ └─────────────────────────┘
┌───────────────────┴───────────────────┐
▼ ▼
┌─────────────────────────────────────────────────────────────┐
│ RHI 抽象层集成测试 (integration/) │
│ TEST_P: 共享夹具,验证 D3D12/OpenGL 渲染管线 │
│ 实例: D3D12/MinimalTest.* / OpenGL/MinimalTest.* │
│ minimal: 最小渲染场景Python脚本对比PPM │
└─────────────────────────────────────────────────────────────┘
```
### A.3 测试执行建议
| 场景 | 推荐测试 |
|------|---------|
| 日常开发 (RHI 接口验证) | `rhi_unit_tests` |
| 开发 D3D12 后端 | `rhi_unit_tests` + `rhi_d3d12_tests` |
| 开发 OpenGL 后端 | `rhi_unit_tests` + `rhi_opengl_tests` |
| 验证渲染管线 | D3D12/OpenGL 集成测试 |
| CI 自动化 | `rhi_unit_tests` + `rhi_d3d12_tests` + `rhi_opengl_tests` + 集成测试 |
| 场景 | 推荐测试 |
| ----------------------- | ------------------------------------------------------------------------ |
| 日常开发 (RHI 接口验证) | `rhi_unit_tests` |
| 验证 RHI 渲染管线 | `rhi_integration_minimal` |
| 开发 D3D12 后端 | `rhi_unit_tests` + `rhi_d3d12_tests` |
| 开发 OpenGL 后端 | `rhi_unit_tests` + `rhi_opengl_tests` |
| 验证渲染管线 | D3D12/OpenGL 后端集成测试 |
| CI 自动化 | `rhi_unit_tests` + `rhi_d3d12_tests` + `rhi_opengl_tests` + 后端集成测试 |
### A.4 可执行文件命名规范
```
rhi_<层级>_tests
├── rhi_unit_tests # RHI抽象层测试
├── rhi_unit_tests # RHI抽象层单元测试
├── rhi_integration_minimal # RHI抽象层集成测试 (minimal)
├── rhi_d3d12_tests # D3D12后端封装测试
├── rhi_opengl_tests # OpenGL后端封装测试
└── <backend>_<scene>_test # 集成测试 (如 d3d12_minimal_test)
└── <backend>_<scene>_test # 后端集成测试 (如 d3d12_minimal_test)
```