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

spring

spring

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

spring

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值