标签: android-testing

Android:“androidTest”的单独资源

我想在运行测试时使用单独的资源集,因此我在中设置了一个名为“configs.xml”的文件

\n\n
\n

'src/androidTest/res/values'

\n
\n\n

并将其添加到 gradle

\n\n
\n

sourceSets {\n androidTest {\n resources.srcDirs = ['src/androidTest/res'] }\n } }

\n
\n\n

但是当我尝试使用以下行获取资源时

\n\n
\n

String s1 = getInstrumentation().getContext().getResources().getString(R.string.test_config);

\n
\n\n

我收到以下错误

\n\n
\n

01-08 18:06:13.814 16761-16774/com.example.hellodroid I/TestRunner\xef\xb9\x95 android.content.res.Resources$NotFoundException:字符串资源 ID #0x7f070008\n 位于 android.content.res。 Resources.getText(Resources.java:1382)\n 位于 android.content.res.Resources.getString(Resources.java:1476)

\n
\n\n

有人可以指出我哪里错了吗?

\n

android android-resources android-testing

5
推荐指数
1
解决办法
1505
查看次数

android:targetPackage 无法解析符号

这可能看起来微不足道,但我不明白为什么会出现此错误。

我下载了示例应用程序 ActivityInstrumentation(来自 Android Studio File -> import Sample),在测试项目清单中,我得到了一个未解析的符号

android:targetPackage="com.example.android.activityinstrumentation"。

之后,我为我的应用程序创建了一个清单,但属性上仍然有一个未解析的符号。

我的应用程序项目目录和测试项目目录是:

应用程序/src/main/java/com/example/appname

应用程序/src/androidTest/java/com/example/appname

请帮我解决这个问题。我不知道我还能做什么:使用示例应用程序创建一个完整的测试项目是我最后的希望。

android android-testing android-studio

5
推荐指数
1
解决办法
3931
查看次数

运行 Android 测试时没有 JSBridge 错误

运行 androidTests 时,我间歇性地收到一条消息“测试运行已启动完成空测试套件。”,下面给出了发生这种情况时的堆栈跟踪。

\n\n

当我的设备使用 USB 连接到另一个设备时,我使用 ADB 通过 Wi-Fi 运行测试。当我注意到这个异常时,我确保设备仍然处于连接状态。需要明确的是,我的应用程序是本机应用程序,没有网络视图。

\n\n
I/MonitoringInstrumentation: No JSBridge.\n        java.lang.ClassNotFoundException: android.support.test.espresso.web.bridge.JavaScriptBridge\n        at java.lang.Class.classForName(Native Method)\n        at java.lang.Class.forName(Class.java:251)\n        at java.lang.Class.forName(Class.java:216)\n        at android.support.test.runner.MonitoringInstrumentation.tryLoadingJsBridge(MonitoringInstrumentation.java:621)\n        at android.support.test.runner.MonitoringInstrumentation.access$100(MonitoringInstrumentation.java:90)\n        at android.support.test.runner.MonitoringInstrumentation$4.run(MonitoringInstrumentation.java:232)\n        at android.app.Instrumentation$SyncRunnable.run(Instrumentation.java:1747)\n        at android.os.Handler.handleCallback(Handler.java:733)\n        at android.os.Handler.dispatchMessage(Handler.java:95)\n        at android.os.Looper.loop(Looper.java:146)\n        at android.app.ActivityThread.main(ActivityThread.java:5602)\n        at java.lang.reflect.Method.invokeNative(Native Method)\n        at java.lang.reflect.Method.invoke(Method.java:515)\n        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)\n        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)\n        at dalvik.system.NativeStart.main(Native Method)\n     Caused by: java.lang.NoClassDefFoundError: android/support/test/espresso/web/bridge/JavaScriptBridge\n        at java.lang.Class.classForName(Native Method)\xc2\xa0\n        at java.lang.Class.forName(Class.java:251)\xc2\xa0\n        at java.lang.Class.forName(Class.java:216)\xc2\xa0\n        at android.support.test.runner.MonitoringInstrumentation.tryLoadingJsBridge(MonitoringInstrumentation.java:621)\xc2\xa0\n        at android.support.test.runner.MonitoringInstrumentation.access$100(MonitoringInstrumentation.java:90)\xc2\xa0\n        at android.support.test.runner.MonitoringInstrumentation$4.run(MonitoringInstrumentation.java:232)\xc2\xa0\n        at android.app.Instrumentation$SyncRunnable.run(Instrumentation.java:1747)\xc2\xa0\n        at android.os.Handler.handleCallback(Handler.java:733)\xc2\xa0\n        at android.os.Handler.dispatchMessage(Handler.java:95)\xc2\xa0\n        at android.os.Looper.loop(Looper.java:146)\xc2\xa0\n        at android.app.ActivityThread.main(ActivityThread.java:5602)\xc2\xa0\n        at …
Run Code Online (Sandbox Code Playgroud)

android-testing

5
推荐指数
1
解决办法
1946
查看次数

测试代码未编译并被视为非测试

我使用自定义测试运行器进行了一些 Android 仪器测试,这些测试似乎都工作正常,直到我升级到 Android Studio 2.1、升级了一些库版本并随着时间的推移做了一些其他事情之后的某个时候。现在,我的测试不再运行Unable to find instrumentation info for: ComponentInfo{}StackOverflow 上已经被问过一百万次的可怕问题了。

经过进一步调查,Android Studio 似乎根本不编译我的测试代码,这意味着它的代码从未包含在内,因此它无法找到测试运行程序的 ComponentInfo。我通过在测试代码中添加编译错误来验证这一点,当我尝试运行测试时,这不会导致任何问题。

此外,测试代码在语法突出显示中似乎被视为非测试代码?例如,测试运行程序导入android.support.test.runner.AndroidJUnitRunner,但runner以红色突出显示,就好像该库丢失一样(但它在 gradle 文件中为androidTestCompile)。如果我将其更改为compile,语法荧光笔会很高兴。但是,测试代码在项目视图中以黄色显示,就像测试代码一样。

我不确定是什么决定了 Android Studio 为测试编译的内容。设置很简单。我的文件层次结构是

app
+--src
+  +--main
+  |  +--java
+  |     +--com/package/files
+  |
+  +--androidTest
+     +--java
+        +--com/package/files
Run Code Online (Sandbox Code Playgroud)

换句话说,有 app/src/main/java/com/... 和 app/src/androidTest/java/com... 主应用程序和测试都使用相同的包。

build.gradle(相关部分):

apply plugin: 'com.android.application'

android {
    compileSdkVersion 'Google Inc.:Google APIs:23'
    buildToolsVersion '24.0.0 rc3'
    defaultConfig {
        multiDexEnabled = true
        applicationId 'com.package'
        minSdkVersion 10
        targetSdkVersion …
Run Code Online (Sandbox Code Playgroud)

android android-testing android-studio

5
推荐指数
1
解决办法
643
查看次数

Mockwebserver 的 url 不能更改吗?

我正在使用mockwebserver进行android测试。我可以通过执行以下操作来模拟使用改造的网络服务

 NetworkServiceHelper.init(String.valueOf(server.url("/")));
Run Code Online (Sandbox Code Playgroud)

但是,我无法模拟其他 SDK(例如具有基本 url https://api.layer.com/apps/的 Atlas-Layer)发出的 Web 请求。

我执行了以下操作,但请求计数仍然为 0。

MockWebServer mockWebServer = new MockWebServer();
mockWebServer.url("https://api.layer.com/apps");
mockWebServer.enqueue(new MockResponse().setBody(getStringFromFile(getInstrumentation().getContext(), "temp.json")));
getConversation("demo", "asdf"); // makes web service all using Layer SDK
mockWebServer.getRequestCount(); // Returns 0 instead of 1
Run Code Online (Sandbox Code Playgroud)

mocking android-testing mockwebserver

5
推荐指数
0
解决办法
1312
查看次数

Espresso 无法单击 ImageView

我的浓缩咖啡仪器测试无法单击 ImageView:

在视图“id: com.example.test:id/btnNext”上执行“单击”时出错。

原因:android.support.test.espresso.PerformException:在视图“未知”上执行“单击(3 次尝试后)”时出错。

引起原因:android.support.test.espresso.InjectEventSecurityException:java.lang.SecurityException:注入到另一个应用程序需要 INJECT_EVENTS 权限

但奇怪的是,仅仅三行就可以单击另一个看起来与我非常相似的 ImageView。像人类一样使用该应用程序也是可行的

这是我的最小的非工作示例,您看到错误了吗?

@RunWith(AndroidJUnit4.class)
@LargeTest
public class TestTest {

    @Rule
    public ActivityTestRule<TestActivity> _activityRule = new ActivityTestRule<TestActivity>(
            TestActivity.class);
    @Test
    public void testClicking() {
        onView(withId(R.id.btnPrevious)).perform(click());
        onView(withId(R.id.btnNext)).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)));
        onView(withId(R.id.btnNext)).check(matches(isClickable()));
        onView(withId(R.id.btnNext)).perform(click()); // This line throws an exception
    }
}
Run Code Online (Sandbox Code Playgroud)

要测试的活动:

public class TestActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test_activity);
    }
}
Run Code Online (Sandbox Code Playgroud)

和布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/mainContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FF000000">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_alignParentBottom="true"
        android:id="@+id/lytFooter">

        <ImageView …
Run Code Online (Sandbox Code Playgroud)

android android-layout android-testing android-espresso

5
推荐指数
0
解决办法
1207
查看次数

java.lang.NoSuchMethodError:没有接口方法 onTransitionToIdle()V

请告诉我,我是 Android 测试新手,我一直在尝试修复初始 NavigationView 测试,但收到错误。我只是想打开抽屉并单击菜单以进入新活动。

java.lang.NoSuchMethodError: No interface method onTransitionToIdle()V in class Landroid/support/test/espresso/IdlingResource$ResourceCallback; or its super classes (declaration of 'android.support.test.espresso.IdlingResource$ResourceCallback' appears in /data/app/com.bellman.inecparrot.mock-2/base.apk)
    at android.support.test.espresso.contrib.DrawerActions$IdlingDrawerListener.onDrawerStateChanged(DrawerActions.java:266)
    at android.support.v4.widget.DrawerLayout.updateDrawerState(DrawerLayout.java:834)
    at android.support.v4.widget.DrawerLayout$ViewDragCallback.onViewDragStateChanged(DrawerLayout.java:2089)
    at android.support.v4.widget.ViewDragHelper.setDragState(ViewDragHelper.java:881)
    at android.support.v4.widget.ViewDragHelper$2.run(ViewDragHelper.java:338)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.support.test.espresso.base.UiControllerImpl.loopUntil(UiControllerImpl.java:470)
    at android.support.test.espresso.base.UiControllerImpl.loopMainThreadUntilIdle(UiControllerImpl.java:365)
    at android.support.test.espresso.contrib.DrawerActions$DrawerAction.perform(DrawerActions.java:79)
    at android.support.test.espresso.ViewInteraction$1.run(ViewInteraction.java:144)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:211)
    at android.app.ActivityThread.main(ActivityThread.java:5389)
    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:1020)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)
Run Code Online (Sandbox Code Playgroud)

以下是我正在运行的测试:

@RunWith(AndroidJUnit4.class)
@LargeTest
public class AppNavigationTests {

    /**
     * {@link ActivityTestRule} is a JUint …
Run Code Online (Sandbox Code Playgroud)

java android unit-testing android-testing

5
推荐指数
1
解决办法
5639
查看次数

三星远程测试实验室的安全性

我正在开发一个 Android 应用程序,并正在使用服务对其进行测试Samsung's "REMOTE TEST LAB"。该工具非常适合在不同的三星设备上测试应用程序。

我的应用程序尚未发布,我担心使用"REMOTE TEST LAB". 我担心如果我忘记从服务设备上卸载该应用程序,该服务的其他用户是否可以访问该应用程序"REMOTE TEST LAB"

如果有人可以提供额外的想法/建议,那将会很有帮助。

谢谢。

testing android samsung-mobile android-testing

5
推荐指数
0
解决办法
356
查看次数

如何将 Espresso UI 测试编译成版本?

我目前正在尝试将 Espresso 测试添加到发布的APK 中。在我们的例子中,我们必须测试实际发布的内容,因此 UI 测试必须包含在发布中。

所以我的首要问题是:如何最好地实现这一目标?到目前为止,互联网上的研究没有给我任何结果。

我已经尝试androidDebugTest将构建脚本更改为compile

compile 'com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
}
Run Code Online (Sandbox Code Playgroud)

还有这里:

compile 'com.android.support.test.espresso:espresso-contrib:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
    exclude group: 'com.android.support', module: 'support-v4'
    exclude group: 'com.android.support', module: 'design'
    exclude group: 'com.android.support', module: 'recyclerview-v7'
}
Run Code Online (Sandbox Code Playgroud)

但打电话之后

./gradlew assembleRelease --info --debug
Run Code Online (Sandbox Code Playgroud)

我收到此错误消息:

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:transformClassesWithJarMergingForRelease'.
> com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: javax/annotation/Generated.class
...
BUILD FAILED …
Run Code Online (Sandbox Code Playgroud)

android android-testing android-gradle-plugin android-espresso

5
推荐指数
1
解决办法
3723
查看次数

Mockito正在验证错误的方法

我在我的应用程序中使用Nucleus库遵循 MVP 架构,并尝试模拟我的 Fragment 的 Presenter。模拟及其覆盖的调用工作得很好,但我的verify调用很奇怪。首先,这是我的测试:

private User mUser;
private ProfilePresenter mPresenterMock;

@Override
public void setUp() throws Exception {
    super.setUp();
    mUser = TestUtils.generateTestUser();
    mPresenterMock = mock(ProfilePresenter.class);

    ProfileFragment fragment = ProfileFragment.newInstance();
    fragment.setPresenterFactory(() -> mPresenterMock);
    setFragment(fragment);
}

@Test
public void testInitialValues() {
    doAnswer(invocation -> {
        getFragment().onUserLoaded(mUser);
        return null;
    }).when(mPresenterMock).loadUser(anyBoolean());

    startFragment();
    verify(mPresenterMock).loadUser(eq(false));
    onView(withId(R.id.empty)).check(matches(not(withEffectiveVisibility(VISIBLE))));
    assertEquals(mUser.getFullName(), getFragment().mToolbar.getTitle());
    assertEquals(1, getFragment().mVideosRecyclerView.getChildCount());
}
Run Code Online (Sandbox Code Playgroud)

我收到一条测试失败消息verify

Argument(s) are different! Wanted:
profilePresenter.start(false);
Actual invocation has different arguments:
profilePresenter.start(1);
Run Code Online (Sandbox Code Playgroud)

它似乎正在做的是验证模拟类中的方法,如果它是模拟对象,则不应出现这种情况。这是loadUser我的 Presenter 中调用的方法start …

android mockito android-testing android-espresso

5
推荐指数
0
解决办法
957
查看次数