标签: android-testing

如何使用VisibleForTesting进行纯JUnit测试

我正在我的项目上运行纯JUnit4 java测试而不是我的纯java文件,但我找不到一种方法来清楚地使用@VisibleForTesting而不会手动公开.

例如:

@VisibleForTesting
public Address getAddress() {
  return mAddress;
}
Run Code Online (Sandbox Code Playgroud)

方法必须是public让它对测试"公开",但在这种情况下,注释没有意义吗?如果注释不会做什么,为什么不只是使用注释?

java junit android junit4 android-testing

20
推荐指数
4
解决办法
5万
查看次数

Android Espresso:如何在将一个活动跟踪到多个片段架构时测试特定片段

我的应用程序包含一个Activity用户Fragments.

我希望使用Espresso来测试用户界面Fragments.但是我遇到了一个问题.

如何测试一个Fragment未添加到ActivityonCreate.我见过的所有例子都Fragments涉及到Fragment被添加onCreate.那么我怎么能告诉Espresso去特定的Fragment并从那里开始呢?

谢谢

android android-fragments android-testing android-espresso

20
推荐指数
3
解决办法
1万
查看次数

在app中运行仪器测试并等待结果

我正在开发一种QA自动化解决方案,可以在Android上记录/回放QA测试.关键业务要求是在回放录制的测试时不依赖于连接的PC.为此,我试图在没有连接PC的情况下运行仪器测试.(具体来说,是Appium UiAutomator2测试).

我目前的方法是尝试从我的应用程序以编程方式运行测试.如果我通常从连接的PC运行测试,我会使用该命令adb shell am instrument -w.我尝试从我的应用程序访问ADB Shell并运行am instrument -w,但这会产生错误,我错过了INTERACT_ACROSS_USERS_FULL权限.

为了解决这个问题,我尝试使用startInstrumentation运行测试.这成功地开始了测试.但是,测试立即崩溃.经过进一步调查,我将崩溃追踪到NPE:测试试图检索InstrumentationRegistry.getInstrumentation.getUiAutomation(0),但是返回null.

如何以编程方式运行测试并授予其访问所需的UiAutomation实例的权限?

这就是我开始测试的方式:

public void runTest() {
    final String pm = getPackageName().replaceFirst(".test$", "");
    final InstrumentationInfo info = getInstrumentationInfo(pm);
    if (info != null) {

        final ComponentName cn = new ComponentName(info.packageName,
                info.name);

        Bundle arguments = new Bundle();
        arguments.putString("class", "io.testim.appiumwrapper.test.AppiumUiAutomator2Server");
        //cn = {io.extension.test/android.support.test.runner.AndroidJUnitRunner}
        startInstrumentation(cn, null, arguments);

    } 
}
Run Code Online (Sandbox Code Playgroud)

android android-testing appium android-instrumentation appium-android

20
推荐指数
1
解决办法
788
查看次数

找到 2 个文件,路径为“META-INF/LGPL2.11”

有人知道如何调试这个吗?我无法弄清楚哪些库产生了问题。

旁注,它只发生在我尝试运行 Android 测试时,所以我最好的猜测是它与某些测​​试库有关。


    testImplementation "androidx.room:room-testing:$version_room"
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
    androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.4.0'
    // Compose Tests
    androidTestImplementation "androidx.compose.ui:ui-test-junit4:$version_compose"
    debugImplementation "androidx.compose.ui:ui-test-manifest:$version_compose"
    // Hilt test
    androidTestImplementation "com.google.dagger:hilt-android-testing:$version_hilt"
    kaptAndroidTest "com.google.dagger:hilt-android-compiler:$version_hilt"
    debugImplementation 'androidx.fragment:fragment-testing:1.3.6'
Run Code Online (Sandbox Code Playgroud)
Execution failed for task ':app:mergeDebugAndroidTestJavaResource'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.MergeJavaResWorkAction
   > 2 files found with path 'META-INF/LGPL2.1' from inputs:
      - /home/lbenevento/.gradle/caches/transforms-3/1e2dfa6057fe4e701d175f47b1099efa/transformed/jetified-jna-platform-5.5.0.jar
      - /home/lbenevento/.gradle/caches/transforms-3/405542266c1c406c39ff1a20cb26a332/transformed/jetified-jna-5.5.0.jar
     Adding a packagingOptions block may help, please refer to
     https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.PackagingOptions.html
     for more information

* Try:
Run with --info or --debug option to get more log …
Run Code Online (Sandbox Code Playgroud)

android gradle android-testing android-jetifier

20
推荐指数
3
解决办法
2万
查看次数

测试运行失败:由于'java.lang.ClassNotFoundException'导致仪表运行失败

这是我第一次设置Android测试项目来测试Android项目.

我已经创建了一个非常基本的测试用例,我正试图运行,但是我没有运行.我得到了Test run failed: Instrumentation run failed due to 'java.lang.ClassNotFoundException'.

我会更麻烦这一点,但是我没有得到任何更多的信息,例如它试图找到哪个类,等等.关于如何从错误中获取更多信息的任何想法?我应该看的任何常见区域,或者我可能需要配置的任何东西?

以下是控制台的信息:

[2013-04-16 13:21:49 - XyzProgramTest] Android Launch!
[2013-04-16 13:21:49 - XyzProgramTest] adb is running normally.
[2013-04-16 13:21:49 - XyzProgramTest] Performing android.test.InstrumentationTestRunner JUnit launch
[2013-04-16 13:21:49 - XyzProgramTest] Automatic Target Mode: launching new emulator with compatible AVD 'GalaxyNexusAPI_17'
[2013-04-16 13:21:49 - XyzProgramTest] Launching a new emulator with Virtual Device 'GalaxyNexusAPI_17'
[2013-04-16 13:21:53 - Emulator] extension WGL_ARB_make_current_read was not found
[2013-04-16 13:21:53 - Emulator] extension WGL_EXT_swap_control was not found …
Run Code Online (Sandbox Code Playgroud)

eclipse android android-testing

19
推荐指数
5
解决办法
4万
查看次数

为什么我不应该使用消息总线而不是加载器和服务?

在典型的Android项目中,我们需要以干净的方式将数据从某个地方(REST,SQL,缓存等)提取到UI中,我们通常使用Loader,Service或(可能是yuk)AsyncTask,但我发现所有这些方法由于以下几个原因不满意:

  • 它们很难看,尤其是具有令人震惊的API结构的Loaders
  • 它很容易被包裹在线程中,并踩在UI线程上
  • 我们的表示层代码被Android代码和样板文件污染了.我们经常将Android对象(例如Cursors)传递到UI层,这使得一个干净的架构几乎无法实现.这迫使我们将业务领域特定代码(理想情况下是普通的Java对象)与Android平台代码混合在一起 - 对于未来开发的可读性,维护,测试或灵活性来说并不是很好.在实践中,我们经常会遇到庞大,混乱的Activity/Fragment类.

我被这些文章中概述的想法所吸引:http : //fernandocejas.com/2014/09/03/architecting-android-the-clean-way/ http://antonioleiva.com/mvp-android/ http://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html

成功开始使用MVP将活动/碎片/视图分解为更小/更清洁的部分,我现在认为上述问题的解决方案可能是依赖于消息总线(Otto,EventBus等)而不是服务或加载器或任何与域数据交互的内容.

所以在实践中这意味着不是使用(例如)CursorLoader从数据库加载Cursor,而是使用消息总线发送消息来请求数据,数据被加载到后台线程以响应该消息,然后通过UI线程上的消息到达时处理响应数据.对我来说至关重要的是,我希望将数据结构从业务领域推出,而不是Android域,所以我更喜欢业务对象数组,而不是Cursor.

这是工程设计,总是需要权衡,虽然这似乎提供了更清晰的关注点分离,但是装载机/服务模板的减少,缺点是什么?

  • 理解代码可能更难(特别是对于新开发人员而言)
  • 有必要确保在正确的线程上发送和接收消息(Otto似乎在这里可能有限制)
  • 有必要避免将一切事物作为一种信息实施的诱惑,这最终会适得其反
  • 传递业务对象集合可能不如使用像Cursors这样的对象.虽然在许多情况下它在实践中是一个问题吗?
  • 我不知道Otto/EventBus是否只是为了传递非常小的消息,或者是否适合传递更大的对象(例如业务对象数组).

我的问题是,是否有任何基本原因不采用这种基于消息的Android应用程序方法?

android android-service android-cursor android-testing android-cursorloader

19
推荐指数
1
解决办法
1782
查看次数

Gradle:如何为课程进行仪器测试

我在Android Studio中运行检测测试,运行配置定义如下(不介意警告): 在此输入图像描述

所以这是针对特定类调用测试服.我怎么能用命令行实现这一点,我想用./gradlew命令?

testing android gradle android-testing android-gradle-plugin

19
推荐指数
1
解决办法
8477
查看次数

Android - Independent Fragment UI测试工具

我一直在寻找一种方法来分别测试我的碎片的UI(即独立于其他碎片和活动),但我找不到办法.

特别是,假设我有片段A,片段B和片段C.进入片段C的唯一方法(应用方式)是首先通过片段A和片段B. 我正在寻找一种直接测试Fragment C的方法(可能通过模拟它的依赖关系,如果存在的话),而不必通过Fragment A和B.

到目前为止我调查的工具:

  • monkey:仅用于通过命令行生成伪随机事件.不是我想要的.

  • monkeyrunner:它可以运行Python程序将事件流发送到我的Android应用程序,但它不能直接使用这些脚本定位特定的Fragment.

  • Espresso:白盒测试工具.这接近我想要的,但它仍然需要在到达片段C之前通过片段A和B(即,您需要启动您的应用程序,然后测试将从那里运行).

  • UI Automator:黑盒测试工具.这也很接近,但同样,它需要在测试我想要的之前通过先前的片段(片段C).

有没有办法直接测试Fragmen的UI

android android-testing android-espresso android-uiautomator

19
推荐指数
1
解决办法
7124
查看次数

registerIdlingResources弃用替换不起作用

我正在尝试使用根据android文档的方法替换我的Espresso registerIdlingResourcesunregisterIdlingResources弃用方法IdlingRegistry.

我的一些测试在更新之前工作,现在不再有效了......这些测试一起工作,但不能一起工作.

我注意到旧版本(Espresso类)有一点不同,这一行在IdlingRegistry课堂上不存在:

baseRegistry.sync(IdlingRegistry.getInstance().getResources(), IdlingRegistry.getInstance().getLoopers());
Run Code Online (Sandbox Code Playgroud)

我认为这个sync方法对我的自定义IdlingResource非常重要...

如何在没有这条线的情况下同步我的活套?

谢谢你的帮助.

编辑:我使用EspressoCore 3.0.1与runner/rules 1.0.1

Edit2:已指定弃用的文档链接:此处此处.

android android-testing android-espresso

19
推荐指数
1
解决办法
728
查看次数

如何从Android Oreo中禁用espresso测试的新自动填充功能

在Android设备上运行测试sdk 26会导致它们失败,因为新的自动填充功能会在espresso尝试点击它们时隐藏字段.

我在firebase测试实验室运行我的测试,所以我不能在我的测试设备上手动禁用它们.

一些图片:

1.单击用户名字段前,密码可见.

在此输入图像描述

2.单击用户名字段后,此自动填充对话框将隐藏密码字段:

在此输入图像描述

3.登录后显示另一个"填充"对话框:

在此输入图像描述

Espresso无法点击现在的密码字段,因为自动填充对话框隐藏了我的字段和fail.

AutofillManager#disableAutofillServices()仅使用禁用#2.对话但#3.还在那里.

如何在测试设备上禁用自动填充?

testing android android-testing android-espresso android-autofill-manager

19
推荐指数
3
解决办法
4649
查看次数