测试EmergencyMonitor:单元测试与系统测试全解析
立即解锁
发布时间: 2025-08-19 01:22:51 阅读量: 2 订阅数: 8 


OSGi与Equinox:构建高度模块化的Java系统
### 测试EmergencyMonitor:单元测试与系统测试全解析
在软件开发过程中,测试是确保代码质量和系统稳定性的关键环节。本文将详细介绍如何对 `EmergencyMonitor` 进行单元测试和系统测试,包括测试环境的搭建、测试用例的编写以及测试的运行等内容。
#### 单元测试
单元测试主要关注应用程序的小功能单元,能够在 OSGi 之外对普通 Java 对象(POJOs)进行测试。下面将详细介绍如何进行 `EmergencyMonitor` 的单元测试。
##### 1. 创建测试项目
为了将测试代码与被测试的紧急监控代码分开,我们可以使用片段包(Fragment Bundles)来解决 `EmergencyMonitor` 类对其他项目不可见的问题。片段包允许将可选功能添加到另一个包(主机包)中,在运行时片段会与主机合并,并可以完全访问主机中的所有包,非常适合包含单元测试。
创建包含新测试的片段项目的步骤如下:
1. 选择 `File > New > Project`,展开 `Plug-in Development` 并选择 `Fragment Project`,创建一个名为 `org.equinoxosgi.toast.client.emergency.test` 的片段项目。
2. 在向导的最后一页,选择 `org.equinoxosgi.toast.client.emergency` 作为主机插件,并选择 `J2SE 1.5` 作为执行环境(Easy - Mock 需要 Java 1.5)。
3. 打开片段包的清单编辑器,切换到 `Dependencies` 选项卡,在 `Automated Management of Dependencies` 部分添加以下包:
- `org.equinoxosgi.toast.core`
- `org.equinoxosgi.toast.core.emergency`
- `org.equinoxosgi.toast.dev.gps`
- `org.equinoxosgi.toast.dev.airbag`
- `org.equinoxosgi.toast.core.channel.sender`
- `org.junit`
- `org.easymock`
这五个 Toast 包提供对应用程序代码的访问,另外两个包提供对 JUnit 和 EasyMock 测试框架的访问。
##### 2. 创建测试用例类
创建一个名为 `EmergencyMonitorTestCase` 的类,放在 `org.equinoxosgi.toast.client.emergency.test` 包中,继承自 `junit.framework.TestCase`。以下是完整的类代码:
```java
public class EmergencyMonitorTestCase extends TestCase implements IEmergencyConstants, ICoreConstants {
public void testAirbagDeploy() throws Exception {
EmergencyMonitor emergencyMonitor = new EmergencyMonitor();
IGps gps = createMock(IGps.class);
expect(gps.getLatitude()).andReturn(123).once();
expect(gps.getLongitude()).andReturn(456).once();
expect(gps.getHeading()).andReturn(789).once();
expect(gps.getSpeed()).andReturn(10).once();
IAirbag airbag = createMock(IAirbag.class);
airbag.addListener(emergencyMonitor);
expectLastCall().once();
airbag.removeListener(emergencyMonitor);
expectLastCall().once();
IChannel channel = createMock(IChannel.class);
final ChannelMessage message = new ChannelMessage(EMERGENCY_FUNCTION);
message.addParameter(ID_PARAMETER, ID_DEFAULT);
message.addParameter(LATITUDE_PARAMETER, 123);
message.addParameter(LONGITUDE_PARAMETER, 456);
message.addParameter(HEADING_PARAMETER, 789);
message.addParameter(SPEED_PARAMETER, 10);
ByteArrayInputStream reply = new ByteArrayInputStream("Help is on its way!".getBytes());
expect(channel.send(message)).andReturn(reply).once();
replay(gps, airbag, channel);
emergencyMonitor.setGps(gps);
emergencyMonitor.setAirbag(airbag);
emergencyMonitor.setChannel(channel);
emergencyMonitor.startup();
emergencyMonitor.deployed();
Delay.seconds(1); // wait for emergency monitor thread to complete
emergencyMonitor.shutdown();
verify(channel, gps, airbag);
}
}
```
##### 3. 管理静态导入
由于 Eclipse 的组织导入功能不会引入静态导入,需要在编译单元的导入语句中添加以下行,然后再次组织导入:
```java
import static org.easymock.EasyMock.*;
```
组织导入后,这一行将扩展为每个导入函数的单独行。
##### 4. 测试用例分析
该测试创建了一个 `EmergencyMonitor`,然后使用 EasyMock 模拟了一个 GPS、安全气囊和通道。`testAirbagDeploy` 方法的前三个部分设置了测试的预期,即告诉每个模拟对象期望的 API 调用次数以及返回值。最后一部分进行实际测试,`replay` 方法告诉模拟对象后续调用是真实的,然后将模拟对象注入到 `EmergencyMonitor` 中,并触发其 `deployed` 方法模拟安全气囊展开。在这个过程中,EasyMock 会将结果与原始预期进行比较,捕获任何差异。最后,`verify` 方法确保模拟对象的所有预期都得到满足,任何异常或未满足的预期都会导致测试用例失败。
需要注意的是,在测试用例关闭 `EmergencyMonitor` 之前有一秒的延迟。这是因为 `EmergencyMonitor` 在与调用 `deployed` 方法的线程不同的线程中执行其处理。如果没有延迟,测试用例可能会在另一个线程中的紧急处理完成之前调用 `shutdown` 方法。一般来说,在测试用例中使用延迟是不推荐的,因为这可能导致测试用例在快速机器上通过而在较慢机器上失败,使用时要格外小心。
##### 5. 运行单元测试
编写好 `EmergencyMonitorTestCase` 后,运行测试非常简单:
从测试用例类的上下文菜单中选择 `Run As > JUnit Test`,结果将显示在 JUnit 视图中。视图应显示一个绿色实心条,失败次数为零,表示测试用例通过。
#### 系统测试
系统测试的优势与单元测试相反,它将整个应用程序与所有组件一起进行测试,以确保应用程序在完整的环境中正常工作。
##### 1. 测试策略
系统测试的策略与单元测试相反,要尽可能多地测试应用程序,就意味着尽可能少地模拟应用程序。为了了解系统测试的工作原理,我们可以回顾之前的测试方式。之前我们使用一个每五秒自动展开的假安全气囊,然后在通道实现和后端添加一些日志记录,通过查看控制台来验证应用程序是否正确响应。
现在我们可以创建一个自动化系统测试,其工作方式大致相同,但有两个变化:
- 不再使用自动展开的安全气囊,而是构建一个自己的模拟安全气囊,该安全气囊在测试用例的命令下展开。
- 不再用眼睛查看控制台上记录的消息,而是创建一个模拟 `LogService`,允许测试用例验证记录的消息是否符合预期。
此外,为了利用测试系统作为包运行的优势,我们将以编程方式停止和重新启动 GPS 包,以验证应用程序是否正确响应。
##### 2. 创建测试框架
测试框架由模拟安全气囊和模拟 `LogService` 组成,这些需要作为服务提供给应用程序的其他部分,因此我们还需要一个 DS 组件来提供它们。
创建系统测试包并添加适当依赖的步骤如下:
1. 创建一个名为 `org.equinoxosgi.toast.system.test` 的新包项目。
2. 在清单编辑器中,在 `Automated Management of Dependencies` 列表中添加以下包:
- `org.eclipse.osgi`
- `org.eclipse.osgi.services`
- `org.equinoxosgi.toast.dev.airbag`
- `org.equinoxosgi.toast.dev.gps`
- `org.junit`
3. 保存编辑器内容。
##### 3. 创建模拟安全气囊
创建一个名为 `MockAirbag` 的类,放在 `org.equinoxosgi.toast.system.test` 包中,实现 `IAirbag` 接口,并添加一个公共方法 `deploy`,允许测试用例触发安全气囊展开
0
0
复制全文
相关推荐










