Android 单元测试环境配置问题 Execution failed for task ‘:mergeDebugJavaResource‘.

背景和挑战

随着人工智能(AI)技术的迅猛发展,AI在各行各业的应用前景被普遍看好。无论是在医疗、金融、教育,还是在软件开发领域,AI都展示出了巨大的潜力。然而,尽管AI能够在许多方面提供支持和提升效率,但在软件开发尤其是Android单元测试过程中,AI并不能解决所有功能问题,特别还有开发环境的问题。

ChatGPT确实能提供方案,但是在单元测试领域,尤其是Android跟UI业务强相关的测试案例上,依然是更需要人工介入的设计。

AI在Android单元测试中的制约

在Android开发过程中,单元测试是确保代码质量和功能实现的重要环节。尤其在构建复杂应用时,开发者需要对大量的类和方法进行测试。然而,面对以下两类问题,AI工具往往显得力不从心:

  1. 业务逻辑复杂性:
    AI可能会在代码自动生成和测试用例建议方面提供帮助,但对于应用中复杂的业务逻辑,AI工具通常无法完全理解开发者的意图或业务场景。AI生成的测试用例可能覆盖面广,但由于缺乏对实际业务逻辑的深入理解,它们往往无法有效捕捉到潜在的逻辑错误和边缘情况。例如,考虑一个用户输入验证的功能,AI可能很难准确模拟用户的各种输入情境,导致某些逻辑分支未被测试到。

  2. 环境依赖性:
    Android开发环境的配置往往复杂多变,不同的Android Studio版本、SDK版本以及第三方库的依赖关系等都会影响到单元测试的运行结果。当开发环境没有正确配置时,AI工具提供的自动化测试方案可能无法如预期运行。此外,某些调试错误的产生,往往是由于环境不一致造成的,而AI工具无法直接解决这类依赖性问题。随着Android Studio以及相关工具的更新迭代,许多开发者在配置本地环境时常常面临不兼容或设置不当的问题,这可能会导致调试错误率显著上升。

应对措施

面对AI技术在Android开发中的局限性,开发者需要采取有效的措施来确保软件质量。

  1. 加强人工审查:
    尽管AI可以为代码和测试生成提供便利,开发者仍需在关键业务逻辑和边缘情况的测试上进行人工审查。这包括审查AI生成的测试用例,确保它们涵盖所有必要场景。

  2. 强化开发环境规范:
    围绕Android项目建立标准化的开发环境配置文档,并鼓励团队成员严格遵循,可以有效降低因环境配置不当引发的调试错误率。同时,使用容器化技术(如Docker)可以帮助创建一致的开发环境,减少环境依赖性问题。

  3. 积极学习与应对AI的负面影响:
    开发者应保持对AI技术动向的敏感,定期学习有关AI技术的最新研究和应用案例,合理利用AI工具的优势,同时意识到其局限性。

问题案例

环境配置

为什么编译会关联到其他app模块的报错?

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':mergeDebugJavaResource'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.MergeJavaResWorkAction
   > 4 files found with path 'META-INF/LICENSE-notice.md' from inputs:

      - E:\AndroidStudioCode\TestDemoU\.gradle\caches\transforms-4\bac8a02ec876d96f400e223a6f964115\transformed\jetified-junit-platform-engine-1.8.2.jar
      - E:\AndroidStudioCode\TestDemoU\.gradle\caches\transforms-4\3ddceeb372c20321054059e75b202cf1\transformed\jetified-junit-platform-commons-1.8.2.jar
      - E:\AndroidStudioCode\TestDemoU\.gradle\caches\transforms-4\1e6645cc7923ded6fc2e47df844244a4\transformed\jetified-junit-jupiter-engine-5.8.2.jar
      - E:\AndroidStudioCode\TestDemoU\.gradle\caches\transforms-4\5f005f3f5e87a878afdb727ca13fce01\transformed\jetified-junit-jupiter-api-5.8.2.jar
     Adding a packaging block may help, please refer to
     https://developer.android.com/reference/tools/gradle-api/8.4/com/android/build/api/dsl/Packaging
     for more information

问题分析:

如上错误提示显示在执行 :mergeDebugJavaResource 任务时,多个库中发现了相同的文件(在本例中是 META-INF/LICENSE-notice.md)。这是在 Gradle 构建过程中常见的资源合并冲突问题。

mergeDebugJavaResource 解决方案

1、使用 Gradle 的 packagingOptions:

  • 可以在 build.gradle 文件中使用 packagingOptions 来解决资源合并冲突。
    • 若不存在此项配置,请在build.gradle 新增 packagingOptions 块,用于排除重复文件。
  • 通过配置 exclude 来排除多余的文件。例如,在android 块内添加以下代码:

Groovy (Gradle)

android {...packagingOptions {exclude 'META-INF/LICENSE-notice.md' //本案例是此问题,如下是相关配置exclude 'META-INF/LICENSE.md'exclude 'META-INF/LICENSE.txt'exclude 'META-INF/NOTICE.txt'}
}

Note:Gradle 是基于 Groovy 的 DSL(领域特定语言),尽管 Gradle 使用 Groovy 作为其脚本语言,但它们在用途和功能上有显著的区别。

Groovy 和 Gradle 的区别
特性GroovyGradle
类型编程语言(一种基于 Java 的动态语言)构建自动化工具
基于Java 虚拟机 (JVM)Groovy
目的开发各种类型的应用、脚本和测试管理和自动化构建过程
语法灵活、简洁,支持动态类型基于 Groovy 的 DSL(领域特定语言)
使用领域应用开发、快速原型、测试项目构建、依赖管理
生态系统与 Java 完全兼容,广泛用于各种应用支持多种语言和框架,尤其是 Java 和 Android

2、查看冲突的依赖库:
确认冲突的文件来源于哪些库,并检查这些库的版本。如果某些库的版本过旧或不兼容,考虑升级它们。例如,可能会看到 junit-platform-engine 和 junit-platform-commons 的版本。不妨确保所有相关的 JUnit 依赖库都是相同的版本。

结果:但是如上报错的文件夹已经不存在了,还是会报错,没有采用这种方式解决,无法解除相关gradle 文件的依赖。

3、运行 Gradle 依赖报告:
使用以下命令生成依赖树,查看具体使用了哪些库及其版本:

# 查看使用的依赖库和版本
./gradlew app:dependencies

结果:可是本地环境始终有问题,是运行任何gradle都报错的版本冲突

  • apiElements
  • javadocElements
  • runtimeElements
./gradlew 报错1
./gradlew 报错1
./gradlew 报错2
./gradlew 报错2

* What went wrong:
A problem occurred configuring root project 'Demo'.
> Could not resolve all artifacts for configuration ':classpath'.
   > Could not resolve com.android.tools.build:gradle:8.4.0.

     Required by:
         project :
      > No matching variant of com.android.tools.build:gradle:8.4.0 was found. The consumer was configured to find a library for use during runtime, compatible with Java 8, packaged as a jar, and its dependencies declared externally, as well as attribute 'org.gradle.plugin.api-version' with value '8.7' but:
          - Variant 'apiElements' declares a library, packaged as a jar, and its dependencies declared externally:
              - Incompatible because this component declares a component for use during compile-time, compatible with Java 11 and the consumer needed a component for use during runtime, compatible with Java 8
              - Other compatible attribute:
                  - Doesn't say anything about org.gradle.plugin.api-version (required '8.7')
          - Variant 'javadocElements' declares a component for use during runtime, and its dependencies declared externally:
              - Incompatible because this component declares documentation and the consumer needed a library
              - Other compatible attributes:
                  - Doesn't say anything about its elements (required them packaged as a jar)
                  - Doesn't say anything about its target Java version (required compatibility with Java 8)
                  - Doesn't say anything about org.gradle.plugin.api-version (required '8.7')
          - Variant 'runtimeElements' declares a library for use during runtime, packaged as a jar, and its dependencies declared externally:
                  - Doesn't say anything about org.gradle.plugin.api-version (required '8.7')

JDK版本不对——修改Project Structure中的JDK版本也不对。

Project Structure - Modules
Project Structure - Modules

引出更多的配置问题了,有关于单个配置,也有多文件版本适配的问题。

直接在控制台使用./gradlew命令大概是全局环境的问题,而GUI里面的单独项目gradle看起来可以运行,可是没有任何输出

4、使用 implementation 或 api 而不是 compile:
确保在使用依赖时使用了最新的配置方法,比如 implementation 或 api,而不是过时的 compile。这有助于避免潜在的版本冲突。

5、清理和重建项目:
有时构建缓存可能导致问题,可以通过以下命令清理项目然后再次尝试构建项目

# 清理
./gradlew clean# 重新构建
./gradlew assembleDebug

结果:尝试了清除和重新配置,都不可以。

测试用例设计

待完善

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无人机应用场景:石油管道巡检技术详解

无人机在石油管道巡检中的应用,以其高效、便捷、灵活的特点,为石油管道的安全管理提供了有力支持。以下是对无人机在石油管道巡检技术方面的详细解析: 一、无人机巡检技术的概述 无人机巡检技术是指利用无人机搭载各种传感器和检测设备&…

51c嵌入式~单片机合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/12362395 一、不同的电平信号的MCU怎么通信? 下面这个“电平转换”电路,理解后令人心情愉快。电路设计其实也可以很有趣。 先说一说这个电路的用途:当两个MCU在不同的工作电压下工作&…

嵌入式硬件实战基础篇(一)-STM32+DAC0832 可调信号发生器-产生方波-三角波-正弦波

引言:本内容主要用作于学习巩固嵌入式硬件内容知识,用于想提升下述能力,针对学习STM32与DAC0832产生波形以及波形转换,对于硬件的降压和对于前面硬件篇的实际运用,针对仿真的使用,具体如下: 设…

Qt主线程把数据发给子线程,主线程会阻塞吗

演示&#xff1a; #include <QCoreApplication> #include <QThread> #include <QObject> #include <QDebug>// 子线程类 class Worker : public QObject {Q_OBJECT public slots:void processData(int data) {qDebug() << "Processing dat…

C++内存池实现

1.内存池概念 内存池就和其他的池数据&#xff08;如线程池&#xff09;结构类似&#xff0c;由程序维护一个“池”结构来管理程序使用的内存&#xff0c;然后根据需要从内存池中申请使用内存或者向内存池中释放内存&#xff0c;来达到高效管理内存的目的。 在一般的内存管理的…

STM32设计学生宿舍监测控制系统

目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 电路图采用Altium Designer进行设计&#xff1a; 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 随着科技的飞速发展和智能化时代的到来&#xff0c;学生宿舍的安全、舒适…

企业如何提高招聘能力?

企业如何提高招聘能力&#xff1f; 许多企业在进行招聘工作时&#xff0c;常常会遇到各种问题和挑战。尽管付出了大量的时间和精力&#xff0c;但结果却并不总是如人意。例如&#xff0c;企业可能会经历一次又一次的面试&#xff0c;却仍然找不到一个能够适应岗位要求的合适人…

大模型在蓝鲸运维体系应用——蓝鲸运维开发智能助手

本文来自腾讯蓝鲸智云社区用户: CanWay 背景 1、运维转型背景 蓝鲸平台从诞生之初&#xff0c;就一直在不遗余力地推动运维转型&#xff0c;让运维团队可以通过一体化PaaS平台&#xff0c;快速编写脚本&#xff0c;编排流程&#xff0c;开发运维工具&#xff0c;从被动地提供…

3588 yolov8 onnx 量化转 rknn 并运行

本教程重点不在如何训练模型&#xff0c;重点是全流程链路&#xff0c;想学训练的可以网上找教程 环境 python 3.10.xrknn-toolkit2-2.2.0ultralytics_yolov8rknn 驱动版本2.2 模型训练 yolov8仓库地址&#xff1a;https://github.com/airockchip/ultralytics_yolov8.git下载…

Vue 组件通信及进阶语法

文章目录 一、scoped 样式冲突二、data 是一个函数三、组件通信1. 父子通信1.1 props 校验1.2 props 比较 data 2. 非父子通信2.1 event bus2.2 provide-inject 四、进阶语法1. v-model 详解2. sync 修饰符3. ref 和 $refs4. $nextTick 一、scoped 样式冲突 注意点&#xff1a;…

LeetCode105.从前序与中序遍历构造二叉树

题目要求 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 提示: 1 < preorder.length < 3000inorder.length preorder.length-3000 < pr…

【问卷调研】HarmonyOS SDK开发者社区用户需求有奖调研

问卷请点击&#xff1a;HarmonyOS SDK开发者社区用户需求有奖调研

IOT物联网低代码可视化大屏解决方案汇总

目录 参考来源云服务商阿里云物联网平台产品主页产品文档 开源项目DGIOT | 轻量级工业物联网开源平台项目特点项目地址开源许可 IoTGateway | 基于.NET6的跨平台工业物联网网关项目特点项目地址开源许可 IoTSharp | 基于.Net Core开源的物联网基础平台项目特点项目地址开源许可…

如何在Mac上切换到JDK 17开发环境

在本文中&#xff0c;我将为您介绍如何在Mac上切换到JDK 17&#xff0c;包括下载和安装JDK 17、设置环境变量、在IntelliJ IDEA中配置项目、修改Maven编译配置&#xff0c;并最终使用mvn clean install重新编译项目。通过这个流程&#xff0c;您可以顺利地将开发环境升级到JDK …

玩转ChatGPT:文献阅读 v2.0

一、写在前面 好久不更新咯。 因为最近ChatGPT更新了不少功能&#xff08;水一篇刷存在感&#xff09;&#xff1a; 上线ChatGPT-4o模型&#xff0c;说推理能力还不错&#xff1b;上线联网功能&#xff0c;类似Kimi那种。 所以呢&#xff0c;用它来读文献就挺舒服的了。例如…

自动驾驶系列—从数据采集到存储:解密自动驾驶传感器数据采集盒子的关键技术

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

HarmonyOS本地存储-Preferences(用户首选项)的使用

一&#xff0c;用户首选项简述 ohos.data.preferences (用户首选项) 用户首选项为应用提供Key-Value键值型的数据处理能力&#xff0c;支持应用持久化轻量级数据&#xff0c;并对其修改和查询。 数据存储形式为键值对&#xff0c;键的类型为字符串型&#xff0c;值的存储数据…

SpringCloud 微服务消息队列灰度方案 (RocketMQ 4.x)

目录 背景遇到的问题 RocketMQ 基础基础消息模型扩展后的消息模型部署模型相关概念点 方案对比影子Topic的方案Tag的方案UserProperty的方案影子Group的方案灰度分区的方案方案对比 灰度分区方案设计适配只有部分灰度的情况所做的功能扩展消费者&#xff08;无灰度&#xff09;…

「QT」文件类 之 QDataStream 数据流类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合「C/C」C/C程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定制…

QT<30> Qt中使鼠标变为转圈忙状态

前言&#xff1a;当我们在写软件时&#xff0c;在等待阻塞耗时操作时可以将鼠标变为忙状态&#xff0c;并在一段时间后恢复状态&#xff0c;可以用到GxtWaitCursor&#xff1a;Qt下基于RAII的鼠标等待光标类。 一、效果演示 二、详细代码 在项目中添加C文件&#xff0c;命名为…