当我需要进行原型设计,概念验证或在空闲时间使用一些新技术时,开始新项目对于Maven来说总是有点烦人。 不得不说,设置Maven项目并不难,您可以使用Maven原型。 但是原型通常是过时的。 谁想玩旧技术? 因此,我总是以自己想玩的依赖关系为最终结局。 花费的时间不是很有效。
但是,比起Spring Boot来了我的方式。 我恋爱了。 在过去的几个月中,我至少创建了50个小型操场项目,并使用Spring Boot制作了原型。 在工作中也将其合并。 它非常适合原型,学习,微服务,Web,批处理,企业,消息流或命令行应用程序。 您必须是恐龙,或是盲目不去为下一个Spring项目评估Spring Boot。 当您完成评估后,便会继续努力。 我承诺。
我觉得有必要强调一下Spring Boot微服务的黑匣子测试有多么容易。 黑匣子测试指的是无需戳入任何应用程序工件的测试。 这种测试也可以称为集成测试。 您还可以执行性能或压力测试方式,以进行演示。
Spring Boot Microservice通常是带有嵌入式Tomcat的Web应用程序。 因此它从命令行作为JAR执行。 可以将Spring Boot项目转换为WAR工件,该工件可以托管在共享Servlet容器中 。 但是我们现在不想要那样。 当微服务拥有自己的嵌入式容器时,效果会更好。
我使用现有的Spring REST服务指南作为测试目标。 重点主要放在测试项目上,因此以“ Hello World” REST应用程序为例很方便。 我希望在您的计算机上设置并安装以下两个常用工具:
因此,我们需要下载源代码并将JAR工件安装到我们的本地存储库中。 我将使用命令行下载并安装微服务。 让我们进入下载源代码的目录。 使用以下命令:
git clone git@github.com:spring-guides/gs-rest-service.git
cd gs-rest-service/complete
mvn clean install
如果一切顺利,那么现在将Spring Boot微服务JAR工件安装在我们的本地Maven存储库中。 在认真的Java开发中,宁愿将其安装到共享存储库中(例如Artifactory,Nexus等)。 安装我们的微服务后,我们可以专注于测试项目。 它也是基于Maven和Spring Boot的。
黑匣子测试将通过从Maven存储库下载工件来实现(无论它是本地的还是远程的都无所谓)。 Maven依赖插件可以通过以下方式帮助我们:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>compile</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<includeArtifactIds>gs-rest-service</includeArtifactIds>
<stripVersion>true</stripVersion>
</configuration>
</execution>
</executions>
</plugin>
默认情况下,它将微服务工件下载到target/dependency
目录。 如您所见,它已挂接到Maven生命周期的compile
阶段,因此在test
阶段可以使用下载的工件。 从版本信息中删除了工件版本。 我们使用最新版本。 它使测试过程中JAR工件的使用更加容易。
精通Maven的读者可能会注意到缺少插件版本。 Spring Boot驱动的项目继承自名为spring-boot-starter-parent
父Maven项目。 。 它包含主要Maven插件的版本。 这是Spring Boot的自以为是的方面之一。 我喜欢它,因为它提供了稳定的依赖关系矩阵。 您可以根据需要更改版本。
当文件系统中有工件时,就可以开始测试。 我们需要能够从命令行执行JAR文件。 我通过这种方式使用标准的Java ProcessBuilder :
public class ProcessExecutor {
public Process execute(String jarName) throws IOException {
Process p = null;
ProcessBuilder pb = new ProcessBuilder("java", "-jar", jarName);
pb.directory(new File("target/dependency"));
File log = new File("log");
pb.redirectErrorStream(true);
pb.redirectOutput(Redirect.appendTo(log));
p = pb.start();
return p;
}
}
此类基于给定的文件名执行给定的进程JAR。 位置被硬编码到target/dependency
目录中,其中maven-dependency-plugin
定位了我们的工件。 标准和错误输出将重定向到文件。 测试所需的下一个类是DTO(数据传输对象)。 这是简单的POJO,将用于从JSON反序列化。 我使用Lombok项目来减少getter,setter,hashCode和equals所需的样板代码。
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Greeting {
private long id;
private String content;
}
测试本身如下所示:
public class BlackBoxTest {
private static final String RESOURCE_URL = "http://localhost:8080/greeting";
@Test
public void contextLoads() throws InterruptedException, IOException {
Process process = null;
Greeting actualGreeting = null;
try {
process = new ProcessExecutor().execute("gs-rest-service.jar");
RestTemplate restTemplate = new RestTemplate();
waitForStart(restTemplate);
actualGreeting = restTemplate.getForObject(RESOURCE_URL, Greeting.class);
} finally {
process.destroyForcibly();
}
Assert.assertEquals(new Greeting(2L, "Hello, World!"), actualGreeting);
}
private void waitForStart(RestTemplate restTemplate) {
while (true) {
try {
Thread.sleep(500);
restTemplate.getForObject(RESOURCE_URL, String.class);
return;
} catch (Throwable throwable) {
// ignoring errors
}
}
}
}
它首先执行Spring Boot微服务进程,然后等待它启动。 要验证微服务是否已启动,它将HTTP请求发送到期望的URL。 首次成功响应后,该服务即可进行测试。 微服务应为HTTP GET请求发送简单的问候语JSON响应。 在测试结束时,已验证了从JSON到我们的Greeting
DTO的反序列化。
翻译自: https://www.javacodegeeks.com/2014/12/black-box-testing-of-spring-boot-microservice-is-so-easy.html