跳到主要内容

测试框架

目录结构

tests/
├── basic-tester/ # C++ runner(CI)
├── aot-tester/ # AOT runner
├── managed/
│ ├── managed.sln
│ ├── Common/ # Assert、[UnitTest]、TestCaseBase
│ ├── SharedTests/ # 共享源,链入 CoreTests / AotTests
│ ├── CoreTests/ # CLR / IL / C# 语义
│ ├── CorlibTests/ # BCL icall / intrinsic
│ ├── AotTests/ # LeanAOT 专有
│ ├── ILTests/ # .il + wrapper
│ └── RunTests/ # C# 反射 runner(本地)
└── TESTING.md # 仓库内简短索引(指向文档站)

测试项目职责

项目测什么不应放什么
CoreTests解释器、IL(C# 可写)、C# 特性、回归BCL icall 细节、AOT 链路专有
CorlibTestsmscorlib / System:icall、intrinsic、P/Invoke纯 CLR 指令语义
ILTestsC# 难构造的 IL(.il + ilasm)可用 C# 表达的用例
AotTestsIL→C++ 后正确性与 CoreTests 完全重复的指令测
Common基础设施测试用例本身

Runner 发现规则

规则basic-testerRunTestsAotTests.App
标记[UnitTest][UnitTest][UnitTest]
签名void,无参同左同左
static 方法不支持支持支持
跳过[IgnoreTest] 类级
推荐基类TestCaseBase同左多数未继承

编写测试

最小示例

namespace Tests.CSharp
{
class TC_MyFeature : TestCaseBase
{
[UnitTest]
public void Addition()
{
Assert.Equal(3, 1 + 2);
}
}
}
  • 类推荐命名 TC_{主题}.cs
  • 方法:public void、无参、[UnitTest]
  • basic-tester 要求实例方法(非 static)

Assert API(Common)

方法说明
Fail() / Fail(string)立即失败
IsTrue / IsFalse / True / False布尔
Null / NotNull引用
Equal / NotEqual值相等
EqualAnyObject.Equals

放置指南

场景项目目录
IL 指令(C#)CoreTestsInstructions/
C# 语言特性CoreTestsRuntime/
Bug 回归CoreTestsRegression/
FixtureCoreTestsShared/Fixtures/
BCL icallCorlibTestsInternalCall/
纯 IL asmILTestsInstructions/*.il + Wrappers/
跨解释器+AOT 共享SharedTestsInstructions/Runtime/
AOT 专有AotTests项目根目录

CoreTests 目录(摘要)

CoreTests/
├── Runtime/ # C# 语言特性
├── Instructions/ # IL 指令(Arithmetic、Branches…)
├── Regression/ # 历史 Bug
├── Shared/Fixtures/ # 辅助类型(namespace AOTDefs)
└── Bootstrap/ # C++ 引导测

ILTests

  1. ILTests/Instructions/ 添加 .il,程序集名须为 ILTests.Native
  2. ILTests/Wrappers/ 添加 TC_*.cs[UnitTest] 调用 IL 并断言
  3. dotnet build managed.sln 会通过 ILAsm NuGet 编译 .il

产出:ILTests.Native.dll + ILTests.dll(wrapper)。

AotTests 专有用例(示例)

文件说明
TC_EvalStackNotEmpty.csHL 转换 eval stack
TC_StaticCtorOrder.cs静态构造器顺序
TC_Call_AotInterp.csAOT / 解释器混编
TC_PInvoke.csP/Invoke 相关
TC_MonoPInvokeCallback.cs回调

依赖 AOTDefs 的通用测试留在 CoreTests,由解释器路径执行。

相关文档