Android 应用测试的各种环境问题记录(Instrumentation测试)

news2024/11/26 21:50:47

报错记录

failed to configure packages targetSdkVersion(未解决)

failed to configure com.demo.test.SettingsActivityTest.testOnCreate_withNullSavedInstanceState: Package targetSdkVersion=34 > maxSdkVersion=32
java.lang.IllegalArgumentException: failed to configure com.demo.test.SettingsActivityTest.testOnCreate_withNullSavedInstanceState: Package targetSdkVersion=34 > maxSdkVersion=32
    at 

Failed to release mocks 第三方mock对象释放失败

@RunWith(AndroidJUnitRunner.class),错误表明使用Mockito框架在释放对象的时候fail,原因可能是使用过了第三方的mock maker。

INSTRUMENTATION_STATUS: stack=org.mockito.exceptions.base.MockitoException: 
Failed to release mocks

This should not happen unless you are using a third-party mock maker
    at com.demo.UITest.setUp(UITest.java:31)
    ... 32 trimmed
Caused by: org.mockito.exceptions.base.MockitoException: Cannot read state from field: private com.demo.UITest com.demo.UITest.fragment, on instance: com.demo.UITest@9254eb6
    ... 34 more
Caused by: java.lang.IllegalStateException: Could not initialize plugin: interface org.mockito.plugins.MemberAccessor (alternate: null)
    at org.mockito.internal.configuration.plugins.PluginLoader$1.invoke(PluginLoader.java:84)

    ... 34 more
Caused by: java.lang.IllegalStateException: Failed to load interface org.mockito.plugins.MemberAccessor implementation declared in java.lang.CompoundEnumeration@5bce1d5
    at org.mockito.internal.configuration.plugins.PluginInitializer.loadImpl(PluginInitializer.java:56)

可能是因为原本使用了Mockito 5,而Mockito 5 开发文档中提到 由于我们使用了 JVM 内部 API,我们发现 JDK 最新版本的问题/不兼容性有所增加。最值得注意的是,JDK 17 进行了一些与当前子类 mockmaker 不兼容的更改。

 androidTestImplementation 'org.mockito:mockito-android:5.0.0' //适用于Android测试

参考:JDK17以上版本不兼容导致的mock maker问题:Could not initialize plugin: interface org.mockito.plugins.MockMaker-CSDN博客文章浏览阅读1.3k次,点赞10次,收藏11次。对于高版本java和springboot在使用Mockito时产生的不兼容问题_could not initialize plugin: interface org.mockito.plugins.mockmakerhttps://blog.csdn.net/daisy__forever/article/details/140871609

方法:对于Mockito 5+ 和 jdk 17+ 在内联模拟生成器将不起作用,可以使用子类模拟生成器,在build.gradle添加inline的依赖。

dependencies {
    androidTestImplementation 'org.mockito:mockito-android:4.0.0' //适用于Android测试
    implementation 'org.mockito:mockito-android:4.0.0' //适用于Android测试
    androidTestImplementation 'org.mockito:mockito-inline:4.0.0'
}

疑问:

1、不知道为什么需要implemention,不然Mockito类import会报错,是因为build APK用到吗?

2、是不是修改成mockito-android:4.0.0,就不需要加inline了?——实测是的,原本报错是因为5.0.0版本

Can't create handler inside thread Thread that has not called Looper.prepare() 交互界面线程

INSTRUMENTATION_STATUS: stack=java.lang.RuntimeException: Can't create handler inside thread Thread[Instr: androidx.test.runner.AndroidJUnitRunner,5,main] that has not called Looper.prepare()
    at android.os.Handler.<init>(Handler.java:228)
    at android.os.Handler.<init>(Handler.java:130)
    at androidx.preference.PreferenceFragmentCompat$1.<init>(PreferenceFragmentCompat.java:121)
    at androidx.preference.PreferenceFragmentCompat.<init>(PreferenceFragmentCompat.java:121)
    at com.demo.settings.PreferenceFragmentBase.<init>(PreferenceFragmentBase.java:49)
    at com.demo.settings.Editor.<init>(Editor.java:103)
    at com.demo.settings.EditorTest.setUp(EditorTest.java:32)

这通常表明测试代码试图在没有准备好 Looper 的线程上执行与 UI 相关的操作。结合测试代码,界面是Fragment,创建和操作 Fragment 必须遵循 Android 的 UI 线程规则。

参考解决方案:

通过activity建立UI线程,填充fragment数据,然后拉起fragment。

@RunWith(AndroidJUnit4.class)
public class DemoEditorTest {

    @Rule
    public ActivityTestRule<DemoSettingsActivity> activityRule =
            new ActivityTestRule<>(DemoSettingsActivity.class);

    @Test
    public void testMenuSave_showSaveDialog() throws Exception {
        //关键还是通过activity启动界面,不然无法运行在主线程(UI)
        activityRule.getActivity().runOnUiThread(new Runnable() {

            @Override
            public void run() {
                DemoEditor fragment = new DemoEditor ();
                DemoEditor.demoData demoData = new DemoEditor.DemoData();
                fragment.setDemoData(demoData);
                activityRule.getActivity().getSupportFragmentManager().beginTransaction()
                        .replace(R.id.fragment_container, fragment)
                        .commitNow();
            }
        });
    }
}

onView().check(matches(withText())));

代码:

        // Check the empty TextView is updated
        onView(withId(android.R.id.empty))
                .check(matches(withText(com.android.settings.R.string.demo_settings_not_available)));

报错提示:

根因是因为没有import正确,估计默认使用了mock的,实际要用UI测试的,但是IDE不会提供正确的解决方案。

解决方案:导入espresso包

import static androidx.test.espresso.assertion.ViewAssertions.matches;

gradle 环境问题 

Android Studio 默认的SDK、gradle都是怎么配置的?

为什么删除的目录路径都会重新创建.gradle?之前就算TestDemoU删掉了,还是会创建的caches,在哪里设置?

# Windows
# 查找 GRADLE_USER_HOME
echo %GRADLE_USER_HOME%

# 查找 GRADLE_HOME
echo %GRADLE_HOME%

Windows查找GRADLE_USER_HOME没有输出是没有配置的原因吗?GRADLE_HOME 已经配置,所以是有的。

如何查找Android Studio默认的配置路径?

在AS设置里面的 Gradle user home,JDK版本也在此设置:

File => Settings => Build, Execution, Deployment => Build Tools => Gradle

有关环境变量:

  • GRADLE_USER_HOME
  • GRADLE_LOCAL_JAVA_HOME
Gradle General Settings
Gradle General Settings

(点多了以后,reset按钮都没有了...)

Gradle Projects
Gradle Projects

参考:IDEA如何正确配置Gradle? GRADLE_USER_HOME 和 Gradle user home的区别_grade user home-CSDN博客文章浏览阅读6.1w次,点赞55次,收藏153次。IDEA如何正确配置Gradle? GRADLE_USER_HOME 和 Gradle user home的区别缘起目标GRADLE_USER_HOME和Gradle user home的区别GRADLE_USER_HOMEGradle user homeIDEA Gradle user home的坑如何验证这个坑?最终解决方案第一种解决方案,不下载Gradle,不配置关于Gradle的任何的环境变量,不配置IDEA的Gradle user home第二种方案:如果你想自己安装gradle,并且所有的工程_grade user homehttps://blog.csdn.net/iot_ai/article/details/106617626

难怪控制台命令 ./gradlew 都fail的,但其实设置了多少都没办法解决一些class问题。

测试方案和工具选型

到底选择test还是androidTest目录实现测试?

会不会有些问题就是目录不对呢?不能直接运行单元测试,必须用仪器测试?

在Android项目中,androidTesttest目录有着不同的用途,主要用于不同类型的测试。

  1. test目录

    • 该目录用于单元测试(Unit Tests)。
    • 单元测试是对应用中最小可测试单元的验证,通常是对单个类或方法的测试。
    • 这些测试可以在本地环境中运行,不依赖于Android的框架。
    • 使用JUnit等测试框架来编写和运行这些测试。
  2. androidTest目录

    • 该目录用于仪器测试(Instrumentation Tests),也称为功能测试(Functional Tests)或集成测试(Integration Tests)。
    • 这些测试可以验证应用程序在Android设备或模拟器上的行为,通常涉及到多个组件的交互。
    • 需要Android设备或模拟器环境来运行,通常使用Espresso、UI Automator等测试框架。
    • 它们可以访问Android的API和框架。

总结:

  • test目录用于快速的单元测试,不依赖Android环境。
  • androidTest目录用于需要Android运行时环境的仪器测试。

比如AOSP源码中,Settings 应用的测试目录结构,没有像第三方应用开发默认的目录结构区分androidTest 和 test,而是测试用例都在test目录维护,分为单元测试unit、界面测试uitesets等。

Settings 应用的测试目录结构
Settings 应用目录结构

@RunWith的选择建议

  • 使用 MockitoJUnitRunner:当你只需要测试简单的 Java 类逻辑,不依赖于 Android 框架时。
  • 使用 AndroidJUnit4:当你的测试需要运行在真实的 Android 环境中,且涉及到 UI 组件或 Android API。
  • 使用 RobolectricTestRunner:当你想要在 JVM 环境中运行 Android 测试,且希望在不依赖真实设备的情况下进行单元测试或集成测试。
1. MockitoJUnitRunner
  • 主要用途:用于单元测试,特别是需要 Mockito 模拟的场景。
  • 特点
    • 自动初始化 Mockito 的 mock 对象。
    • 适合非 Android 环境的简单 Java 类测试。
    • 不支持 Android 组件和框架依赖的测试
2. AndroidJUnit4
  • 主要用途:用于 Android Instrumentation 测试,通过 Android 测试框架运行测试。
  • 特点
    • 支持完整的 Android 环境,能够访问 Android API 和组件。
    • 适合 UI 测试和与 Android 组件交互的测试
    • 不会自动处理 Mockito 的 mock 对象,需要手动配置。
3. RobolectricTestRunner
  • 主要用途:用于在 JVM 上运行 Android 测试,模拟 Android 环境。
  • 特点
    • 不需要物理设备或模拟器即可运行 Android 测试。
    • 模拟 Android API,使得测试更快、更容易进行。
    • 支持使用 Mockito 进行 mock 对象的创建和使用。
    • 适合进行单元测试和集成测试,尤其是在需要 Android 上下文的情况下。

参考资料

官方文档

自动化界面测试  |  Android Developersicon-default.png?t=O83Ahttps://developer.android.google.cn/training/testing/ui-tests?hl=zh-cn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2248061.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python 爬虫从入门到(不)入狱学习笔记

爬虫的流程&#xff1a;从入门到入狱 1 获取网页内容1.1 发送 HTTP 请求1.2 Python 的 Requests 库1.2 实战&#xff1a;豆瓣电影 scrape_douban.py 2 解析网页内容2.1 HTML 网页结构2.2 Python 的 Beautiful Soup 库 3 存储或分析数据&#xff08;略&#xff09; 一般爬虫的基…

周志华深度森林deep forest(deep-forest)最新可安装教程,仅需在pycharm中完成,超简单安装教程

1、打开pycharm 没有pycharm的&#xff0c;在站内搜索安装教程即可。 2、点击“文件”“新建项目” 3、创建项目&#xff0c;Python版本中选择Python39。如果没有该版本&#xff0c;选择下面的Python 3.9下载并安装。 4、打开软件包&#xff0c;搜索“deep-forest”软件包&am…

用python将一个扫描pdf文件改成二值图片组成的pdf文件

使用墨水屏读书现在似乎越来越流行&#xff0c;这确实有一定的好处&#xff0c;例如基本不发热&#xff0c;电池续航时间超长&#xff0c;基本不能游戏所以有利于沉浸式阅读&#xff0c;还有不知道是不是真的有用的所谓防蓝光伤害。但是&#xff0c;如果阅读的书籍是扫描图片组…

前端---HTML(一)

HTML_网络的三大基石和html普通文本标签 1.我们要访问网络&#xff0c;需不需要知道&#xff0c;网络上的东西在哪&#xff1f; 为什么我们写&#xff0c;www.baidu.com就能找到百度了呢&#xff1f; 我一拼ping www.baidu.com 就拼到了ip地址&#xff1a; [119.75.218.70]…

电影风格城市夜景旅拍Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 电影风格城市夜景旅拍通过 Lightroom 调色&#xff0c;将城市夜晚的景色打造出如同电影画面般的质感和氛围。以独特的色彩和光影处理&#xff0c;展现出城市夜景的魅力与神秘。 预设信息 调色风格&#xff1a;电影风格预设适合类型&#xff1a;人像&#xff0c;街拍…

【多模态】Flamingo模型技术学习

Flamingo模型技术学习 前言Flamingo——支持上下文学习的多模态模型模型架构模型架构——Resampler模型架构——插入到LLM的cross-attention层 代码查看——masked cross-attentionnote 前言 最近多模态模型特别火&#xff0c;从头开始学习&#xff01;在前面写的几篇里面学习了…

C 语言学习-06【指针】

1、目标单元与简介存取 直接访问和间接访问 #include <stdio.h>int main(void) {int a 3, *p;p &a;printf("a %d, *p %d\n", a, *p);*p 10;printf("a %d, *p %d\n", a, *p);printf("Enter a: ");scanf("%d", &a)…

ctfshow单身杯2024wp

文章目录 ctfshow单身杯2024wp签到好玩的PHPezzz_sstiez_inject ctfshow单身杯2024wp 签到好玩的PHP 考点&#xff1a;序列化反序列化 <?phperror_reporting(0);highlight_file(__FILE__);class ctfshow {private $d ;private $s ;private $b ;private $ctf ;public …

超高流量多级缓存架构设计!

文章内容已经收录在《面试进阶之路》&#xff0c;从原理出发&#xff0c;直击面试难点&#xff0c;实现更高维度的降维打击&#xff01; 文章目录 电商-多级缓存架构设计多级缓存架构介绍多级缓存请求流程负载均衡算法的选择轮询负载均衡一致性哈希负载均衡算法选择 应用层 Ngi…

【Mybatis】@Param注解 resultMap手动映射

文章目录 一、映射文件参数二、查询映射2-1 一对一2-2 一对多2-3 总结 一、映射文件参数 Param 注解官方文档解释 1、单个参数&#xff08;对象&#xff09;不使用注解 public int save(User user);<!-- 添加用户 --> <insert id"save" parameterType&quo…

Unreal从入门到精通之如何绘制用于VR的3DUI交互的手柄射线

文章目录 前言实现方式MenuLaser实现步骤1.Laser和Cursor2.移植函数3.启动逻辑4.检测射线和UI的碰撞5.激活手柄射线6.更新手柄射线位置7.隐藏手柄射线8.添加手柄的Trigger监听完整节点如下:效果图前言 之前我写过一篇文章《Unreal5从入门到精通之如何在VR中使用3DUI》,其中讲…

风尚云网前端学习:一个简易前端新手友好的HTML5页面布局与样式设计

风尚云网前端学习&#xff1a;一个简易前端新手友好的HTML5页面布局与样式设计 简介 在前端开发的世界里&#xff0c;HTML5和CSS3是构建现代网页的基石。本文将通过一个简单的HTML5页面模板&#xff0c;展示如何使用HTML5的结构化元素和CSS3的样式特性&#xff0c;来创建一个…

STM32WB55RG开发(5)----监测STM32WB连接状态

STM32WB55RG开发----5.生成 BLE 程序连接手机APP 概述硬件准备视频教学样品申请源码下载参考程序选择芯片型号配置时钟源配置时钟树RTC时钟配置RF wakeup时钟配置查看开启STM32_WPAN条件配置HSEM配置IPCC配置RTC启动RF开启蓝牙LED配置设置工程信息工程文件设置参考文档SVCCTL_A…

RK356x-10:串口(uart)配置与调试

本文记录RK3566/RK3568通用异步串口(uart)的配置与调试过程 1. 配置uart节点 1.1 在rk3568.dtsi中已经定义了uart0,uart1...&#xff0c;根据电路图&#xff0c;确定需要使用的是哪个串口&#xff0c;比如我使用的是uart0&#xff0c;在另外一个与我们自己主板相关的dtsi文件&…

【C++】从C到C++

C和C一些语法区别 1.三目运算符&#xff1a;在C语言中返回的是一个常量&#xff0c;是不能被赋值的&#xff1b;而C中返回的是变量&#xff0c;可以被赋值 2.C中的函数必须要写返回值类型 3.在全局下&#xff0c;C不允许int a;和int a10;等这种重定义二义性操作 4.在C中不要…

WSL安装不同版本ubuntu(已有ubuntu20.04,再装ubuntu18.04)

参考&#xff1a; 如何在 WSL 中删除指定版本的 Ubuntu&#xff08;以删除 Ubuntu 22.04 为例&#xff09;_wsl卸载某个-CSDN博客 已有ubuntu20.04&#xff0c;现在再安装一个ubuntu18.04 直接参考下面我写的链接的第四步&#xff0c;前面的步骤都不需要再做了 Win11安装WSL…

《硬件架构的艺术》笔记(七):处理字节顺序

介绍 本章主要介绍字节顺序的的基本规则。&#xff08;感觉偏软件了&#xff0c;不知道为啥那么会放进《硬件架构的艺术》这本书&#xff09;。 定义 字节顺序定义数据在计算机系统中的存储格式&#xff0c;描述存储器中的MSB和LSB的位置。对于数据始终以32位形式保存在存储器…

wkhtmltopdf的安装与使用

本文来记录下wkhtmltopdf的安装与使用 文章目录 概述下载路径安装配置wkhtmltopdf 参数详解代码实现本文小结 概述 将html转为pdf的组件有很多&#xff0c;但是还没有哪一款能达到这个效果&#xff0c;其只要原因是wkhtmltopdf使用webkit网页渲染引擎开发的用来将 html转成 pdf…

241125学习日志——[CSDIY] [InternStudio] 大模型训练营 [17]

CSDIY&#xff1a;这是一个非科班学生的努力之路&#xff0c;从今天开始这个系列会长期更新&#xff0c;&#xff08;最好做到日更&#xff09;&#xff0c;我会慢慢把自己目前对CS的努力逐一上传&#xff0c;帮助那些和我一样有着梦想的玩家取得胜利&#xff01;&#xff01;&…

C++ High Performance(壹)

目录 前言 C概述 1.零开销原则 2.值语义 3.C函数中参数的含义 C必备技能 1.在函数返回值中使用auto 2.使用decltype(auto)转返回类型 3.对变量使用auto 4.常量引用 5.指针的常量传播 6.移动语义 7.资源获取与五法则 8.默认移动语义和零法则 9.将&&…