2025年sdk测试是用来干什么的(sdk测试是用来干什么的呢)

sdk测试是用来干什么的(sdk测试是用来干什么的呢)前面花了很多篇幅介绍的 JUnit 和 Mockito 它们都是针对 Java 全平台的一些测试框架 写到这里 咱们开始介绍一个专门针对 Android 平台的单元测试框架 Robolectric Robolectrie 官网 http robolectric org Android 程序员都知道 在 Android 模拟器或者真机设备上运行测试是很慢的 执行一次测试需要编译 部署 启动 app 等一系列步骤

大家好,我是讯享网,很高兴认识大家。



  1. 在build.gradle中添加以下依赖:
  • 基础配置
 

讯享网
  • 如果项目里有用到support-v4包,需要如下配置
讯享网
  • 关于MultiDex
    Robolectric是运行在JVM上的,所以也就没有“MultiDex”这回事,如果我们的工程里使用了它,还需如下配置:
 

它hook了MultiDex的实现,让它在install的时候啥也不干。

  1. 通过注解设置测试类的test runner
讯享网
  1. Mac及Linux用户必须注意如下配置

在Mac以及Linux上,第一次使用时,经常会出现一个很诡异的问题,会告诉我们如下错误:

 

讯享网<img src="https://yqfile.alicdn.com/img_ab25feb5fb688e634fa7b353fe.png?x-oss-process=image/resize,w_1400/format,webp" alt="img_ab25feb5fb688e634fa7b353fe.png" fetchpriority="high" data-url="https://yqfile.alicdn.com/img_ab25feb5fb688e634fa7b353fe.png"> 

设置JUnit的Working directory
  1. Android Studio 3.0注意事项
    如果Android Studio是3.0及以上版本的,需要加上以下配置,否则运行不起来,会一直报错。
 

场景:我们有一个Activity,里面有一个Button,点击该Button跳转到另外一个Activity。
测试目的:验证用户点击该Button后,确实是跳转到了我们指定的Activity。
具体的布局文件以及Activity代码如下:

讯享网
 

测试代码如下:

讯享网

第一次运行需要比较长的时间,主要是从远程仓库下载robolectric所需的依赖库到本地,请耐心等待即可。

可以通过@Config注解来配置Robolectric运行时的行为。这个注解可以用来注释类和方法,如果类和方法同时使用了@Config,那么方法的设置会覆盖类的设置。如果你有很多测试类都采用同样的配置,那么你可以创建一个基类,通过@Config注解配置该基类,那么其他子类都能共享该配置。

7.4.1 配置constants
 

使用@RunWith(RobolectricTestRunner.class)时,必须要指定@Config(constants = BuildConfig.class),这样它会从build/intermediates/目录下找到manifest、assets、resource等目录并加载相应的资源。


讯享网

讯享网<img src="https://yqfile.alicdn.com/img_73bde3d9cb8bfa5806d84d1f.png?x-oss-process=image/resize,w_1400/format,webp" alt="img_73bde3d9cb8bfa5806d84d1f.png" loading="lazy" data-url="https://yqfile.alicdn.com/img_73bde3d9cb8bfa5806d84d1f.png"> 


如上图所示,指定该配置后,Robolectric才会加载图中所示文件夹中对应的资源,否则就无法加载manifest、assets、resource等资源,测试也跑不起来。

7.4.2 配置SDK版本
 
7.4.3 配置Application
讯享网

前面说过,在方法上也可以使用@Config来配置,如果类级别与方法级别同时有@Config配置,方法级别上的配置会覆盖类级别的配置。

7.4.4 配置resource、assets、manifest路径

前面介绍配置constants属性时,Robolectric会自动加载build/intermediates目录下的资源文件,可以使用以下配置使Robolectric加载特定的资源文件。

 

这里的路径很容易令人迷惑,必须要说明几点:

  • 如果使用了@Config(constants = BuildConfig.class),资源文件的路径会固定为build目录。避免constants配置与自定义manifest配置一起使用,否则后者配置会不生效。
  • manifest设置的目录base于Unit Test Config里面的”Working Directory”,具体如7.2里的图“设置JUnit的Working directory”所示。
  • resourceDir、assetDir的目录base于manifest的父目录。
讯享网

<img src="https://yqfile.alicdn.com/img_cac8514b75d5ea3f4ac4.png?x-oss-process=image/resize,w_1400/format,webp" alt="img_cac8514b75d5ea3f4ac4.png" loading="lazy" data-url="https://yqfile.alicdn.com/img_cac8514b75d5ea3f4ac4.png"> 

自定义manifest目录示意图

该例子配置了一个指定的AndroidManifest.xml文件以及assets文件目录,测试程序读取assets里test.txt文件内容并打印出来。manifest的相对路径就是“UnitTest”工程里的“app”模块所在的文件路径,assetDir的相对路径就是AndroidManifest.xml文件的父目录路径。

7.4.1 生命周期

修改下7.3里面的测试案例代码如下,在各个生命周期回调中修改Button的文本内容。

讯享网

测试代码如下:

 

控制台打印结果如下所示:

讯享网
7.4.2 setupActivity()与buildActivity()

前面的示例中看到有2种创建Activity的方式:

 

这2种方式有什么差别呢,查看setupActivity()的源码可以看到:

讯享网
7.4.3 测试Activity的跳转

在前面7.3中是示例中已经展示了。

7.4.4 测试Toast
 
讯享网
7.4.5 测试Dialog
 
7.4.6 测试资源文件
讯享网
7.4.7 测试Fragment
 

顾名思义就是影子类,Robolectric定义了很多shadow class,用来修改或者扩展Android OS中类的行为。当一个Android中的类被实例化时,Robolectric会去寻找对应的影子类,如果找到了则会创建一个影子对象并与之相关联。每当Android类中的一个方法被调用时,Robolectric会保证其影子类中相应的方法会被先调用。这对所有的方法都适用,包括static和final类型的方法。

讯享网

通过该方法几乎可以获取大部分Android类的shadow class,例如:

 
Shadow Classes
讯享网

Shadows.shadowOf()方法不能作用于自定义shadow class,为了使Robolectric能够识别自定义shadow类,需要采用@Config注解,如下所示:

 

执行该测试方法,控制台打印结果如下:

讯享网

从以上控制台打印结果中可以看到,welcome()方法实际执行的是ShadowCompany中的方法。

Shadowing Constructors

如果需要对构造函数进行shadow,必须实现constructor方法,并且该方法的参数必须与构造函数的参数一样。我们稍微修改前面的Company类以及ShadowCompany类,对其构造函数进行shadow。

 

这个时候再执行测试代码,返回结果如下,可以看到Company的构造函数并没有执行。

讯享网
Getting access to the real instance

有时shadow类需要使用它们关联的真实对象,可以通过@RealObject注解声明一个属性来实现。

 
自定义shadow要点
  1. @Implements注解指定需要对哪个类进行shadow;
  2. @Implementation指定需要对哪个方法进行替换;
  3. 使用constructor来对构造器进行替换;
  4. @RealObject来引用真实的关联对象;

前面介绍JUnit4的时候讲到,JUnit4中有个叫Parameterized的test runner,能够实现参数化测试,同样Robolectric也提供了同样的功能。

讯享网

运行结果如下:

 

  1. 不支持JNI调用。凡是涉及到JNI调用的方法,都不能使用Robolectric来进行单元测试。对于复杂的应用,或多或少都会有JNI调用,可行的方案是设置一个全局变量来控制是否加载so库。

系列文章:
Android单元测试(一):前言
Android单元测试(二):什么是单元测试
Android单元测试(三):测试难点及方案选择
Android单元测试(四):JUnit介绍
Android单元测试(五):JUnit进阶
Android单元测试(六):Mockito学习
Android单元测试(七):Robolectric介绍
Android单元测试(八):怎样测试异步代码

小讯
上一篇 2025-05-11 21:45
下一篇 2025-05-09 17:21

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/170228.html