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

后台自动化测试与持续部署实践

后台自动化测试与持续部署实践https:mp.weixin.qq.comslqwGUCKZM0AvEw_xh-7BDA后台自动化测试与持续部署实践原创 腾讯程序员 腾讯技术工程 2

后台自动化测试与持续部署实践 https://mp.weixin.qq.com/s/lqwGUCKZM0AvEw_xh-7BDA


后台自动化测试与持续部署实践

图片

4) 接入全链路追踪系统

状态码和状态消息是面向客户的,拿着它们去找失败点可能会定位精度不足。全链路追踪非常有价值,任何现代的后端系统都应该接入一套 OpenTelemetry 的实现,使用 OpenTelemetry 的好处是其协议具有通用性,可以很好地被各种工具支持。每一个严肃的业务开发都有必要了解这一块的知识,当你需要排查一个线上问题而无从下手时就会深有体会。

腾讯内部天机阁工具可以作为 OpenTelemetry 的后端,我们将所有的服务接入了天机阁。接入全链路追踪后,在接口测试和端到端测试时,使用统一的格式将 Trace ID 打印到 test log 中,一旦测试失败,就可以拿着 Trace ID 去快速定位失败点。


1.2.2. 提升可理解性

可理解性是指被测系统的信息获取是否容易,信息本身是否完备,并且易于理解。比如被测对象是否有说明文档,并且文档本身可读性以及及时性都有保证。常见的可理解性包含以下这些方面:



  • 提供用户文档(使用手册等)、工程师文档(设计文档等)、程序资源(源代码、代码注释等)以及质量信息(测试报告等)

  • 文档、流程、代码、注释、提示信息易于理解

  • 被测对象是否有单一且清楚定义的任务,体现出关注点分离

  • 被测对象的行为是否可以进行具有确定性的推导与预测

  • 被测对象的设计模式能够被很好地理解,并且遵循行业通用规范


我们在可理解性上的实践目前并不多,后面有更多经验时再进行分享。


1.2.3. 提升可控制性

可控制性是指能否容易地控制程序的行为、输入和输出,是否可以将被测系统的状态控制到测试条件的要求。一般来讲,可控制性好的系统一定更容易被测试,也更容易实现自动化测试。可控制性一般体现在以下各个方面:



  • 在业务层面,业务流程和业务场景应该易分解,尽可能实现分段控制与验证。对于复杂的业务流程需合理设定分解点,在测试时能够对其进行分解。

  • 在架构层面,应采用模块化设计,各模块之间支持独立部署与测试,具有良好的可隔离性,便于构造 Mock 环境来模拟依赖。

  • 在数据层面,测试数据也需要可控制性,能够低成本构建多样性的测试数据,以满足不同测试场景的要求。

  • 在技术实现层面,可控制性的实现手段涉及很多方面,比如提供适当的手段在系统外部直接或间接的控制系统的状态及变量、在系统外部实现方便的接口调用、私有函数以及内部变量的外部访问能力、运行时的可注入能力、轻量级的插桩能力、使用 AOP(Aspect Oriented Programming)、trpc-filter(trpc 服务的插件特性)等实现更好的可控制性等。

为了提升中间件的可隔离性及更好的构建测试数据,我们对中间件做了下述几项治理工作:

1) 统一使用名字服务进行寻址

微服务架构下,如果还是使用固定的 ip:port 访问中间件,将难以灵活应对中间件扩缩容,也很难使用集群式管理。因此,寻址方式应该统一使用名字服务,统一通过 namespace+env 方式进行寻址,无需再为各个环境单独配置 ip:port。

以 db 为例,目前 db 可支持通过域名或名字服务寻址:

a. 通过域名寻址,需要为 Production 和 Development 分别配置不同的域名,如下面的 tap1.com 和 tap2.com;

b. 通过名字服务寻址,不同环境用同一个名字 tap.db,再通过 namespace/env 到北极星(腾讯内部的统一服务发现和治理平台)寻址不同环境的地址,即可访问;

图片
运行结束后自动显示测试报告:图片

通过持续优化秒级监控发现的问题,我们将系统的稳定性提升到 99.99% 以上并能够一直保持。


3.1.2. 提升测试稳定性

单元测试的稳定性提升方式,主要有:



  • 避免使用 sleep

  • 减少 mock 的使用

  • 不要在用例中修改或依赖系统环境,如时钟

  • 不使用随机数作为输入

  • 单测中不能访问数据库、网络,不要跨进程调用

  • ……

接口测试的稳定性提升方式,主要有:



  • 下游服务及外部 http 依赖,尽量使用 mock

  • 依赖的数据,应该在 setup 时初始化,不要依赖库中现有的数据

  • 对测试数据的修改,测试结束后需要还原

  • 运行时使用独立的隔离测试环境,避免冲突

  • ……

接口测试和端到端测试实践的过程中,我们经常会遇到不稳定的用例( Flaky Test ):相同的测试用例,有时测试通过,有时又测试不通过。这样的测试用例可以理解为是不稳定、可靠度低的测试用例。造成用例不稳定的原因有很多种,比如测试代码本身的问题、测试框架的问题、被测系统及其依赖的软件库的问题等。如果有很多这种测试用例,我们将会对测试失去信心。

在 LogReplay 项目的自动化实践中,我们使用 TestOne Flakiness 缓解方案提升端到端测试可靠性的运行方案:监控并记录测试用例的可靠性数值(flakiness 值),如果达到某个阈值,则认为这个用例不可靠,并自动移除该测试用例(不在关键路径中运行、或测试结果不作为关键路径是否成功的标志)。如下图所示:
图片

当然,我们的微服务中,不止有代码变更,还有配置、数据库等变更,接下来我们也需要继续探索并实现配置、数据库等变更的持续、自动化部署。

不同类型的业务场景和需求差别较大,自动化测试与持续部署的方式及思路也不尽相同,本文只是我们的“一家之言”,并不一定适用于其他的业务场景。但,我们追求的目标,应该是类似的,都是希望能“质量更高”、“速度更快”,而实现这两个目标,都离不开自动化测试、自动化部署。回到本文的标题,希望有越来越多的业务一起探索实践、及分享后台自动化测试与持续部署实践,也随时欢迎一起交流。

用到的测试工具:

文中描述的工具绝大部分皆为腾讯内部自研产品。

TestOne : 腾讯自主研发的一站式测试平台, 能给用户一站式浸入式的测试体验。

术语:




    1. CI: 持续集成(Continuous Integration)

    2. CD: 持续部署(Continuous Deployment)

    3. mockserver : 实现 mock 功能的服务,可以对服务进行 mock

    4. Sandbox/Test/Staging/Canary/Production 环境:沙箱测试环境,基线测试环境,预发布环境,金丝雀环境,正式环境,统称为线上环境

    5. Flaky Test : 片状测试,不稳定测试,是一种具有不确定性结果的测试:对于相同的代码,运行相同的测试,它有时会通过,而有时会失败。


 



推荐阅读
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • 本文详细介绍了网络存储技术的基本概念、分类及应用场景。通过分析直连式存储(DAS)、网络附加存储(NAS)和存储区域网络(SAN)的特点,帮助读者理解不同存储方式的优势与局限性。 ... [详细]
  • NFS(Network File System)即网络文件系统,是一种分布式文件系统协议,主要用于Unix和类Unix系统之间的文件共享。本文详细介绍NFS的配置文件/etc/exports和相关服务配置,帮助读者理解如何在Linux环境中配置NFS客户端。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 阿里云ecs怎么配置php环境,阿里云ecs配置选择 ... [详细]
  • 在编译BSP包过程中,遇到了一个与 'gets' 函数相关的编译错误。该问题通常发生在较新的编译环境中,由于 'gets' 函数已被弃用并视为安全漏洞。本文将详细介绍如何通过修改源代码和配置文件来解决这一问题。 ... [详细]
  • 远程过程调用(RPC)是一种允许客户端通过网络请求服务器执行特定功能的技术。它简化了分布式系统的交互,使开发者可以像调用本地函数一样调用远程服务,并获得返回结果。本文将深入探讨RPC的工作原理、发展历程及其在现代技术中的应用。 ... [详细]
  • 使用WinForms 实现 RabbitMQ RPC 示例
    本文通过两个WinForms应用程序演示了如何使用RabbitMQ实现远程过程调用(RPC)。一个应用作为客户端发送请求,另一个应用作为服务端处理请求并返回响应。 ... [详细]
author-avatar
小Q理性的激情农_885
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有