|
2 | 2 |
|
3 | 3 | ## 目录结构 |
4 | 4 |
|
5 | | -## 测试项目说明 |
| 5 | +```text |
| 6 | +tests/ |
| 7 | +├── basic-tester/ # C++ runner(CI) |
| 8 | +├── aot-tester/ # AOT runner |
| 9 | +├── managed/ |
| 10 | +│ ├── managed.sln |
| 11 | +│ ├── Common/ # Assert、[UnitTest]、TestCaseBase |
| 12 | +│ ├── SharedTests/ # 共享源,链入 CoreTests / AotTests |
| 13 | +│ ├── CoreTests/ # CLR / IL / C# 语义 |
| 14 | +│ ├── CorlibTests/ # BCL icall / intrinsic |
| 15 | +│ ├── AotTests/ # LeanAOT 专有 |
| 16 | +│ ├── ILTests/ # .il + wrapper |
| 17 | +│ └── RunTests/ # C# 反射 runner(本地) |
| 18 | +└── TESTING.md # 仓库内简短索引(指向文档站) |
| 19 | +``` |
6 | 20 |
|
7 | | -## 添加测试用例 |
| 21 | +## 测试项目职责 |
| 22 | + |
| 23 | +| 项目 | 测什么 | 不应放什么 | |
| 24 | +|------|--------|------------| |
| 25 | +| **CoreTests** | 解释器、IL(C# 可写)、C# 特性、回归 | BCL icall 细节、AOT 链路专有 | |
| 26 | +| **CorlibTests** | mscorlib / System:icall、intrinsic、P/Invoke | 纯 CLR 指令语义 | |
| 27 | +| **ILTests** | C# 难构造的 IL(`.il` + ilasm) | 可用 C# 表达的用例 | |
| 28 | +| **AotTests** | IL→C++ 后正确性 | 与 CoreTests 完全重复的指令测 | |
| 29 | +| **Common** | 基础设施 | 测试用例本身 | |
| 30 | + |
| 31 | +## Runner 发现规则 |
| 32 | + |
| 33 | +| 规则 | basic-tester | RunTests | AotTests.App | |
| 34 | +|------|-------------|----------|--------------| |
| 35 | +| 标记 | `[UnitTest]` | `[UnitTest]` | `[UnitTest]` | |
| 36 | +| 签名 | `void`,无参 | 同左 | 同左 | |
| 37 | +| static 方法 | **不支持** | 支持 | 支持 | |
| 38 | +| 跳过 | 无 | `[IgnoreTest]` 类级 | 无 | |
| 39 | +| 推荐基类 | `TestCaseBase` | 同左 | 多数未继承 | |
| 40 | + |
| 41 | +## 编写测试 |
| 42 | + |
| 43 | +### 最小示例 |
| 44 | + |
| 45 | +```csharp |
| 46 | +namespace Tests.CSharp |
| 47 | +{ |
| 48 | + class TC_MyFeature : TestCaseBase |
| 49 | + { |
| 50 | + [UnitTest] |
| 51 | + public void Addition() |
| 52 | + { |
| 53 | + Assert.Equal(3, 1 + 2); |
| 54 | + } |
| 55 | + } |
| 56 | +} |
| 57 | +``` |
| 58 | + |
| 59 | +- 类推荐命名 `TC_{主题}.cs` |
| 60 | +- 方法:`public void`、无参、`[UnitTest]` |
| 61 | +- basic-tester 要求**实例方法**(非 static) |
| 62 | + |
| 63 | +### Assert API(Common) |
| 64 | + |
| 65 | +| 方法 | 说明 | |
| 66 | +|------|------| |
| 67 | +| `Fail()` / `Fail(string)` | 立即失败 | |
| 68 | +| `IsTrue` / `IsFalse` / `True` / `False` | 布尔 | |
| 69 | +| `Null` / `NotNull` | 引用 | |
| 70 | +| `Equal` / `NotEqual` | 值相等 | |
| 71 | +| `EqualAny` | `Object.Equals` | |
| 72 | + |
| 73 | +### 放置指南 |
| 74 | + |
| 75 | +| 场景 | 项目 | 目录 | |
| 76 | +|------|------|------| |
| 77 | +| IL 指令(C#) | CoreTests | `Instructions/` | |
| 78 | +| C# 语言特性 | CoreTests | `Runtime/` | |
| 79 | +| Bug 回归 | CoreTests | `Regression/` | |
| 80 | +| Fixture | CoreTests | `Shared/Fixtures/` | |
| 81 | +| BCL icall | CorlibTests | `InternalCall/` | |
| 82 | +| 纯 IL asm | ILTests | `Instructions/*.il` + `Wrappers/` | |
| 83 | +| 跨解释器+AOT 共享 | SharedTests | `Instructions/` 或 `Runtime/` | |
| 84 | +| AOT 专有 | AotTests | 项目根目录 | |
| 85 | + |
| 86 | +### CoreTests 目录(摘要) |
| 87 | + |
| 88 | +```text |
| 89 | +CoreTests/ |
| 90 | +├── Runtime/ # C# 语言特性 |
| 91 | +├── Instructions/ # IL 指令(Arithmetic、Branches…) |
| 92 | +├── Regression/ # 历史 Bug |
| 93 | +├── Shared/Fixtures/ # 辅助类型(namespace AOTDefs) |
| 94 | +└── Bootstrap/ # C++ 引导测 |
| 95 | +``` |
| 96 | + |
| 97 | +### ILTests {#iltests} |
| 98 | + |
| 99 | +1. 在 `ILTests/Instructions/` 添加 `.il`,程序集名须为 **`ILTests.Native`** |
| 100 | +2. 在 `ILTests/Wrappers/` 添加 `TC_*.cs`,`[UnitTest]` 调用 IL 并断言 |
| 101 | +3. `dotnet build managed.sln` 会通过 ILAsm NuGet 编译 `.il` |
| 102 | + |
| 103 | +产出:`ILTests.Native.dll` + `ILTests.dll`(wrapper)。 |
| 104 | + |
| 105 | +### AotTests 专有用例(示例) |
| 106 | + |
| 107 | +| 文件 | 说明 | |
| 108 | +|------|------| |
| 109 | +| `TC_EvalStackNotEmpty.cs` | HL 转换 eval stack | |
| 110 | +| `TC_StaticCtorOrder.cs` | 静态构造器顺序 | |
| 111 | +| `TC_Call_AotInterp.cs` | AOT / 解释器混编 | |
| 112 | +| `TC_PInvoke.cs` | P/Invoke 相关 | |
| 113 | +| `TC_MonoPInvokeCallback.cs` | 回调 | |
| 114 | + |
| 115 | +依赖 `AOTDefs` 的通用测试留在 **CoreTests**,由解释器路径执行。 |
| 116 | + |
| 117 | +## 相关文档 |
| 118 | + |
| 119 | +- [测试指南](./testing) — 构建与运行 |
| 120 | +- [开发脚本](./dev-scripts) |
0 commit comments