Spring Boot微服务的黑匣子测试是如此简单

当我需要进行原型设计,概念验证或在空闲时间使用一些新技术时,开始新项目对于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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值