当我需要进行原型设计,概念验证或在空闲时间使用一些新技术时,开始新项目对于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应用程序为例很方便。 我希望在您的计算机上设置并安装以下两个常用工具:
- Maven 3
- 吉特
因此,我们需要下载源代码并将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";@Testpublic 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的反序列化。
- 源代码在Github上共享 。
翻译自: https://www.javacodegeeks.com/2014/12/black-box-testing-of-spring-boot-microservice-is-so-easy.html