第9章 虚拟机字节码执行引擎 - 测试报告
测试概述
| 项目 | 内容 |
|---|---|
| 测试模块 | JVM远程执行功能 |
| 测试类 | RemoteExecuteTest |
| 测试时间 | 2026-03-28 |
| 测试环境 | JDK 8+, Maven 3.x |
| 总测试数 | 15 |
| 通过 | 15 |
| 失败 | 0 |
| 错误 | 0 |
| 跳过 | 0 |
一、动态编译器测试
1.1 testDynamicCompilerSimple - 编译简单类
测试目的:验证动态编译器能够正确编译简单的Java类
测试代码:
String sourceCode =
"public class SimpleTest {\n" +
" public String sayHello() {\n" +
" return \"Hello, World!\";\n" +
" }\n" +
"}";
byte[] bytecode = compiler.compile("SimpleTest", sourceCode);预期结果:编译成功,返回非空字节码数组
实际结果:✅ 通过
编译成功,字节码大小: 288 bytes1.2 testDynamicCompilerWithExecute - 编译包含execute方法的类
测试目的:验证动态编译器能够编译包含ExecuteContext引用的类
测试代码:
String sourceCode =
"import com.linsir.abc.core.jvm.remote.context.ExecuteContext;\n" +
"public class ExecuteTest {\n" +
" public Object execute(ExecuteContext context) {\n" +
" context.getOut().println(\"Test Output\");\n" +
" return \"Success\";\n" +
" }\n" +
"}";预期结果:编译成功,字节码有效
实际结果:✅ 通过
编译成功,字节码大小: 541 bytes1.3 testDynamicCompilerError - 编译错误代码
测试目的:验证动态编译器能够正确处理语法错误的代码
测试代码:
String sourceCode =
"public class ErrorTest {\n" +
" public String sayHello() {\n" +
" return \"Hello // 缺少分号\n" +
" }\n" +
"}";预期结果:抛出CompileException
实际结果:✅ 通过
- 正确抛出CompileException
- 包含详细的错误信息(行号、列号、错误描述)
1.4 testDynamicCompilerBatch - 批量编译
测试目的:验证动态编译器支持批量编译多个类
测试代码:
Map<String, String> sources = new HashMap<>();
sources.put("ClassA", "public class ClassA { ... }");
sources.put("ClassB", "public class ClassB { ... }");
sources.put("ClassC", "public class ClassC { ... }");
Map<String, byte[]> bytecodes = compiler.compileBatch(sources);预期结果:所有类编译成功
实际结果:✅ 通过
批量编译成功,共编译 3 个类二、热替换类加载器测试
2.1 testHotSwapClassLoaderSingle - 加载单个类
测试目的:验证热替换类加载器能够正确加载动态编译的类
测试步骤:
- 编译测试类
- 创建类加载器并添加字节码
- 加载类并实例化
- 调用方法验证
预期结果:类加载成功,方法调用返回预期值
实际结果:✅ 通过
热替换类加载器测试通过2.2 testHotSwapClassLoaderIsolation - 类隔离测试
测试目的:验证不同类加载器实例加载的类是相互隔离的
测试步骤:
- 创建两个独立的类加载器
- 加载相同的类名
- 验证类对象不相等
预期结果:两个类加载器加载的类不相同
实际结果:✅ 通过
类隔离测试通过2.3 testHotSwapClassLoaderSystemClass - 系统类委托
测试目的:验证系统类委托给父类加载器
测试步骤:
- 加载java.lang.String类
- 验证类加载器为null(Bootstrap ClassLoader)
预期结果:系统类由Bootstrap ClassLoader加载
实际结果:✅ 通过
系统类委托测试通过三、执行上下文测试
3.1 testExecuteContextOutput - 输出捕获
测试目的:验证执行上下文能够捕获System.out输出
测试代码:
context.redirectSystemOut();
System.out.println("Test Line 1");
System.out.println("Test Line 2");
context.restoreSystemOut();
String output = context.getOutput();预期结果:输出内容包含"Test Line 1"和"Test Line 2"
实际结果:✅ 通过
输出捕获测试通过3.2 testExecuteContextObjects - 上下文对象管理
测试目的:验证上下文对象的管理功能
测试步骤:
- 添加不同类型的对象
- 验证对象存在
- 获取对象(带类型转换)
- 移除对象
预期结果:对象管理功能正常
实际结果:✅ 通过
上下文对象管理测试通过3.3 testExecuteContextParameters - 参数管理
测试目的:验证参数管理功能
测试步骤:
- 设置参数
- 获取参数
- 获取带默认值的参数
预期结果:参数管理功能正常
实际结果:✅ 通过
参数管理测试通过四、远程执行测试
4.1 testRemoteExecuteSimple - 简单代码执行
测试目的:验证基本的远程代码执行功能
测试代码:
String sourceCode =
"import com.linsir.abc.core.jvm.remote.context.ExecuteContext;\n" +
"public class RemoteTest1 {\n" +
" public Object execute(ExecuteContext context) {\n" +
" context.getOut().println(\"Remote execution works!\");\n" +
" return \"Success\";\n" +
" }\n" +
"}";
ExecuteResult result = client.execute(sourceCode);预期结果:执行成功,返回"Success"
实际结果:✅ 通过
远程执行服务器已启动,端口: 19999
接受客户端连接: /127.0.0.1
收到执行请求: RemoteTest1
执行结果: 成功
远程执行测试通过
输出: Remote execution works!4.2 testRemoteExecuteWithContext - 带上下文对象执行
测试目的:验证上下文对象能够从客户端传递到服务器
测试代码:
Map<String, Object> context = new HashMap<>();
context.put("message", "Hello from client");
context.put("count", 100);
ExecuteResult result = client.execute(sourceCode, context);预期结果:服务器能够访问客户端传递的上下文对象
实际结果:✅ 通过
接受客户端连接: /127.0.0.1
收到执行请求: RemoteTest2
执行结果: 成功
带上下文对象的远程执行测试通过4.3 testRemoteExecuteException - 异常处理
测试目的:验证异常能够被正确捕获和返回
测试代码:
String sourceCode =
"public class RemoteTest3 {\n" +
" public Object execute(ExecuteContext context) {\n" +
" throw new RuntimeException(\"Test Exception\");\n" +
" }\n" +
"}";预期结果:执行失败,返回异常信息
实际结果:✅ 通过
接受客户端连接: /127.0.0.1
收到执行请求: RemoteTest3
执行结果: 失败
异常处理测试通过
异常: null4.4 testRemoteExecuteIsolation - 多次执行隔离
测试目的:验证每次执行使用独立的类加载器
测试代码:
// 第一次执行
ExecuteResult result1 = client.execute(sourceCode);
// 第二次执行
ExecuteResult result2 = client.execute(sourceCode);
// 验证静态变量重新初始化预期结果:每次执行使用新的类加载器,静态变量重新初始化
实际结果:✅ 通过
接受客户端连接: /127.0.0.1
收到执行请求: Counter
执行结果: 成功
接受客户端连接: /127.0.0.1
收到执行请求: Counter
执行结果: 成功
多次执行隔离测试通过4.5 testRemoteExecuteComputation - 计算任务执行
测试目的:验证远程执行能够完成计算任务
测试代码:
String sourceCode =
"public class Calculator {\n" +
" public Object execute(ExecuteContext context) {\n" +
" int n = 100;\n" +
" long sum = 0;\n" +
" for (int i = 1; i <= n; i++) {\n" +
" sum += i;\n" +
" }\n" +
" context.getOut().println(\"Sum of 1 to \" + n + \" = \" + sum);\n" +
" return sum;\n" +
" }\n" +
"}";预期结果:计算结果正确(1+2+...+100=5050)
实际结果:✅ 通过
接受客户端连接: /127.0.0.1
收到执行请求: Calculator
执行结果: 成功
计算任务测试通过
输出: Sum of 1 to 100 = 5050五、测试总结
5.1 测试统计
| 类别 | 测试数 | 通过 | 失败 | 通过率 |
|---|---|---|---|---|
| 动态编译器测试 | 4 | 4 | 0 | 100% |
| 热替换类加载器测试 | 3 | 3 | 0 | 100% |
| 执行上下文测试 | 3 | 3 | 0 | 100% |
| 远程执行测试 | 5 | 5 | 0 | 100% |
| 总计 | 15 | 15 | 0 | 100% |
5.2 测试结论
✅ 所有测试通过
本次测试验证了第9章远程执行功能的完整实现,包括:
- 动态编译功能:能够正确编译Java源代码,处理编译错误,支持批量编译
- 类加载器功能:实现了热替换类加载器,支持类隔离和系统类委托
- 执行上下文功能:能够捕获输出、管理上下文对象和参数
- 远程执行功能:实现了完整的客户端-服务器通信,支持上下文传递和异常处理
5.3 关键验证点
- ✅ 内存编译不生成文件
- ✅ 类加载器隔离性
- ✅ 双亲委派模型打破
- ✅ 系统类正确委托
- ✅ 输出捕获功能
- ✅ 上下文对象传递
- ✅ 异常正确处理
- ✅ 多次执行隔离
5.4 最终输出
[INFO] Tests run: 15, Failures: 0, Errors: 0, Skipped: 0
[INFO] BUILD SUCCESS
远程执行服务器已停止附录:测试环境信息
操作系统: Windows
JDK版本: 8+
Maven版本: 3.x
测试框架: JUnit 5
测试端口: 19999
线程池大小: 5