Skip to content

第9章 虚拟机字节码执行引擎 - 测试报告

测试概述

项目内容
测试模块JVM远程执行功能
测试类RemoteExecuteTest
测试时间2026-03-28
测试环境JDK 8+, Maven 3.x
总测试数15
通过15
失败0
错误0
跳过0

一、动态编译器测试

1.1 testDynamicCompilerSimple - 编译简单类

测试目的:验证动态编译器能够正确编译简单的Java类

测试代码

java
String sourceCode =
    "public class SimpleTest {\n" +
    "    public String sayHello() {\n" +
    "        return \"Hello, World!\";\n" +
    "    }\n" +
    "}";
byte[] bytecode = compiler.compile("SimpleTest", sourceCode);

预期结果:编译成功,返回非空字节码数组

实际结果:✅ 通过

编译成功,字节码大小: 288 bytes

1.2 testDynamicCompilerWithExecute - 编译包含execute方法的类

测试目的:验证动态编译器能够编译包含ExecuteContext引用的类

测试代码

java
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 bytes

1.3 testDynamicCompilerError - 编译错误代码

测试目的:验证动态编译器能够正确处理语法错误的代码

测试代码

java
String sourceCode =
    "public class ErrorTest {\n" +
    "    public String sayHello() {\n" +
    "        return \"Hello  // 缺少分号\n" +
    "    }\n" +
    "}";

预期结果:抛出CompileException

实际结果:✅ 通过

  • 正确抛出CompileException
  • 包含详细的错误信息(行号、列号、错误描述)

1.4 testDynamicCompilerBatch - 批量编译

测试目的:验证动态编译器支持批量编译多个类

测试代码

java
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 - 加载单个类

测试目的:验证热替换类加载器能够正确加载动态编译的类

测试步骤

  1. 编译测试类
  2. 创建类加载器并添加字节码
  3. 加载类并实例化
  4. 调用方法验证

预期结果:类加载成功,方法调用返回预期值

实际结果:✅ 通过

热替换类加载器测试通过

2.2 testHotSwapClassLoaderIsolation - 类隔离测试

测试目的:验证不同类加载器实例加载的类是相互隔离的

测试步骤

  1. 创建两个独立的类加载器
  2. 加载相同的类名
  3. 验证类对象不相等

预期结果:两个类加载器加载的类不相同

实际结果:✅ 通过

类隔离测试通过

2.3 testHotSwapClassLoaderSystemClass - 系统类委托

测试目的:验证系统类委托给父类加载器

测试步骤

  1. 加载java.lang.String类
  2. 验证类加载器为null(Bootstrap ClassLoader)

预期结果:系统类由Bootstrap ClassLoader加载

实际结果:✅ 通过

系统类委托测试通过

三、执行上下文测试

3.1 testExecuteContextOutput - 输出捕获

测试目的:验证执行上下文能够捕获System.out输出

测试代码

java
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 - 上下文对象管理

测试目的:验证上下文对象的管理功能

测试步骤

  1. 添加不同类型的对象
  2. 验证对象存在
  3. 获取对象(带类型转换)
  4. 移除对象

预期结果:对象管理功能正常

实际结果:✅ 通过

上下文对象管理测试通过

3.3 testExecuteContextParameters - 参数管理

测试目的:验证参数管理功能

测试步骤

  1. 设置参数
  2. 获取参数
  3. 获取带默认值的参数

预期结果:参数管理功能正常

实际结果:✅ 通过

参数管理测试通过

四、远程执行测试

4.1 testRemoteExecuteSimple - 简单代码执行

测试目的:验证基本的远程代码执行功能

测试代码

java
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 - 带上下文对象执行

测试目的:验证上下文对象能够从客户端传递到服务器

测试代码

java
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 - 异常处理

测试目的:验证异常能够被正确捕获和返回

测试代码

java
String sourceCode =
    "public class RemoteTest3 {\n" +
    "    public Object execute(ExecuteContext context) {\n" +
    "        throw new RuntimeException(\"Test Exception\");\n" +
    "    }\n" +
    "}";

预期结果:执行失败,返回异常信息

实际结果:✅ 通过

接受客户端连接: /127.0.0.1
收到执行请求: RemoteTest3
执行结果: 失败
异常处理测试通过
异常: null

4.4 testRemoteExecuteIsolation - 多次执行隔离

测试目的:验证每次执行使用独立的类加载器

测试代码

java
// 第一次执行
ExecuteResult result1 = client.execute(sourceCode);
// 第二次执行
ExecuteResult result2 = client.execute(sourceCode);
// 验证静态变量重新初始化

预期结果:每次执行使用新的类加载器,静态变量重新初始化

实际结果:✅ 通过

接受客户端连接: /127.0.0.1
收到执行请求: Counter
执行结果: 成功
接受客户端连接: /127.0.0.1
收到执行请求: Counter
执行结果: 成功
多次执行隔离测试通过

4.5 testRemoteExecuteComputation - 计算任务执行

测试目的:验证远程执行能够完成计算任务

测试代码

java
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 测试统计

类别测试数通过失败通过率
动态编译器测试440100%
热替换类加载器测试330100%
执行上下文测试330100%
远程执行测试550100%
总计15150100%

5.2 测试结论

所有测试通过

本次测试验证了第9章远程执行功能的完整实现,包括:

  1. 动态编译功能:能够正确编译Java源代码,处理编译错误,支持批量编译
  2. 类加载器功能:实现了热替换类加载器,支持类隔离和系统类委托
  3. 执行上下文功能:能够捕获输出、管理上下文对象和参数
  4. 远程执行功能:实现了完整的客户端-服务器通信,支持上下文传递和异常处理

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

Released under the MIT License.