聊聊持续测试

这是鼎叔的第九十六篇原创文章。行业大牛和刚毕业的小白,都可以进来聊聊。

本人新书《无测试组织-测试团队的敏捷转型》已出版(机械工业出版社)。

如果在测试部门只能推行一个技术建设项目,那鼎叔就会选择“持续测试”。

持续测试(Continuous Test,CT),也有公司称为每日测试(Daily Test),就是每天都有新版本生成并完成相应的测试活动,绝大部分测试都是自动化测试,但是也可以推送新生成的安装包到成员的终端上进行人工dogfood(内部探索测试)。尽可能在当天就发现是否有基本功能被新代码破坏掉,缩短解决问题的闭环,并让大团队对新代码提交保持信心,这样的实践契合“频繁测试”、“集体对质量负责”的敏捷原则。

相关前文:聊聊测试左移到开发阶段

图片

持续测试的健康度指标

带领团队全力投入持续测试之前,鼎叔会不厌其烦地强调:持续测试不是普通的自动化测试,健康度比覆盖率更重要。

以往测试团队在设立自动化测试目标时,都把重心放在自动化覆盖率上,比如所有测试用例被自动化的比率,或者接口/代码行的覆盖率。只看这一类指标很容易带来临时抱佛脚,有不少QA会在考核末期把自动化率提上去,用例没有通过也不去深究原因,整个自动化下来累计发现的问题非常有限。

鼎叔推荐以下几个健康度指标:

1 持续测试卡点失败的恢复时长(MTBF)

持续测试的卡点就像安灯绳,指定的基础功能一失败就应该停下来检查。

为了保障持续测试能顺利开启,团队首先要确保持续构建的成功率,必要时督促开发立刻处理失败,建立对健康构建的重视态度比完善工具更重要。

有一部分不太稳定的,优先级也不高的持续测试用例集可以不设置卡点,或者设置低阈值卡点,以免经常失败导致人员精力的过度耗费。但这种用例集数量应该尽量控制,可以放在员工本地运行,稳定后再放在团队流水线中。

2 测试还需要关注项目的构建和执行速度,通常应在几分钟以内。在实践中发现,导致构建耗时太长的原因经常来自于测试,比如包含了远程服务(如数据库)。

3 度量团队和项目持续测试的前置缺陷发现率,就是持续测试回归自动化过程中累计发现的所有有效问题。这个指标不管用什么自动化框架,不管黑猫白猫,只要发现尽量多的问题就是好猫。

这个指标主要看遗留测试资产(回归自动化)的效果,包括利用各种无需QA人工投入的自动化能力,能在人工测试之前拦截多少有效问题。

持续测试人员可以用各种手段客观记录有效缺陷,不一定要录入缺陷管理系统,更多是度量持续测试的产出价值。

持续测试实践的成效是,后期的系统测试阶段发现的缺陷数量大幅下降了。没错,在测试左移中,系统测试中发现的缺陷占比越少,越有可能是件好事。

4 测试用例通过率。有的流水线卡点会设置为100%通过,也有设置为90%通过的。关键是只要有失败就要快速排查,是脚本问题、产品沟通问题、环境问题,还是缺陷。

通过率的治理可以倒逼QA优化用例集,剔除不稳定的,或没想清楚的用例,避免“用例越多越好”的误区。

5 测试人员除了参与验收标准和验收用例的评审,还可以在开发完成单个需求(用户故事)自测后,马上开始针对性的验收测试(如果产品经理能先行做用户验收测试则更佳),快速反馈该单个需求的质量情况(最好当天完成),降低迭代版本测试或系统级测试的风险。反馈周期越短,开发修复的效率越高,而传统的等待版本提测模式,会拉长开发的等待时间,加大切换任务的注意力耗费。

持续测试的技术栈

产品和项目质量交付是一个整体,包括客户端/前端,和后端的代码测试与发布。但是从自动化技术层面,客户端和服务端的测试框架和执行速度还是有很大差异。

所以持续测试建设团队需要从两套技术栈去分头建设流水线,一套是客户端,一套是服务端,分头掌握不同的自动化能力,但最终的质量标准和指标看板要整合为一个结果,面向产品的整体来输出。

客户端持续测试流水线

客户端的自动化测试成本在很多时候是高于服务端的,可以借用的行业技术成果也更加的丰富多彩。

一,因为客户端面向用户体验视角,所以具备AI图像识别能力的UI自动化测试框架有不错的潜力。

二,三端合一测试技术,即用一套脚本在Android,iOS,PC/Website上同时完成自动化测试,这是客户端测试的热点,在持续测试中非常有价值潜力。

三,真机集群适配自动化测试,这个将来有机会可以专题分享。不同机型的APP适配质量是很多开发团队的噩梦,行业已经有很多针对性的解决方案。因为真机适配UI自动化通常速度慢,失败率较高,所以更适合作为非卡点异步任务。

服务端持续测试流水线

服务端持续测试肯定以协议测试/接口测试为主要形式,但是接口测试的框架也是五花八门。对于电商等复杂的线上流量业务,流量录制回放工具占据了越来越重要的比重。持续测试平台可以同时接入流量录制回放型自动化测试框架,和常规的人工创建型自动化测试框架。

持续测试看的是疗效,不追求执行框架越单一越好,只要能显著提升前面的健康指标,引入外部开源的或商业工具都行,甚至友商工具也可以拿来用。

持续测试流水线的分层(五层)

持续测试中的自动化测试是分层进行的,因为不同层次的自动化测试耗费的时间不同,修复成本不同。参考HamVocke的测试金字塔理论,自动化测试可以分为下面几个主要层次。

1)静态测试。即静态代码扫描,包括代码普通质量问题和代码安全问题,针对扫描结果,我们会关注扫描出来Block问题和Major问题,设立修复率目标,推动开发把精力放在前期。

2)单元测试。之前文章已有介绍。

3)接口测试。

4)跨链路测试或集成测试。在很多公司,集成测试被称之为联调测试,通常由开发人员负责,但是测试人员也可以共同建设。

集成测试可以分为狭义集成测试和广义集成测试。狭义集成测试聚焦被测对象的服务边界,触发本对象和外部(另一个服务,或数据库,或文件系统)的集成动作。而广义集成测试则是通过网络和外部服务进行集成,但是速度更慢,测试更脆弱。依托测试环境稳定的基础设施服务,集成测试通常按照从小到大的顺序联调,逐步提高服务的可用性。

从敏捷角度理解,联调意味着跨特性团队的协作,虽然难以避免,但也属于浪费的成本,应该尽可能降低联调的投入和时间。如果参与联调的各方都有非常清晰完备的接口定义,充分考虑了可能的错误场景,那么联调就可以在最短时间完成,甚至借助事先做好的自动化用例全自动完成。

因此,在微服务产品中,契约测试(作为一种特殊的集成测试)就流行开来,所有微服务的接口测试都根据定义好的接口契约,设计完整的稳定的测试用例套件,确保数据的生产者模块和消费者模块遵循契约。基于该套件的每天持续测试把关,研发团队便向自治团队迈出了一大步。

5)UI测试/端到端测试。注意,UI测试是端到端测试的一部分,即从交互界面上验证结果。端到端测试还有不少其他层面的验收标准,比如没有界面的功能,系统性能,安全性检查,日志正确性,交付规范的文档等。对于微服务架构的产品,需要有人面向整个系统,跨越多个服务来编写端到端测试用例。

这些自动化测试层次使用的测试框架各不相同,但持续集成平台都可以纳入,并行执行,根据团队的效能度量要求进行任务配置和结果治理。

哪怕不完美的自动化测试,只要能够频繁执行,也比很少执行的完美测试更有价值。

而前文提到的验收测试,和测试金字塔的各个层次是正交的,你可以依托单元测试来验收,也可以从接口验收,当然也可以在UI层验收。

如果一个功能验收可以同时在低层次和高层次自动化实现,那就应该保留低层次测试用例,而放弃高层次用例,以减少用例重复。但是,如果高层次的用例能够提高我们对于产品发布的信心,那就应该保留它。

这也就是我认为,单元测试及集成测试,不太可能完全替代端到端测试的原因。

持续测试与测试右移

持续测试贯穿产品研发生命周期,它的价值不仅限于左边,也适用于右边的质量活动。

持续测试就是要把前期积攒的测试资产在灰度、发布、上线后反复利用,测试框架设施不变,收益最大化。

具体实践可以包括:

埋点验证自动化测试。产品的关键指标埋点是一类对产品发展很重要的功能,除了在常规测试中验证,也可以在预发环境和线上环境进行测试和监控。

线上巡检自动化。出于商业目标的保障(如重大营销时期的价格风险检查),线上的关键页面处于不断变化中,老板对此关注力度大,甚至还需要和竞品对比,这就不是简单的指标监控就能保障的。测试自动化可以梳理出UI层面巡检的场景和脚本,把它拓展到正式环境进行采样巡检。

业务逻辑拨测。普通的接口可用性监控,对于运营团队和网络服务公司来说很容易,但是具体业务逻辑是否在现网保持正常,仍然没有确定答案。既然测试团队有各种核心业务场景的自动化脚本,就可以挑选少量场景,用很小的流量进行拨测,尽早发现问题。

下一篇我们聊聊持续测试实践的进阶思考。

集成测试是软件测试过程中的一个关键阶段,其主要目标是将已经通过单元测试的模块按照一定的策略组合起来,形成更大的系统组件,并对这些组件进行测试以验证模块之间的接口是否按照设计要求正确工作。集成测试不仅关注模块之间的功能交互,还关注模块集成后可能暴露的错误,例如接口不匹配、数据传递错误等问题。 在集成测试的实施过程中,通常包括以下几个阶段:计划、设计、实现和执行。在计划阶段需要制定详细的集成测试计划;设计阶段则基于测试计划设计具体的测试方案;实现阶段包括测试用例的设计、测试规程的制定以及测试脚本和数据文件的准备;执行阶段则是按照测试规程执行测试用例,对发现的问题进行修复,并进行回归测试以确保问题已被解决,最终提交集成测试报告 [^1]。 集成测试的实施应遵循一系列原则,如采取增量式的分步集成方式,逐步进行软件部件的集成和测试;重视测试自动化技术的应用,以提升测试效率;注意测试用例的积累与管理,便于后续的回归测试测试用例补充等 [^2]。 此外,集成测试还应按照一定的层次来进行,并且测试策略的选择需综合考虑质量、成本和进度之间的平衡。测试应当尽早启动,并基于总体设计方案进行。测试人员与开发人员之间需要就模块与接口的划分进行充分沟通。当接口发生变化时,相关的接口必须重新进行测试测试结果应如实记录,并且测试活动应严格依照集成测试计划和方案来进行 [^3]。 从技术角度看,理想的集成测试应当由开发人员与测试人员共同完成。测试人员负责设计和执行测试用例,确保软件概要设计的正确实施;而开发人员则需协助搭建测试环境、参与测试用例的评审,并确保技术实现的准确性。实践中,由于开发人员对代码结构更为熟悉,有时会先由他们进行初步的集成测试,确认模块接口的正确性,随后由测试工程师进行更为全面的测试,涵盖功能、性能、安全性和容错能力等方面,以此结合双方优势,提升测试效率和质量 [^4]。 持续集成(CI)作为一种软件开发实践,鼓励开发人员频繁地将代码集成到主干分支中,并通过自动化的构建和测试流程来验证代码的正确性。这种方法有助于早期发现并修复错误,防止出现大规模集成问题,从而维持代码库的良好状态 [^5]。 ### 实施方法 集成测试的实施方法通常包括自顶向下集成、自底向上集成和混合式集成等方式。自顶向下集成是从系统架构的顶层开始,逐步向下集成和测试模块;而自底向上集成则是从底层模块开始,逐步向上集成和测试。混合式集成则结合了上述两种方法的优点,根据实际情况灵活选择集成路径。 ### 测试用例设计 测试用例的设计需要覆盖所有公共接口,并且对于关键模块要进行充分的测试测试用例应该能够验证模块间的数据流、控制流以及异常处理等特性。 ### 测试环境搭建 测试环境应尽可能模拟实际运行环境,以便于发现潜在的问题。开发人员通常负责协助搭建测试环境,并参与测试用例的评审过程。 ### 自动化测试 为了提高测试效率,集成测试过程中应当引入自动化测试工具和技术,自动化测试可以加快测试执行速度,减少人为错误,并支持频繁的回归测试。 ### 示例代码 以下是一个简单的Python函数示例,该函数用于演示如何编写一个简单的测试用例来检查两个模块间的交互是否正确: ```python def add(a, b): return a + b def test_add(): assert add(1, 2) == 3, "Expected 3, got {}".format(add(1, 2)) assert add(-1, 1) == 0, "Expected 0, got {}".format(add(-1, 1)) print("All tests passed.") test_add() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值