阅读 164

初识全链路测试

什么是全链路测试

相信很多程序员在开发过程中或多或少的会基于开源库写过一些单元测试,类似 C++ 的 Google Test,Java 的 Juint 等。大分部情况下,程序员对系统的测试都只在系统的内部进行。但我们知道,一次完整的数据流不可能只在一个系统内流转。比如淘宝从买家下单到最终被收货,这一次完整交易的数据流要经过很多系统(ERP系统、仓库系统、配送系统、末端系统等)。这些系统之间通过调用串成一条条链路,交易数据在链路上进行流转。而对整个链路进行的测试称之为全链路测试,全链路测试可分为全链路功能测试和全链路性能测试。

为什么需要全链路测试

只在系统内部做单元或者逻辑测试只能测试本系统内是否存在问题(当然测试是不能发现所有问题的),并不能知道整个链路是否有功能或者性能上的问题。所以我们需要跳出系统对整个链路进行测试,防止在大促的时候出现问题。下面以自己的亲身经历来说明为什么需要全链路测试。 起源,上一家公司所做的系统虽然不是电商。但是一次数据的流转也需要经过很多系统,很符合全链路的定义。数据流程主要如下:

Agent 采集数据->接入系统->分发系统->一次分析系统->二次分析系统->工单系统

系统的链路大致如上图所示,可以看到数据从 agent 采集到最终发工单给用户要经过很多系统。由于我们做的系统与安全有关,对数据的完整性要求很高,所以必须要保证整个链路上不能丢失数据。为了保证整个链路的可靠性,需要对链路的可用性进行测试。由于对于线上质量测试的不重视,部门对链路采用最简单的拨测方式进行测试。流程如下:

  1. 定时在测试机上用脚本构造有效的工单数据,一般在早中晚定时用脚本跑一次或者几次。
  2. 链路上涉及到的系统上报自己的日志到存储系统,方便后续定位。同时继续扭转数据到下一个系统。
  3. 查看最终是否能正确发出工单,如果没有测试工单转(4),否则结束此次拨测。
  4. 人工去日志存储系统进行日志查询,找到有问题的系统,再深入系统定位问题。

以上方法简单粗暴但存在很多弊端,比如

  1. 各种数据只能靠人工写不同的脚本在 agent 上构造数据,导致测试数据种类和数量非常有限。
  2. 出了问题需要人工一步步的查看链路中哪个系统没有上报日志,再去系统定位导致排查效率低。
  3. 每天只定时跑几次拨测存在一定的随机性,如果次数太多脚本又不好管理。
  4. 真实数据和测试数据混在一起,只能通过白名单进行最后的工单过滤。

但即便如此,拨测也提供了全链路测试的一种手段。如果没有拨测,全链路功能的可用性更无法预知。只能说拨测是全链路测试的一个雏形,离真正的全链路测试系统还有一定的距离。全链路测试需要一个系统化的平台,只要链路中的各个系统都接入平台,即可对系统内和系统间的链路进行测试。一个理想的全链路压测平台应该为开发和测试提供从数据构造、用例管理、全链路场景组织、协助测试结果分析等一站式服务。

全链路测试平台需要提供的功能

可以看出以上链路还是比较短的,拨测还能勉强凑效。如果链路再长点、分支再多点呢?电商的业务一般具有链路长、分支多和周期久等特点。一般需要一个完整的全链路测试系统,它可以进行链路和节点的功能、性能测试。一个完整的全链路测试平台应该提供如下功能:

  1. 单元测试的管理功能:开发可能在一个系统中写了大量的单元测试,此功能可以提供开发对系统中单元测试的集中管理。
  2. 全链路压测功能:这是全链路测试中高阶部分,也是比较难的部分。主要是对全链路的性能进行测试。
  3. 链路场景组装功能:由于链路众多,可以为用户提供自定义的链路组装功能。不过平台要保证组成的链路场景的有效性。
  4. 提供测试来源数据:可以为测试用例提供大量的、模拟真实环境的测试数据。包括单元测试的数据来源、全链路测试的来源等。
  5. 定位分析功能:为开发定位和分析测试失败原因提供便利。
  6. 代码覆盖率统计:为每次的测试提供可视化的代码覆盖率报告,增加测试的可信度。

很多公司都已经有自己的压测系统或者平台:

阿里全链路压测系统

有赞全链路压测系统

京东全链路压测系统

饿了么全链路压测系统

全链路测试平台需要解决的问题

  1. 如何构造真实的测试数据,特别是全链路压测的数据。这是压测系统比较核心的问题。
  2. 如何处理测试数据,要不要进行环境隔离?参考【阿里全链路压测系统】提供的一种方案:所有写数据的地方对压测流量进行识别,判断一旦是压测流量的写,就写到隔离的位置,包括存储、缓存、搜索引擎等等。
  3. 如何在平台上协调各个系统进行全链路测试?一条链路上的各个系统往往属于不同的组、不同部门甚至不同的BU,这就导致组织一次全链路测试要进行很多业务间的协调和系统改造。对于那些一开始就没考虑到要进行全链路压测的系统成本还是比较大的。

写在最后

刚刚接触全链路测试不久,将在之前公司遇到的一些难题跟现在工作中的知识点进行结合写了这篇文章。文中全是一些我个人的理解,权当抛砖引玉了,有什么不对的地方还请多多指教。

关注下面的标签,发现更多相似文章
评论