供给测结构性改革内容_智能包装结构,提高可测性

供给测结构性改革内容

有很多方法可以将整个应用程序分成多个包。 关于按功能或按层打包的优缺点的讨论可以在许多编程博客和论坛上找到。 我想从可测试性开始讨论这个主题,看看它是否会带来任何有意义的结果。

首先,让我们尝试描述我们通常希望跨不同层在应用程序中进行测试的内容。 让我们假设标准的三层体系结构。 在底部,我们有数据层。

根据我们对域驱动设计的态度,我们将尝试最大化(对于丰富的,面向业务的实体)或最小化(对于仅由getter和setter建立的贫乏实体)测试覆盖率。 在第二种方法中,甚至很难说出任何测试,除非您不信任Java并且想验证get是否可以检索set调用之前分配的值。 对于富实体,我们肯定要验证业务逻辑的正确性。 但老实说,几乎总是可以通过带有适当模拟设置的简单单元测试来完成。 在这一层中通常有成千上万的测试,因此我们希望它们能最快地完成。 这是单元测试框架的绝佳领域! 等待? 您为什么不想使用数据库测试实体? 我可以提出相反的问题-我为什么要这样做? 要验证JPA或任何其他持久性API是否仍在工作? 当然,总会有一些真正复杂的查询需要在下面的真实数据库中进行验证。 对于这些情况,我将在存储库级别使用集成测试。 只是数据库+存储库+实体。 但是请记住关于单一责任。 您的集成测试仅检查查询-将整个实体逻辑保留给单元测试。

下一步通常是根据服务构建的。 在DDD中,服务仅与存储库一起使用以加载实体并委派它们整个业务逻辑处理。 如您所料,这些测试将非常简单。 您认为我们这里需要数据库吗? 会提供任何附加值吗? 不要这样 那第二种情况呢? 模型中的贫血实体? 整个逻辑集中在服务上,因此我们必须在这一层中累积测试覆盖率。 但是,正如我们已经在域逻辑中讨论的那样,无需使用外部资源就可以完成此操作。 再过一次-我们需要的只是单元测试。 因此仍然没有数据库。 我们可以基于存储库模拟运行所有测试。 管理数据集没有问题,不会导致“预期3但发现2”测试失败。 仅仅是因为其他一些测试又提交了一个价值在200美元到300美元之间的订单。 即使我们想在这里使用IoC框架,它也可以使用模拟来模拟存储库层。 如果不与数据层框架进行适当的解耦,则会通过某种扫描机制自动加载存储库。 这不是我们想要的东西。

在服务之上,我们通常放置一些允许用户使用我们的应用程序的东西。 我们可以使用RESTful API,SOAP服务等作为前端。在这里检查什么重要? 与客户公平起见,我们应该遵守与客户签订的合同。 这对于单独的博客文章而言可能是重要的,但仅限于REST服务:

“如果您将POST请求发送到/ users URL,我将回答所有用户的列表。 每个用户的ID都是整数,带有用户名的字符串。”

好的–看起来像是合同。 那么我们应该在这一层检查什么呢? 当然,如果这份合同有效。 发送HTTP请求并验证响应是否包含用户数组,每个条目都是根据整数ID和字符串用户名从中构建的。 我们可以在服务模拟的基础上做到吗? 当然可以:)

所以封装一切:

  • 数据层=用于逻辑和与DB的集成测试的单元测试,用于复杂的查询验证
  • 服务层=用于逻辑和光集成测试的单元测试,无需使用DB用于测试IoC框架相关的逻辑
  • 前层=无需DB即可验证客户合同的集成测试

到目前为止,我们已经详细描述了在不同级别上值得测试的内容。 现在,让我们转到基于功能的打包。 当围绕不同的业务环境构建代码时,绝对有助于使代码井井有条。 对于大型应用程序,它使您可以将其分解为许多模块甚至许多应用程序。 如果没有这样的功能布局,那么这些动作之前就需要进行大量的重构。 但是在将我们的整体拆分成应用程序之后,仍然需要吗? 考虑一下启动新应用程序。 它的基本包装是什么? com.my.company.application ? 它只不过是功能包:)但是,您会停在此基本包上还是还是分成几层? 如您所见,这两个结构可以一起生活。

对于基于层的结构,我们的应用程序如下所示:

com.company.application\.data\.config\.model\.repository\.service\.config\.api\.config\.controller

对于基于功能的我们会得到类似

com.company.application\.order\.client\.invoice

但是通常随着业务逻辑的不断发展,它导致将整个应用程序拆分为模块或服务,因此最终我们得到:

com.company.application.order\.data\.service\.apicom.company.application.client\.data\.service\.apicom.company.application.invoice\.data\.service\.api

总结一下。 我认为分层包装是必须的。 它使我们能够分别测试每一层并保持我们的测试井井有条。 按功能打包在较大的项目中确实很有用。 对于围绕单个绑定上下文构建的微服务,更详细的划分可能会导致导航不舒适。 但是,出于与上述相同的原因,功能包内的代码仍应在层上断开。 尤其是基于Spring Framework的基于层的结构,可以帮助我们设置有用的组件扫描,并且不会因为仅仅希望使用两个服务来启动上下文而驱使我们设置数据库。 在我的GitHub存储库https://github.com/jkubrynski/spring-package-structure中,您可以找到基于Spring的示例项目。

翻译自: https://www.javacodegeeks.com/2015/11/smart-package-structure-to-improve-testability.html

供给测结构性改革内容

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

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

相关文章

openshift_在OpenShift上扩展Java EE微服务

openshift这个小系列的前两个部分介绍了如何使用WildFly Swarm构建一个小型的JAX-RS服务并将其打包到Docker映像中 。 您学习了如何将此示例部署到OpenShift ,现在是时候对其进行一些扩展了。 为什么扩展很重要 基于微服务的体系结构的关键方面之一是分解为高性能的…

php 异步post,php – 使用POST的异步cURL

我正在制作一个命令行应用程序.在执行登录过程后,我需要同时通过cURL发出多个POST请求 – 这意味着传出请求必须发送会话ID等.事件链如下:>我用curl_init打开cURL连接>我使用curl_exec登录远程站点发送POST请求,并获得返回的HTML代码作为响应>我同时向同一…

log4j2 logger_简单一致的Log4j2 Logger命名

log4j2 logger在“ 带有Java 7方法句柄的可移植记录器名称”一文中 ,我写了关于使用Java 7的方法句柄来命名类的记录器的文章。 我在那篇文章中说过,这种方法的优点包括记录器命名的一致性,并避免了意外的代码复制和粘贴,这可能导…

java 子类tostring,JAVA中Object类的toString()方法,objecttostring

JAVA中Object类的toString()方法,objecttostringtoStringpublic String toString()返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。Objec…

openshift 部署_在OpenShift上部署Java EE微服务

openshift 部署我昨天用WildFly Swarm在博客上发布了有关简单JAX-RS微服务的博客。 您学习了如何使用Maven构建所谓的“胖子”,还使用Maven Docker插件对我们的微服务进行了Docker化并在Docker Machine上本地运行。 这是在本地测试事物的好方法。 到目前为止&#x…

在程序中实现java源文件编译,在程序中实现对java源文件编译的3种方法

一般情况下对java源文件的编译均是在代码完成后使用javac编译的,不管是使用 IDE还是直接使用命令行。这里要说的情况是比较特别的,就是在代码内动态的编译一些代码。比如你想通过在某个目录下通过放置一些源代码的方式来实现对程序功能的动态扩展&#x…

apache.camel_Apache Camel 2.16发布–十大亮点

apache.camelApache Camel 2.16于上周五发布。 这篇博客文章是我尝试在此新版本中进行前10名(加1作为奖励)的亮点。 1.动态到 来自骆驼用户的最常见的常见问题是,如何将消息发送到端点,uri应该使用消息中的动态值(例…

设计模式示例_责任链设计模式示例

设计模式示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 &#x…

edmonds算法matlab,匈牙利算法的matlab实现

匈牙利算法算法简介算法原理算法实现(附代码)测试算法简介下面摘用百度百科中的解释。匈牙利算法(Hungarian method)是由匈牙利数学家Edmonds于1965年提出,因而得名。匈牙利算法是基于Hall定理中充分性证明的思想,它是二分图匹配最常见的算法&#xff0c…

php sqlsrv 分页,Php+SqlServer如何实现分页显示

PhpSqlServer如何实现分页显示$idmssql_connect("ddy","sa"," ") or die("连接不上");$dbmssql_select_db("ddy",$id);$query"select * from lr00 order by lr0012 desc";$resultmssql_query($query);if($result)…

java jooq_将Java EE与jOOQ结合使用的初学者指南

java jooqJava EE附带了自己的持久性API:JPA。 当您想要将RDBMS实体(表/关系)映射到Java实体(类)时,JPA最强大,主要遵循1:1映射策略。 其背后的思想是,业务逻辑通常不像关…

java ee编译器_Java EE 8 MVC:控制器的详细介绍

java ee编译器Java EE MVC是为Java EE 8计划并在JSR-371中指定的基于动作的新MVC框架。 这是我的Java EE 8 MVC教程的第二篇文章。 第一篇文章介绍了基础知识,并展示了如何开始使用 Java EE 8 MVC参考实现Ozark 。 在本文中,我们将更详细地介绍MVC控制器…

php扩展 waf,基于PHP扩展的WAF实现

访问一下看看结果:可以看到ls命令成功的执行了,也就是说我们的正常文件是不会被拦截的,而只有upload目录中的文件会被拦截,这样做又会引发另一个弊端,倘若攻击者通过某种方法将shell写入正常的文件中,或是与…

junit4 集成测试_使用JUnit规则进行干净的集成测试

junit4 集成测试JUnit Rules的优势,尤其是在进行集成测试时,几乎不能被高估。 在本文中,我们将阐明ExternalResource扩展的有用性。 在我们必须使用抽象外部资源的第三方库的情况下,这简化了灯具控制。 作为示例,我们将…

多项式在matlab中的应用,matlab的应用-多项式函数及多项式拟合

matlab的应用-多项式函数及多项式拟合 Matlab 的应用- 多项式函数及多项式拟合 本节将向大家简要介绍 matlab 在多项式处理方面的应用。 多项式函数主要有: roots 求多项式的根 poly 特征多项式 polyval 多 项式的计算 poly2str(p, x )多项式代换 polyfit 多项式曲线…

java8 从数组获取流_从数组到流再到Java 8

java8 从数组获取流不久前,我们将一些Eclipse插件项目升级到Java8。此后再也没有回头。 除其他事项外,使用lambda和streams API ,过滤,映射和查找集合中的元素变得更加容易和简洁。 我想到目前为止,对于大多数人来说&a…

乐惠科技php面试题,程序员中的奇葩,使用php构建魔兽世界

这是用PHP编写的魔兽世界服务器。现在它已经调试了登录服务器的过程。目前的魔兽世界客户端是2.4.3_8606。服务器列表和帐户密码数据需要查询AUTH库。世界服务器身份验证过程已完成,数据包加密已完成后续进程正在开发中......数据库文件在根目录: sql/sql.7z今天在群…

javafx窗体程序_JavaFX真实世界应用程序:EIZO CuratOR Caliop

javafx窗体程序JavaFX Real-World应用程序第四号称为Caliop 。 它是EIZO为医院手术室开发的CuratOR解决方案的前端。 前端在壁挂式控制台上运行,并允许操作团队查找有关患者的信息,控制各种视频源到不同显示器的路由,录制视频,拍摄…

玫瑰花函数matlab,网上收到的用matlab画玫瑰花的代码怎么不行啊,报告错误,求大神...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼function plot_rosedraw_main(450,90);function draw_main(x,y)%粉红色玫瑰arcdata{1}[65 -60 150 350 866 -54 300 470 865 -56 30 230 1064 -57 300 490 17];ellipsedata{1}[73 -30 250 450 27 4059 -30 100 290 27 4065 -40 140…

java8 streams_Java 8 Streams:过滤和谓词否定

java8 streams最近,有关LJC 邮件列表的成员在流中.filter方法中使用谓词否定的有趣讨论,因此我认为值得在博客文章中进行总结。 讨论是关于使用.filter和否定谓词的方法。 这篇文章的代码可以在我的github帐户中找到 。 也许这就是您可能会想到的方式&…