功能测试描述系统的功能并测试系统的功能是否按预期工作。功能测试通常通过为功能提供特定输入并验证输出是否与预期相符来完成。由于功能测试是黑盒测试的一种形式,因此你可以在不了解应用程序内部部分的情况下测试软件的功能。
使用 Liberty 进行功能测试的三种方法
使用 IBM WebSphere Liberty 和 Open Liberty 进行功能测试的方法有很多种。本文涵盖了我认为最适合这些平台的 3 种方法:
- 使用构建脚本/工具来启动和停止 Liberty 服务器
- 使用 JUnit 规则启动和停止 Liberty 服务器
- 使用 Arquillian 启动和停止 Liberty 服务器
使用 Maven 构建
Liberty 支持最常见的构建工具,例如 Maven、Gradle 和 Ant。你可以使用这些工具中的任何一个来对你的应用程序运行测试,但本文重点介绍 Maven。
使用 Maven 等构建系统构建应用程序的一个好处是,你可以将其配置为运行一组自动化测试。war插件扩展了Java插件,提供了测试任务。你可以为正在运行的应用程序服务器之外的各个代码单元编写测试(单元测试),也可以编写它们来调用在服务器上运行的应用程序(集成测试)。
使用通用构建工具的优势
使用 Maven、Ant 或 Gradle 等构建工具的一些好处包括:
- 它使 Java 代码保持简单;JUnit 测试类中不需要特殊的设置代码。
- 你正在测试的工件是包含配置和构建生成的应用程序 WAR 的用户目录,因此它正在密切测试生产工件。
- 远程部署工件(例如,在云中)并针对该部署运行测试非常简单,而无需更改测试代码。
使用通用构建工具的缺点
使用常见构建工具的一些可能的缺点包括:
- 对 Maven 插件(或其他构建工具插件)有额外的依赖性。
- 你只能从构建工具自动运行测试。如果不先手动启动服务器,就不能从 Eclipse(或其他 IDE)中执行此操作。
使用 JUnit 规则
使用 JUnit ClassRule 允许您使用 Liberty 系统编程接口 (SPI) 从你的代码中控制你的 Liberty 服务器。从这里,你可以配置服务器,同时还可以启动和停止服务器。
下面的示例是我们从测试类中以编程方式启动和停止 Liberty 服务器的示例:
public class RuleFunctionalTest {
@ClassRule
public static ExternalResource serverResource = new ServerResource();
public static class ServerResource extends ExternalResource {
private final Server server;
public ServerResource() {
String usrDir = System.getProperty("liberty.usr.dir");
String serverName = System.getProperty("liberty.server.name");
ServerBuilder sb = new ServerBuilder();
server = sb.setName(serverName).setUserDir(new File(usrDir)).build();
}
@Override
protected void before() throws Throwable {
Future<Result> startReturnCode = server.start();
Result result = startReturnCode.get();
assertEquals(true, result.successful());
}
@Override
protected void after() {
Future<Result> stopReturnCode = server.stop();
try {
Result result = stopReturnCode.get();
assertEquals(true, result.successful());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
fail("Caught exception stopping server" + e.getMessage());
}
}
}
}
使用 JUnit 规则的优势
使用 JUnit 规则的一些好处包括:
- 使用 JUnit 规则可以使构建代码保持简单。您只需创建一个新的测试任务和源集的标准 Maven 设置。
- 你可以使用 IDE 以及通过构建来运行它。
- 没有外部依赖。
使用 JUnit 规则的缺点
使用 JUnit 规则的一些缺点包括:
- 使用此规则会使 Java 代码复杂化,因为它负责启动和停止 Liberty 服务器以及运行测试。
- 部署到不同的位置比较困难,因为这都是通过 Java API 完成的。
- 你需要构建一个功能齐全的 Liberty 用户目录结构,包括你的服务器配置和应用程序。在此示例中,这非常适合这种情况,因为这已经是构建的输出,但情况并非总是如此。
使用 Arquillian
在 Libery 中进行功能测试的最后一种技术是使用Arquillian,这是一个测试框架,可为你的 Java 应用程序开发自动化的功能、集成和验收测试。Arquillian 为您设置测试环境并处理应用程序服务器生命周期,以便你可以专注于编写测试。
使用 Arquillian 进行功能测试的优势
使用 Arquillian 的一些好处包括:
- 它允许您使用 ShrinkWrap 通过测试创建和部署测试存档。在运行测试之前,无需构建功能齐全的 Liberty 服务器。
- 你可以使用 IDE 以及通过构建运行 Arquillian。
- Arquillian 是功能最丰富的选项。例如,你可以针对多个容器(应用程序服务器)和远程服务器运行测试。
- 将应用程序的正确 URL 传递给测试,因此可以更灵活地控制测试环境的端口号等。
使用 Arquillian 进行功能测试的缺点
- Arquillian 仍然需要定义一个骨架服务器,它必须进入主服务器运行时安装位置(不支持单独的用户目录)。
- 你正在测试的应用程序是由 Arquillian 通过 ShrinkWrap 工具创建的。你不会部署此实际应用程序或拥有此服务器配置。
结束语
如果你已经在构建 Liberty 用户目录,那么使用构建工具或 JUnit 规则来启动和停止服务器的简单性很有吸引力。但是,如果你希望能够准确控制部署的内容,或者你想针对多个容器进行测试,那么 Arquillian 提供了这些功能。