【腾讯TMQ】像google一样测试系列之四:技术篇

2024-04-14 04:32

本文主要是介绍【腾讯TMQ】像google一样测试系列之四:技术篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引言

Android白盒测试覆盖率低的最主要原因,是大部分人都没有测到Android层,只测试了Java层部分,导致覆盖率低。因为大部分代码都在Android层。

亲,你是不是认为Android层的都测试不了尼,下面来看看吧

一 、Android层 可测性预研

1、Application可测性

Application级 是app全局共享的,通常用作数据传递,数据共享,数据缓存等。

因此,application级也是需要测试的,也是可测的。

样例代码如下:

验证版本号等等。

结论:Application级可测。

2、Activity可测性 ##

Activity可测性,主要预研,Activity里的:

1)private方法是否可测(不管被UI层调用的);

2)public 方法是否可测;

3)static 方法是否可测;

4)相关依赖是否可mock;

5)接收参数的Activity是否可测。

(1)private方法是否可测(不管是否被UI层调用的)。

业务代码中,private 方法通常被UI层调用,如下,被按back键时调用,如果按一般的测试java层是测试不到的。

如果你又想通过反射来测试:

要么你要得到当前业务app的该Activity实例,这个一般人是得不到的;

要么又想自己创建一个Activity来反射,但因android机制,即使你能创建出来,那这个Activity实例也不是业务app的该Activity实例。方法依赖其他逻辑照样测试不了。

可测性预研结果:可测。

测试样例代码如下:

先创建Activity的rule,然后通过rule.getActivity()获得实例。再获取该page。

有了对象,再反射调用就可以了,最后验证结果。

结论:Activity里的 private方法可测。

(2)public 方法是否可测。

(3)static 方法是否可测。

得到了实例,public和static均可以直接调用。

结论:Activity里的public 返回和static返回 可测。

(4)相关依赖是否可mock。

如下,purify业务app中,有第三方库的调用,这个调用里存在异步线程的处理。如果不mock,将不能得到正确的验证结果。

mock后的测试样例代码如下:


结论: 可Mock。

(5)接收参数的Activity是否可测。

如下,业务代码中,Activity启动时含有对启动intent是否有参数的逻辑。如含有对应参数,则上报一个统计点。

那么这个逻辑是否可测呢?

测试样例代码如下:


结论:接收参数的Activity可测。

至此,Activity里大部分逻辑都可测。

3、Service可测性

Service进程是app的一个单独进程,里面的不少逻辑,同样很多人人为不可测,那实际尼?

Service测试样例代码如下:


结论:Service可测。

4、广播Broadcast可测性

假设有一业务广播如下:

同样的,广播测试样例代码如下:

结论:broadcast可测。

二、java层单元和接口测试

纯java的逻辑测试,是大部分人做的,但这里所要说的,还包含一些依赖android环境的测试,比如,一个java方法依赖了android 的context,SharedPreferences等,可能有人就又认为这些测不了了。

单元测试:包含类的测试,主要测试多条件入参的测试,比如一个类方法 不同参数的传入测试。

接口测试:包含调用链路的测试,包括不同层次的链路调用。主要测试集成路径,不同参数的路径。

单元测试和接口测试,大部分做过白盒的都懂,这里就不细说。

主要说说 ,涉及Android部分的如何测试。

如下业务代码:

被测方法isNeedUpdateTrashRules –>调用了 retrieveTrashRulesUpdateMillis,而该方法用了Android环境SharedPreferences。

思路还是:mock掉,然后塞进去,最后验证。

测试样例代码如下:

三、异步线程可测性

被测方法调用了异步代码时,测试代码将无法正确的验证结果。导致用例失败或不可测。

因此,如何能让异步代码可测,也是如何让现有代码更可测的一部分。

异步线程的可测性思路。

思路一:通过CountDownLatch来实现,这个需要改业务代码,一般不怎么用。

思路二:mock掉异步对象,反射进去,当执行异步时,通过调用拦截获得thread对象,立即调用thread.run()。

思路三:new thread的方式,一般都和回调一起,先mock掉父调用,拦截回调,直接调用回调。

下面说下使用较多的 ExecuteService异步和handle.post的测试样例:ExecuteService异步的测试样例。

业务有如下图异步线程:

测试样例如下:

handle.post() 样例:

如下,业务代码使用了内部handle来处理消息,当执行到handle.post() 因为是异步,测试用例无法获取正常结果。

然而 handle.post有如下多个方法,难道每个都要针对性处理么?那这样比较麻烦。

翻看Android 源码handle.post部分,发现如下调用关系:

各方法最终都调用了 handle.sendMessageAtTime(Message,long),因此只要mock这个就可以了。

测试样例代码如下:



四、函数回调可测性

思路:依然是通过mock,并拦截函数调用,获取对象直接调用。

1、参数传入回调方式可测性

如下业务代码:原始回调被包装了3次回调,最后以参数方式传入。


测试样例代码:

五、Mock简单举例

Android 白盒测试mock,支持多种框架,常用的用mockito和PowerMock。

其中静态方法的mock只能用PowerMock。

Local Unit Tests :可用mockito和PowerMock。

Instrumented Tests :只能用mockito。

1、Android环境Mock

Android Context的mock:


2、Android API Mock

3、普通Mehod和Field Mock

普通对象的method调用:


普通Field的mock:

4、静态Method和Field Mock

静态要mock的,需用PowerMock。网上很多资料。这里就不细说了。

六、反射调用与执行

但遇到 private 标示的逻辑时,不能直接调用。但又想把他测试覆盖,可用反射来执行。

一般主要在:

1、不好从上层介入的地方:private 标示的逻辑,被UI层调用,比如被onclick事件调用,你不好从上层介入。

2、多参数或分支较多:private标示的逻辑,入参较复杂,内部分支和逻辑较多,想以单测函数来先保证正确性。

业务代码的反射和 lib库代码的反射,用法差不多。就写在一起了: ReflectUtil是已经封装好的反射工具类。

七、业务代码直接调用

在模式和方案选型时,是否能直接调用业务代码,也是一个衡量项。最好是能直接调用。能省事省力。

1、业务代码直接调用

未完待续……

关注微信公众号:腾讯移动品质中心TMQ,获取更多测试干货!

这里写图片描述

这篇关于【腾讯TMQ】像google一样测试系列之四:技术篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/902073

相关文章

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

金融业开源技术 术语

金融业开源技术  术语 1  范围 本文件界定了金融业开源技术的常用术语。 本文件适用于金融业中涉及开源技术的相关标准及规范性文件制定和信息沟通等活动。