标签: android-instrumentation

对于Lollipop及以上的仪器测试,"没有测试结果"

我的基于仪器(espresso)的测试不能在Lollipop +设备和模拟器上运行.它们可以在任何其他平台上正常运行 我和这个帖子中的人有相同的症状 - https://groups.google.com/forum/?fromgroups#!topic/adt-dev/QW5SuzQizNk

  • 我的测试是在src/androidTest/java /
  • 我已经设置了testInstrumentationRunner'android.support.test.runner.AndroidJUnitRunner'
  • 测试类是@RunWith(AndroidJUnit4.class)
  • 个人测试用@Test注释

我可以执行./gradlew connectedCheck并且测试在使用KitKat的设备上运行良好,但是当我尝试在Lollipop的设备上以相同的方式运行相同的测试时,我得到...

15:02:15.784 [WARN] [org.gradle.api.Task] XT1095上的测试 - 5.1失败:由于'java.lang.NoClassDefFoundError'导致仪表运行失败

15:02:16.011 [WARN] [org.gradle.api.Task] com.android.builder.testing.ConnectedDevice>未找到测试.[XT1095 - 5.1] FAILED

15:02:16.011 [警告] [org.gradle.api.Task]未找到测试.这通常意味着您的测试类不是您的测试运行器期望的形式(例如,不从TestCase继承或缺少@Test注释).

android android-testing android-espresso android-instrumentation

12
推荐指数
1
解决办法
3081
查看次数

在多个模拟器上连接了Android测试

背景

我想在不同的模拟器上对Jenkins运行我的Android Instrumented测试.假设我有100个测试和4个模拟器,我想在每个上运行25个测试.

./gradlew connectedDebugAndroidTest在Jenkins Pipeline中为4个模拟器执行并行操作

stage('Instrumented Tests') {
    parallel(
            emu1: {
                 runInstrumentedTestOnEmu(...)
            },
            emu2: {
                 runInstrumentedTestOnEmu(...)
            }
            ...
    )
}
Run Code Online (Sandbox Code Playgroud)

connectedDebugAndroidTest 将生成其他命令以设置运行检测测试的环境.

...
:app:transformNativeLibsWithMergeJniLibsForDebugAndroidTest
:app:processDebugAndroidTestJavaRes NO-SOURCE
:app:transformResourcesWithMergeJavaResForDebugAndroidTest
:app:validateSigningDebugAndroidTest
:app:packageDebugAndroidTest
:app:assembleDebugAndroidTest
:app:connectedDebugAndroidTest
Run Code Online (Sandbox Code Playgroud)

当环境准备就绪时,:app:connectedDebugAndroidTest它会在仿真器上开始运行测试.

我不想为所有并行调用运行这些过程(在这种情况下,它将是其中的4个),因为显然我多次完成相同的工作.从理论上讲,最好的选择是parallel在所有内容准备好运行测试之前和之后执行设置,然后进入parallel步骤并在每个模拟器上开始测试.

是否可以在不执行任何操作的情况下执行所有预设置步骤connectedDebugAndroidTest

此外,如果我connectedDebugAndroidTest在4个仿真器上并行运行,则构建崩溃,因为intermediate当其他并行构建已删除该文件时,gradle会尝试从目录中读取文件,从而导致崩溃.

您可以使用上面提到的设置在github中查看此测试项目.

android jenkins android-instrumentation

12
推荐指数
1
解决办法
809
查看次数

如何将Android(instrumentation)测试文件放在项目目录之外?

我有一个Android项目(由Cordova生成),我想添加(检测)测试.它只有一个MainActivity.java应该测试.

通常这意味着添加一些依赖项build.gradle/src/androidTest/java/org/example/package/MainActivityTest.java使用MainActivityTest类和一些测试方法创建文件.(在Android Studio中,我甚至可以通过使用Run - >"Record Espresso Test"生成这些 - 这非常简单且有效).

不幸的是,我现在要求这些测试文件确实存在于项目目录之外.现有的Cordova项目应该只有很小的变化(因为它被重新生成并作为构建工件处理).在MainActivity.java将最好是在同一个根文件夹,Android项目中/android.

我怎样才能做到这一点?


build.gradle变化可以被添加到build-extras.gradle,真正的文件build.gradle已经包含了,所以这是照顾.

但我不知道如何放置MainActivityTest.java项目文件夹结构的外部,仍然能够在项目内运行它.

对于iOS,您可以使用绝对路径将外部文件链接到项目中.这样的东西在这里也是完美的.

我看了,sourceSets但我不知道如何将这个集成到Cordova Android项目中,该项目已经有了这个非默认值(我想?)sourceSets:

android {
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
            jniLibs.srcDirs = ['libs']
        }
    }
    ...
}     
Run Code Online (Sandbox Code Playgroud)

android cordova android-testing android-espresso android-instrumentation

12
推荐指数
1
解决办法
1686
查看次数

Android在测试包中测试新服务

我想在框架中测试一个类,该框架基于intent启动不同的服务.但是,我有问题,创建TestService内部的androidTest/连接时,Android的测试正在运行.getService方法返回null.

在此先感谢任何指导和帮助!

@RunWith(AndroidJUnit4.class)
public class WakefulIntentSenderTest {
    private static final String SOME_ACTION = "someAction";

    private static class TestService extends Service {
        private boolean mCalled;

        @Override
        public void onCreate() {
            super.onCreate();
        }

        @Override
        public IBinder onBind(final Intent intent) {
            return null;
        }

        @Override
        public int onStartCommand(final Intent intent, final int flags, final int startId) {
            mCalled = true;
            return 0;
        }

        public boolean wasCalled() {
            return mCalled;
        }

        public class TestServiceBinder extends Binder {

        public …
Run Code Online (Sandbox Code Playgroud)

java junit android android-testing android-instrumentation

12
推荐指数
1
解决办法
449
查看次数

如何在运行Espresso测试时禁用代码中的动画

有没有人设法在运行Espresso测试时通过代码禁用动画?我一直在尝试按照此网页上的说明(从此处链接):https:
//code.google.com/p/android-test-kit/wiki/DisablingAnimations

不幸的是它似乎没有工作,因为我一直看到这个权限错误:

04-27 15:48:28.694      303-342/system_process W/PackageManager? Not granting permission android.permission.SET_ANIMATION_SCALE to package com.cookbrite.dev (protectionLevel=50 flags=0x18be46)
Run Code Online (Sandbox Code Playgroud)

我真的希望避免重新配置我的设备/模拟器.我们经常在本地进行个别测试,如果我必须保持切换设置,它会让我烦恼.

我注意到其他一些开发人员抱怨说这不起作用,所以我可能并不孤单:https://groups.google.com/forum/#! msg/android-test-kit- discuss/
TCil7kMQRTM/QK1qCjzM6KQJ

android android-animation android-permissions android-espresso android-instrumentation

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

由于'java.lang.NullPointerException'导致Instrumentation运行失败

我试图通过扩展测试类来为我的应用程序中的活动编写单元测试用例ActivityUnitTestCase.我可以提前成功运行测试用例,但现在我总是在运行时遇到异常.虽然我对处理非常熟悉,但我NullPointerExceptions无法弄清楚造成这种情况的问题.我找不到任何类似的问题,所以我发布了这个问题.

堆栈跟踪显示我的代码中此行有一个空对象引用

activity = startActivity(mIntent, null, null);
Run Code Online (Sandbox Code Playgroud)

但该startActivity方法应该得到我正在测试的活动的实例.我不确定为什么它会返回null.

这是堆栈跟踪.

java.lang.NullPointerException: Attempt to write to field 'android.os.IBinder android.app.ActivityThread.mLastIntendedActivityToken' on a null object reference
at android.app.Activity.performCreate(Activity.java:6372)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
at android.support.test.runner.MonitoringInstrumentation.callActivityOnCreate(MonitoringInstrumentation.java:346)
at android.test.ActivityUnitTestCase.startActivity(ActivityUnitTestCase.java:158)
at com.abc.test.MainActivityTest.access$100(MainActivityTest.java:16)
at com.abc.test.MainActivityTest$1.run(MainActivityTest.java:34)
at android.app.Instrumentation$SyncRunnable.run(Instrumentation.java:1891)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6117)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

Test running failed: Instrumentation run failed due to 'java.lang.NullPointerException'
Run Code Online (Sandbox Code Playgroud)

这是Test类

public class MainActivityTest extends ActivityUnitTestCase<MainActivity>{

    private Intent mIntent;
    private MainActivity activity; …
Run Code Online (Sandbox Code Playgroud)

android nullpointerexception activityunittestcase android-instrumentation

11
推荐指数
1
解决办法
3212
查看次数

从InstrumentationTestCase创建通知

我想从单元测试中测试通知是否能够从资产中播放自定义声音.测试并不是为了验证任何东西,我把它写成一种快速的方式来演示一个功能而不会混淆主应用程序代码.

所以在测试项目中,我在里面添加了一个wav文件/res/raw.我将在通知构建器中使用此URL:

Uri path = Uri.parse("android.resource://<main app package name>/testsound.wav");
Run Code Online (Sandbox Code Playgroud)

该URL应该根据我在SO中阅读的问题工作.我们假设它有效.

现在因为我不想将测试wav文件包含在主项目的/res/raw文件夹中但是在测试项目中,我不得不进行单元测试扩展,InstrumentationTestCase以便我可以访问测试项目中的资源.

这是代码:

    NotificationCompat.Builder builder = new NotificationCompat.Builder(getInstrumentation().getContext());
    ...
    builder.setSound(path, AudioManager.STREAM_NOTIFICATION);
    ...
    NotificationManager notificationManager = (NotificationManager) getInstrumentation().getContext().getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(NOTIFICATION_ID, builder.build());
Run Code Online (Sandbox Code Playgroud)

notify调用抛出以下异常:

    java.lang.SecurityException: Calling uid 10198 gave package <main app package name> which is owned by uid 10199
    at android.os.Parcel.readException(Parcel.java:1540)
    at android.os.Parcel.readException(Parcel.java:1493)
    at android.app.INotificationManager$Stub$Proxy.enqueueNotificationWithTag(INotificationManager.java:611)
    at android.app.NotificationManager.notify(NotificationManager.java:187)
    at android.app.NotificationManager.notify(NotificationManager.java:140)
    ... 
    at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1873)
Run Code Online (Sandbox Code Playgroud)

我已将此异常跟踪到NotificationManagerService课程:

    void checkCallerIsSystemOrSameApp(String pkg) {
        int uid = Binder.getCallingUid();
        if (UserHandle.getAppId(uid) == …
Run Code Online (Sandbox Code Playgroud)

java notifications android unit-testing android-instrumentation

11
推荐指数
1
解决办法
396
查看次数

如何在attach()中更改活动标题

我想运行一个参数化的Instrumentation Test,它具有不同的语言环境,可以使用所有支持的语言运行相同的测试.

观察到的行为是,对于每个后续运行,活动都将具有第一次测试运行本地化标题.因此,无论我的手机使用哪种语言,标题都将针对第一个参数化测试运行进行正确本地化,并且对于每个后续版本仍然相同.

虽然覆盖区域设置本身适用于任何资源,它会工作只有一次活动标题,如果设置由AndroidManifest.xml.

活动似乎得到了他们的标题设置attach,无论调用附件似乎是缓存应用程序首次启动的区域设置中的标题.

final void attach(Context context, ActivityThread aThread,
        Instrumentation instr, IBinder token, int ident,
        Application application, Intent intent, ActivityInfo info,
   ---> CharSequence title, Activity parent, String id,
        NonConfigurationInstances lastNonConfigurationInstances,
        Configuration config, String referrer, IVoiceInteractor voiceInteractor) {
    attachBaseContext(context);
Run Code Online (Sandbox Code Playgroud)

由于资源总是被正确地本地化,因此解决方法是调用setTitle(R.string.title)或只是getActionBar().setTitle(R.string.setTitle),但我不想仅为了测试目的而更改活动.

问题:如何第一次测试运行更改活动的标题?如上所述,这似乎被缓存并且没有正确更新,并且杀死应用程序以重新启动它将无法进行检测测试.

测试设置

整个测试项目可以在GitHub上找到(Localization.java包含当前失败的单元测试和此处描述的问题)并且正在使用参数化单元测试UIAutomator.

我们的目标是在不了解应用程序本身(UIAutomator)的情况下拍摄一批截图,并且不需要为测试修改应用程序.

更改区域设置:

我在每次测试之前都成功地更改了语言环境,并通过执行以下操作正确显示了我的文本,同时我还有多个断言确保资源实际上是正确的语言环境.

public LocalizationTest(Locale locale) …
Run Code Online (Sandbox Code Playgroud)

android android-activity android-testing android-instrumentation android-uiautomator

11
推荐指数
1
解决办法
339
查看次数

如何使 android:usesCleartextTraffic="true" 仅用于仪器测试?

我使用RESTMock我的仪器测试,但只有当我设置工作usesCleartextTraffictrue在我的清单。不过,我只希望仪器测试也是如此。有没有办法做到这一点?

我尝试在androidTest文件夹中创建一个新的清单文件。测试运行,但它们像usesCleartextTraffic仍然一样失败false

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="my.package">

    <application android:usesCleartextTraffic="true" />

</manifest>
Run Code Online (Sandbox Code Playgroud)

我知道 RESTMock 从版本 0.3.2 开始支持 https,但我宁愿不必处理它。我实际上遵循了他们的指南,最终得到了 OkHttp3 的这个错误:

java.lang.AssertionError: java.security.NoSuchAlgorithmException: The BC provider no longer provides an implementation for KeyPairGenerator.RSA. Please see https://android-developers.googleblog.com/2018/03/cryptography-changes-in-android-p.html for more details.

有任何想法吗?


编辑:

我按照这个答案并将我创建的这个清单移动到debug源文件夹,然后它就可以工作了。现在该android:usesCleartextTraffic="true"选项仅适用于我的调试版本,由仪器测试使用,因此它可以工作,但它仍然不是正确的解决方案。

android android-espresso mockwebserver android-instrumentation

11
推荐指数
1
解决办法
7377
查看次数

android studio 1.2中的代码覆盖率,用于仪表化测试

我一直在尝试使用Android Studio 1.2中的新代码覆盖功能.似乎没有该功能的文档,但到目前为止我想出来添加

    testCoverageEnabled true
Run Code Online (Sandbox Code Playgroud)

到我的Gradle文件的调试风格.

我仍然只能为JUnit测试用例创建代码覆盖率报告,而不是为已测试的Android测试用例.

有没有办法为检测的android测试用例生成代码覆盖?

junit android gradle android-studio android-instrumentation

10
推荐指数
1
解决办法
2329
查看次数