本文的这一部分将讨论在开发过程中拥有有效工作流程的影响,以及适当的测试代码质量如何使我们能够创建可维护的测试,尤其是对于复杂项目。

开发工作流程和管道

编程是一项流程活动,我们开发人员应该对保持工作流程高效和缩短周转时间感兴趣,以免因等待时间而分心。

通常,我们要确保测试的总运行时间不超过几秒钟,至少对于我们在“更改-验证-重复”周期内执行的所有测试而言。 在开发过程中,至关重要的是要对此周期进行快速周转,这涵盖了从对项目进行一些更改到验证这些更改在类生产环境中按预期工作的过程。

如果我们仅通过每次都从头开始构建和部署我们的应用程序的管道来进行此验证,那就太慢了,无论该管道是否在本地运行。 因此,建议创建一个开发设置来侦听文件更改,然后通过重新部署整个应用程序或更新单个类或文件来修改应用程序以反映我们的代码更改,然后快速重新执行连接的测试方案到更新的被测应用程序。 这个想法是,通常只重新部署应用程序或应用程序的一部分要快得多,而不是从头开始启动进程并保持潜在的其他本地服务运行。 这种方法使本地运行的系统测试变得更加有趣,因为我们可以针对正在运行的系统重新执行测试方案,并立即验证我们的更改。

更具体地说,本地工作流可以是: 重新编译类,执行单元测试,(热)部署应用程序以及执行幂等集成测试。 整个周期不应超过一秒或两秒,否则我们的注意力会转移到其他地方。 由于集成测试的启动和执行时间,花费较长时间的系统测试或任何其他更复杂的场景,我们有可能将其拆分为一个执行频率较低或仅在CI / CD管道中运行的单独的测试套件。

对于Java Enterprise项目,请查看WAD或Liberty插件开发模式 。

测试代码质量和可维护的测试

导致项目测试不足的最大问题是缺乏可维护的测试代码。 在许多情况下,编写测试,或更确切地说,复制并粘贴测试,使得一旦对生产代码进行了较大的更改,就很难更改它们。 这意味着测试代码通常在处理过程中对其质量的关注较少。 只要测试用例很少,那就很好。 但是,您通常会在项目中看到的是,随着代码库变得越来越复杂,如果我们不应用重构,则测试套件的可维护性就会越来越少,就像生产代码一样。

这就是进行可维护的测试的重点:应用相同的代码质量原则,尤其是分离关注点并引入抽象层。 如果要注意不要引入泄漏的抽象,那么在您的测试范围内创建可重用的组件是可行且高度明智的。

让我们来看一个进一步说明这一点的示例。 我们从有时被称为“注释优先编程”的地方开始,在此我们用代码注释,伪代码甚至在纸上书写,我们的测试场景应在纯概念,业务逻辑层面上验证哪些内容。 例如,“创建尺寸较大Espresso咖啡订单”。 或者“验证订单是否在Espresso类型且尺寸较大的系统中 ”。就是这样。 如何创建订单不是该级别的一部分,而是以较低的抽象,单独的方法或通常单独的委托来实现。 对于低级验证也是如此,例如,检查是否已发送回正确的HTTP状态代码和期望的JSON结构。 我们应注意不要将仅在详细级别上相关的信息(例如JSON结构)泄漏给委托方法。

您可以观看此视频,以查看实现该流程的示例流程。 从测试人员或领域专家的角度来看,这种方法很有意义,因为我们开始的是要测试的场景,而不是如何实现。 如果实现发生更改,例如与系统的通信从HTTP更改为其他内容,则仅需要调整一个位置。 此外,我们的测试用例方法变得非常易读,因为它们准确表达了要测试的内容的概念。 如果我们对操作方法感兴趣,我们会在较低级别中找到。

例如,以下系统测试将验证咖啡订单的创建:

 class CreateOrderTest { private CoffeeOrderSystem coffeeOrderSystem; private BaristaSystem baristaSystem; @BeforeEach void setUp() { coffeeOrderSystem = new CoffeeOrderSystem(); baristaSystem = new BaristaSystem(); } @Test void createVerifyOrder() { List<URI> originalOrders = coffeeOrderSystem.getOrders(); Order order = new Order( "Espresso" , "Colombia" ); URI orderUri = coffeeOrderSystem.createOrder(order); Order loadedOrder = coffeeOrderSystem.getOrder(orderUri); assertThat(loadedOrder).isEqualToComparingOnlyGivenFields(order, "type" , "origin" ); assertThat(coffeeOrderSystem.getOrders()).hasSize(originalOrders.size() + 1 ); } ...  } 

即使他们是非技术领域的专家,如果他们不了解Java,也可以了解该测试方案的执行情况,只要他们了解订单咖啡类型产地的背后领域,并且他们是否愿意忽略Java特定的语法。

这就是为什么我声称重点放在测试代码模式而不是特定的测试框架上的原因。 对于实际项目,至关重要的是引入适当的测试代码质量,主要是设计抽象层并将关注点分离为委托。 特别是当项目变得更加复杂时,这种差异会很快显示出来。

本系列文章的下一部分将介绍测试框架以及何时应用它们。

翻译自: https://www.javacodegeeks.com/2019/10/efficient-enterprise-testing-workflows-code-quality.html

高效的企业测试-工作流和代码质量(4/6)相关推荐

  1. 光流法测试代码_高效的企业测试-工作流和代码质量(4/6)

    光流法测试代码 本文的这一部分将讨论在开发过程中拥有有效工作流程的影响,以及适当的测试代码质量如何使我们能够创建可维护的测试,尤其是对于复杂项目. 开发工作流程和管道 编程是一项流程活动,我们开发人员 ...

  2. 如何设计高效测试用例_高效的企业测试-单元和用例测试(2/6)

    如何设计高效测试用例 在本系列的第一部分中,我们看到了有效测试应满足的一些普遍适用的原则和约束. 在这一部分中,我们将仔细研究代码级单元测试和组件或用例测试. 单元测试 单元测试验证单个单元(通常是类 ...

  3. 高效的企业测试-集成测试(3/6)

    本系列的这一部分将展示如何通过代码级以及系统级集成测试来验证我们的应用程序. (代码级)集成测试 集成测试一词有时在不同的上下文中使用不同. 根据Wikipedia的定义,我指的是在代码级别上验证多个 ...

  4. 高效的磁力搜索引擎 -_高效的企业测试-结论(6/6)

    高效的磁力搜索引擎 - 该系列的最后一部分将涵盖其他端到端测试,生产中的测试以及各部分的结论. 进一步的端到端测试和生产中的测试 除了仅验证单个被测应用程序并模拟外部问题的系统测试之外,我们的管道还必 ...

  5. 高效的企业测试-结论(6/6)

    该系列的最后一部分将涵盖其他端到端测试,生产中的测试以及各部分的结论. 进一步的端到端测试和生产中的测试 除了仅验证单个被测应用程序并模拟外部问题的系统测试之外,我们的管道还必须包括完整的端对端测试, ...

  6. 高效的企业测试-单元和用例测试(2/6)

    在本系列的第一部分中,我们看到了有效测试应满足的一些普遍适用的原则和约束. 在这一部分中,我们将仔细研究代码级单元测试以及组件或用例测试. 单元测试 单元测试验证单个单元(通常是类)的行为,而忽略或模 ...

  7. 测试框架 如何测试私有方法_高效的企业测试–测试框架(5/6)

    测试框架 如何测试私有方法 本系列文章的这一部分将介绍测试框架以及我在何时以及是否应用它们方面的想法和经验. 关于测试框架的想法 我对大多数测试框架不太满意的原因是,按照我的观点,它们大多增加了语法上 ...

  8. 高效的企业测试–测试框架(5/6)

    本系列文章的这一部分将介绍测试框架以及我在何时以及是否应用它们方面的想法和经验. 关于测试框架的思考 我对大多数测试框架不太满意的原因是,按照我的观点,它们大多增加了一些语法上的便利性和便利性,但本质 ...

  9. 提高 Java 代码质量

    高质量代码中往往缺陷更少!确保高的 Java 代码质量有两个步骤:尽早并经常地编写各个层次的测试用例,以及持续的监测质量状况.那么我们又该如何实践呢?本专题汇集了大量来自代码质量专家们的专业经验.最佳 ...

最新文章

  1. php的常量和变量,php的常量和变量
  2. 必看!互联网开发模式的经验之谈
  3. js中cookie操作
  4. javascript焦点图(能够自己主动切换 )
  5. 学习前端开发,可提高Web开发效率的15类工具
  6. 云服务器在哪里创建网站目录,如何在云服务器创建根目录
  7. python雷达图的相似度_Python教程:matplotlib实现雷达图和柱状图
  8. Java自带的keytool命令
  9. 20200516每日一句
  10. 软考:软件设计师(历年真题汇总)|希赛网
  11. 【思维导图】【专家视角】破解马赛克战之系统发展思考
  12. 计算机综合应用技能,系统测评计算机综合应用技能期末作业.doc
  13. LAS语音识别框架发展简述
  14. 路由器wifi热点丢包率高_使用笔记本电脑和虚拟路由器创建自己的Wifi热点
  15. 写一个Linux下搭建Discuz论坛的全过程教程。
  16. 关于 pygame中,检测按键按下
  17. linux驱动学习2(kpd驱动初步分析)
  18. 电脑显示器不亮的三种原因和解决方法
  19. 大型企业局域网安全解决方案
  20. 安霸预发布14nm工艺的ISP芯片

热门文章

  1. 【图论】【模板】静态仙人掌(luogu 5236)
  2. [BZOJ 3173] [TJOI 2013] 最长上升子序列(splay)
  3. codeforces gym-101736 Dessert First Strategy 最小割
  4. codeforces 884E Binary Matrix 并查集,滚动数组
  5. Spring Bean 定义
  6. MySQL数据库开发的 36 条军规
  7. Java开发必会的反编译知识
  8. Maven Optional Exclusions使用区别
  9. java打印九九乘法表——CSDN博客
  10. JS中的(IIFE)(立即调用函数)