热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

从零开始的一次测试自动化项目

概要:一个成长中的公司被指派从头开始开发一个测试自动化程序,改变它的编码实践,并建立一个持续的测试工具链。MartinIvison详细描述了他们是如何做

概要: 一个成长中的公司被指派从头开始开发一个测试自动化程序,改变它的编码实践,并建立一个持续的测试工具链。Martin Ivison详细描述了他们是如何做到的,包括意识到实施传统的测试金字塔行不通-必须将其颠倒过来。他们发现,小即是美,便宜即是好,文化的改变很重要。

自动化 

我在求职面试中听到的故事很普遍,但很有趣:该公司已经从一个单人的地下室运营成长为酿酒厂直接面向消费者销售的市场领导者。但是,由于每年交易额超过10亿美元,该公司的系统在体系结构,基础结构和代码质量方面一直存在长期困扰。而且,任何进展都受到一个人手动测试所有内容的瓶颈的限制。

  我被要求建立一个功能完善的QA部门,并启动一个测试自动化项目。两年过去了,我们现在可以总结和分享我们的经验。我们发现,小是美,廉价是好,文化变革至关重要。

 

愿景 

  尽管有一些急需解决的问题,但我们首先花一些时间讨论测试自动化的长期目标,以确保我们朝着正确的方向运行。

  作为竞争激烈的公司,我们自然渴望速度,灵活性和可扩展性。但是更具体地讲,我们需要考虑两个非常不同的因素来进行扩展:技术角度和文化角度。

  从技术上讲,我们设想了三层测试自动化(单元,集成和系统测试),并在持续集成和部署流程中嵌入了松散耦合的低成本工具链。

  可以说,非技术角度更难:我们需要引入一种文化,即开发人员测试他们自己的代码,以及产品所有者投入时间来构建框架。我们还需要一个质量保证团队,该团队可以在工作敏捷的团队中促进和推动端到端的质量流程,同时能够编写代码并构建其他工具。

  非技术角度可能更困难:我们需要引入一种文化,让开发人员测试他们自己的代码,让产品所有者投入时间构建框架。我们还需要一个QA团队,它能够在工作的敏捷团队中培养和推动端到端质量流程,同时能够编写代码并构建其他工具。

  我们不希望做的是消除手动测试。取而代之的是,我们将把测试的注意力集中在高价值的活动上,例如评估原型和通过复杂的场景进行测试,当然,还可以让测试人员自由地进行自动化。

  从零开始,我们了解到我们将要做的是多年的旅程。

 

从零开始 

  最初的情况令人沮丧。该系统的大多数基于大约150万行旧式ColdFusion代码,而没有任何单元或集成测试。代码更改是在本地计算机上手动进行系统测试的,然后合并到母版中,并且每晚进行部署直接用于生产,而无需进一步测试。通过ping和一些针对Web服务的简单脚本测试来监视生产运行状况。而且,尽管团队已经开始涉足更现代的框架(包括Rails,Angular,Node和Serverless),但使用框架本地测试功能仍处于起步阶段。

  考虑这些选择后,很明显,我们将不得不降低或颠倒测试金字塔。

  虽然通常使用代码自底向上构建测试功能(编写单元测试,然后集成和编写集成测试,然后进一步集成并编写系统测试),但我们正在使用现有的无测试系统。为了逐步降低风险,我们必须从最重要的系统更改开始,从系统级别的顶层开始,然后在较低的层级回填。

  在我们的案例中,主要风险是由生产平台的夜间测试部署造成的。由于我们无法将测试嵌入到旧代码中,因此我们必须创建一个独立的测试应用程序,以监视整个系统的重要功能。

  最低可行产品(MVP)套件涵盖了我们主要的创收业务流程和应用程序(订单,购物车,销售点和俱乐部处理)。它基于Selenium并用Ruby编写,利用SitePrism进行页面对象管理和Capybara 。测试在BrowserStack上运行,并计划在部署后以及Jenkins每天的不同时间运行。

  第一道防线在三周内投入生产,我们达到了预期的覆盖范围,以在三个月后将我们的业务风险降至最低,即大约需要200个小时的努力。

  获得牵引力:API 我们的下一个目标是开始测试API。在此级别上进行测试将更强大,并且可以使我们以更低的测试维护需求来扩展我们的覆盖范围。

  幸运的是,我们的系统中有很大一部分都与基本的HTTP调用进行通信或响应。使用Postman ,我们发现我们几乎可以完全模拟许多核心应用程序的业务流程。使用Javascript,我们为测试编写了脚本,以创建自己的数据并可以在任何环境中灵活地工作。我们始终将目光放在生产上,因此我们使用Postman Monitors来运行连续计划的生产测试,该测试与我们的DevOps工具( VictorOps , Github , Jira和Slack )无缝集成。

  此举还有其他好处。一方面,我们能够使用Postman的HTTP调用流程为我们的应用程序快速建模和构建JMeter负载测试,可用于按需从BlazeMeter进行测试。为了减少额外的工作,我们创建了性能测试功能的开始。

  其次,随着我们对新的QA人员的培训和招聘,Postman中JS的低门槛使得它成为我们测试人员学习如何编写自动化代码的完美入口技术。它还很快在QA和开发人员之间建立了一种通用语言。我们都理解集成层,并一起工作来实现自动化。这也促进了关于我们缺少单元测试的讨论,并鼓励开发人员采取行动来重构复杂的代码并提高代码质量。

  第三,我们为未来的持续集成和交付(CI / CD)过程打开了战略可能性。Postman(通过其CLI工具 Newman )和我们的Ruby Selenium测试都可以在持续交付工具(如CircleCI或AWS CodePipeline)上运行,同时运行我们的单元测试。

  这个里程碑标志着一年的结束,在这期间,我们看到报告的生产bug持续减少。此时的固定成本是QA中增加的两名员工的支出,而在工装方面的支出可以忽略不计。

 

第二年:E2E链

  第二年我们解决了最大的障碍:平台代码单体。因为该平台实际上是将具有不同需求的许多应用程序集成到一个大堆栈中,所以部署它是一个复杂的过程,无法即时完成。为了解决这个问题,我们启动了两项计划:通过新的API层将前端与共享后端分离;并推动使用Docker容器化组件,将其与CircleCI集成,并通过Amazon EKS流畅地部署它们。

  对于新的API层,我们重构了代码以清晰地分离前端和后端。这样做的直接好处是,我们现在可以使用现有的API工具对其进行测试,并迅速扩大我们的覆盖率。我们还可以插入新的测试工具和方法。通过添加linting (Codacy)和单元测试框架(Testbox for ColdFusion),以及对每个代码更改强制进行单元测试,重构变得更加安全。

  同时,前端在Angular上进行了重构 。这意味着我们现在可以将嵌入式测试框架用于单元测试和集成测试( Mocha , Chai和Protractor )。在这里,我们进一步利用了那些最重要的文化优势:基于我们在postman中的JS经验,QA团队能够轻松地拥有这些测试并编写脚本。

  经过两年的努力,来自生产的bug信号已经下降到边缘水平,没有任何额外的固定成本。另一方面,将我们所有的应用程序开放到CI/CD,使我们能够重新考虑测试环境,并为第三年的完全连续测试打开了大门。

  我们的愿景是使用我们不断增长的应用程序容器集合来开始为自动化测试构建定制的环境。然后部署工具链可以引导所有的变更,这样变更的影响范围和相关的风险就决定了测试的范围和广度。我们的想法是,我们的三层测试覆盖现在允许我们将简单的变更直接推进到生产环境中,而风险较大的变更将转移到准备环境中进行更深入的手工测试和我们新开发的负载测试。

建立倒金字塔

  最后,我们可以回顾一下我们作为一个团队在构建这个倒金字塔过程中学到的一些重要的东西。

  因为我们没有机会以正确的方式把它建立起来,我们不得不从顶端开始,并希望下面的构建块将会随着我们开车向下移动以适应新的过程。如果没有团队的支持和持续的学习,这几乎是不可能的,这使得这种变化的文化方面非常重要。我们通过在集成层中为开发人员和QA人员创建一个公共的平台,并使用Javascript使用一种公共语言来实现这一点。这有助于向两个方向辐射思维和实践,并且是开发一个持续测试过程的必要部分。

  此外,在任何项目中,对风险、价值和维护成本保持敏锐的眼光都是有帮助的。对于系统级测试,我们首先用一个相对较小的套件(少于20个场景)来保护生产中的赚钱流,然后就停止了,因为GUI测试是出了名的脆弱和维护成本高昂。稍后,在构建API层、添加框架和重构代码时,我们填充了更健壮的底层测试。

  最后,我们发现在容易集成工具的时代,降低成本是完全可行的策略。我们将低成本的工具串成松散耦合的链,在这些链中,各个部分被增量地添加到一个不断增长的功能映射中,而不是预先寻找单一的提交解决方案。我们的大多数工具都是开源的,其余的是基于云的服务,当竞争对手提供更划算的解决方案时,这些服务很容易被淘汰。

  与所有的测试工作一样,不存在放之四海而皆准的解决方案。从团队中获得支持是至关重要的,因为当每个人都理解并支持整体目标时,他们将找出实现目标的最佳方法——即使这意味着将传统实践颠倒过来。


推荐阅读
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • position属性absolute与relative的区别和用法详解
    本文详细解读了CSS中的position属性absolute和relative的区别和用法。通过解释绝对定位和相对定位的含义,以及配合TOP、RIGHT、BOTTOM、LEFT进行定位的方式,说明了它们的特性和能够实现的效果。同时指出了在网页居中时使用Absolute可能会出错的原因,即以浏览器左上角为原始点进行定位,不会随着分辨率的变化而变化位置。最后总结了一些使用这两个属性的技巧。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
  • Jboss的EJB部署描述符standardjaws.xml配置步骤详解
    本文详细介绍了Jboss的EJB部署描述符standardjaws.xml的配置步骤,包括映射CMP实体EJB、数据源连接池的获取以及数据库配置等内容。 ... [详细]
  • 全局角度出发讨论敏捷
    JonKern对于是什么促成了敏捷的成功有着自己读到的见解。你可能会不同意他的观点。下面列出了一些建立在项目全局角度之上的关键实践,项目本身就是从此开始的。如果不能从系统角度来做项目,那它就不能达到预期的效果,甚至可能会失败。我很早以前就认为,开发软件就像是在完成一个很长的待办事项列表。我试了很多方法来运行项目,从记事贴到Jira(从Jira刚发布起我就开始使用)。我使用传统Scrum风格的Spr ... [详细]
  • 开发笔记:DevOps Gitlab环境部署
    本文由编程笔记#小编为大家整理,主要介绍了DevOpsGitlab环境部署相关的知识,希望对你有一定的参考价值。DevOps介绍 ... [详细]
  • 请问:FixVersion字段这个字段怎么设置?比如我想添加一个自定义的字段,在创建时不见不能填写,到解决时才填写,而填写后浏览问题又可见,怎么设置?另:怎么修改jiraview界 ... [详细]
  • Ubuntu下怎么安装docker-ce
    这篇文章主要介绍“Ubuntu下怎么安装docker-ce”,在日常操作中,相信很多人在Ubuntu下怎么安装docker-ce问题上存在疑惑,小编查阅了各式资料,整 ... [详细]
author-avatar
手机用户2602916275
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有