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应用程序为例很方便。 我希望在您的计算机上设置并安装以下两个常用工具:

  • 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sharepoint ECMAScript对象模型系列

转载&#xff1a;Sharepoint学习笔记—ECMAScript对象模型系列-- 8、组与用户操作(一) http://www.cnblogs.com/wsdj-ITtech/archive/2012/06/08/2416967.html 转载于:https://www.cnblogs.com/EricLee007/archive/2012/06/08/2541636.html

c++ static关键字的作用

名称  全局静态变量  局部静态变量   静态函数  类的静态成员类的静态函数形式  全局变量前加static局部变量前加static 函数返回类型前加static类成员前加static类成员函数前加static存储区域 静态存储区 运行期间一直存在 静态存储区 运行期间一直存在 作用域…

单片机第三季-第七课:STM32中断体系

目录 1&#xff0c;NVIC 2&#xff0c;中断和事件的区别 3&#xff0c;优先级的概念 4&#xff0c;如何实际编程使用外部中断 5&#xff0c;STM32开发板通过按键控制LED 5.1&#xff0c;打开相应GPIO模块时钟 5.2&#xff0c;NVIC设置 5.3&#xff0c;外部中断线和配套…

【学亮IT手记】angularJS select2多选下拉框实例

永远保持对大部分知识的好奇心&#xff0c;学习从不枯燥&#xff0c;也没有被逼学习一说&#xff0c;乐此不疲才是该有的心态和境界&#xff01;&#xff01;&#xff01; 引入相关js库&#xff1a; html部分代码&#xff1a; angularJS定义数据源变量&#xff1a; 更多专业前端…

虚拟主机相关业务知识介绍

什么是虚拟主机&#xff1f; 虚拟主机是使用特殊的软硬件技术&#xff0c;把一台运行在因特网上的服务器主机分成一台台“虚拟”的主机&#xff0c;每一台虚拟主机都具有独立的域名&#xff0c;具有完整的Internet服务器&#xff08;WWW、FTP、Email等&#xff09;功能&#xf…

在CXF API和拦截器中添加Gzip压缩

如今&#xff0c;由于我们在响应中发送大量数据&#xff0c;因此必须对API响应执行Gzip压缩。 它节省了网络带宽和交付时间&#xff0c;当然还节省了Internet上的空间。 CXF提供了以多种方式使用Gzip压缩的选项。 蓝图 注解 蓝图&#xff1a; <bean id"gZipInterce…

zTree树形菜单交互选项卡效果实现

1、 添加自定义属性 page 2、 为 ztree 每个树形节点&#xff0c;添加点击事件 1 <!DOCTYPE html>2 <html>3 4 <head>5 <meta charset"UTF-8">6 <title>ztree树形菜单的使用</title>7 <!-- 导入…

windows 服务部署管理

通过创建bat文件&#xff0c;能够快速的对服务进行部署和卸载。 部署的命令如下&#xff1a; $SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe [exename] Net Start [servicename] sc config [servicename] startauto 卸载的命令如下: $SystemRoot%\Microsof…

oracle中sql语句的优化(转帖)

一、执行顺序及优化细则 1.表名顺序优化 (1) 基础表放下面,当两表进行关联时数据量少的表的表名放右边 表或视图: Student_info (30000条数据) Description_info (30条数据) select * from description_info di ,student_info si --学生信息表 where si.student…

Devoxx Hackergarten的企业Web应用程序原型

我已经连续10年参加DevoxxBe了 。 这是我最喜欢的Java会议&#xff0c;但是谈话时间表并不总是最佳的&#xff1a;有时我想同时看2个精彩的谈话&#xff01; 因此&#xff0c;在Devoxx的Hackergarten&#xff0c;在参加讲座之间&#xff0c;我们中的一些人开始构建Web应用程序以…

C# 加载C++的dll

[DllImport("kernel32")] private static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)]string fileName) 转载于:https://www.cnblogs.com/sky-jyq/p/11509059.html

谈一谈Http Request 与 Http Response

谈一谈Http Request 与 Http Response   写在前面的话&#xff1a;最近帮朋友弄弄微信商城&#xff0c;对于微信的基础开发&#xff0c;基本上就是各种post、get&#xff0c;有时是微信服务器向我们的服务器post、get数据&#xff0c;有时需要我们自己的服务器向微信服务器各…

Linux常用命令和vi,gdb的使用

1.ls 命令 --------------------------------------------------------------------- ls以默认方式显示当前目录文件列表 ls -a显示所有文件包括隐藏文件 ls -l显示文件属性&#xff0c;包括大小&#xff0c;日期&#xff0c;符号连接&#xff0c;是否可读写及是否可执行 -----…

增压的jstack:如何以100mph的速度调试服务器

使用jstack调试实时Java生产服务器的指南 jstack就像U2一样-从时间的黎明就一直在我们身边&#xff0c;我们似乎无法摆脱它 。 除了笑话&#xff0c;到目前为止&#xff0c;jstack是您调试军用生产服务器中最方便的工具之一。 即便如此&#xff0c;我仍然认为它在情况恶化时能够…

(网页)css和js的版本号问题

HTML页面自动清理js、css文件的缓存,之前用的是?v11每次都要找寻到网页进行更改,非常的麻烦. <script type"text/javascript"> document.write("<script typetext/javascript srcjs/xxxx?v" new Date().getTime() ">"); </s…

wchar_t 的输出问题

wchar_t 定义的变量之所以不能输出呢&#xff1f;我查了一下资料&#xff0c;就是说宽字符类型要本地化&#xff0c;否则输不出想要结果。本地化有三条语句可以使用&#xff0c;任取其一。最后一句是全局函数&#xff0c;前两个是wcout的一个成员函数的两种表达方式。std::wcou…

Apache Cassandra和Java入门(第二部分)

要求 要遵循本教程&#xff0c;您应该已经有一个正在运行的Cassandra实例&#xff08; 一个小型集群会很好 &#xff0c;但不是必需的&#xff09;&#xff0c;已安装Datastax Java驱动程序&#xff08; 请参阅第I部分 &#xff09;&#xff0c;并且已经在这里进行了10分钟的演…

Zabbix监控多个JVM进程

一、场景说明&#xff1a; 我们这边的环境用的是微服务&#xff0c;每个程序都是有单独的进程及单独的端口号&#xff0c;但用jps查询出来的结果有些还会有重名的情况&#xff0c;所以某些脚本不太适用本场景&#xff1b; 二、需求说明&#xff1a; 需使用Zabbix-server监控每个…

(网页)swiper.js轮播图插件

Swiper4.x使用方法 1.首先加载插件&#xff0c;需要用到的文件有swiper.min.js和swiper.min.css文件。可下载Swiper文件或使用CDN。 <!DOCTYPE html> <html> <head>...<link rel"stylesheet" href"path/to/swiper.min.css"> <…

Android 4.0 Launcher源码分析系列(二)

原文&#xff1a;http://mobile.51cto.com/hot-314700.htm 上一节我们研究了Launcher的整体结构&#xff0c;这一节我们看看整个Laucher的入口点&#xff0c;同时Laucher在加载了它的布局文件Laucher.xml时都干了些什么。 我们在源代码中可以找到LauncherApplication&#xff0…