标签: android-testing

如何在不影响生产数据库的情况下测试使用ContentProvider的Activity?

问题

我有两个我要测试的Android类:

我目前有两个测试类:

  • CommentContentProviderTest,扩展ProviderTestCase2<CommentContentProvider>和使用MockContentResolver.这很好用.
  • CommentActivityTest,延伸ActivityInstrumentationTestCase2<CommentActivity>.除了CommentActivity访问的部分外,这种方法很好CommentContentProvider.

问题是,当CommentActivity访问时CommentContentProvider,它通过标准这样做ContentResolver:

ContentResolver resolver = getContentResolver();
Cursor cursor = resolver().query(...);
Run Code Online (Sandbox Code Playgroud)

因此,当CommentActivityTest运行时,它会启动CommentActivity,访问(读取和写入)生产数据库,如上面两行所示.

我的问题是如何在生产中CommentActivity使用标准ContentResolver,但MockContentResolver在测试期间.

相关问题

可能的解决方案

如果我可以通过启动的Intent注入ContentResolver(可能是a MockContentResolverRenamingDelegatingContext),那将是很好的,但我不能这样做,因为s不是.CommentActivityContextParcelable …

android dependency-injection abstract-factory android-contentresolver android-testing

9
推荐指数
1
解决办法
1208
查看次数

使用Espresso进行相机操作UI测试

我需要使用espresso测试项目自动化我的UI测试以进行以下操作.

操作:

单击打开手机摄像头的按钮.捕获图像,并将图像保存在SD卡存储中.完成后还要在屏幕上更新小图像视图.

应用程序工作正常但是对于所有其他操作和类似的上述操作类型,一次又一次地手动测试它变得非常耗时.

android integration-testing unit-testing android-testing android-espresso

9
推荐指数
2
解决办法
7538
查看次数

ConnectedAndroidTest执行的任务列表是什么?

我想更多地了解ConnectedAndroidTest Gradle任务.我看到它用于安装应用程序和测试apks并运行测试.

但它的个别步骤是什么?(如果有任务,则为gradle任务)

"gradle build"似乎生成了Application apk.什么任务生成测试apk?它是如何(ConnectedAndroidTest)安装应用程序和测试apk?它是如何开始测试的?

非常感谢.

android android-testing

9
推荐指数
1
解决办法
8255
查看次数

如何在浓缩咖啡中获得应用程序?

我正在使用espresso将测试添加到我的Android应用程序中.

在我看来TestActivity,我有一些只有在用户签名时才能看到的视图.该userIsSignedIn标志存储在MyApp其子类中android.app.Application.有没有办法可以访问MyApp测试用例中的实例?

如果没有,有什么方法可以做到这一点?

谢谢

android android-testing android-espresso

9
推荐指数
1
解决办法
3927
查看次数

为androidTest定义buildConfigField

我定义特定字段中BuildConfig用于获取URL运行时.因此,对于每种构建类型,我使用不同的字符串:

    prod {
        buildConfigField "String", "BASE_URL", "\"abc.com\""
    }

    debug {
        buildConfigField "String", "BASE_URL", "\"efg.com\""
    }
Run Code Online (Sandbox Code Playgroud)

在运行android测试时是否可以定义不同的URL?我试过把这个设置放在下面sourceSets->androidTest,但它不被接受.

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

9
推荐指数
1
解决办法
659
查看次数

由ActivityTestRule实例化引起的java.lang.IncompatibleClassChangeError

我在我的Android项目中添加了espresso测试,并在创建ActivityTestRule的行上获得了IncompatibleClassChangeError.我如何找出导致它的原因?

以下是导致错误的代码行:(HomePageScreenTest.java:27)

@Rule
public ActivityTestRule<HomePageActivity> homePageActivityTestRule = new ActivityTestRule<>(HomePageActivity.class);
Run Code Online (Sandbox Code Playgroud)

这是错误:

java.lang.IncompatibleClassChangeError: com.example.rocklee.mehmvp.HomePage.HomePageActivity
at dalvik.system.DexFile.defineClassNative(Native Method)
at dalvik.system.DexFile.defineClass(DexFile.java:226)
at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:219)
at dalvik.system.DexPathList.findClass(DexPathList.java:321)
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:54)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
at com.example.rocklee.mehmvp.HomePage.HomePageScreenTest.<init>(HomePageScreenTest.java:27)
at java.lang.reflect.Constructor.newInstance(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:217)
at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:266)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:54) …
Run Code Online (Sandbox Code Playgroud)

android android-testing android-espresso

9
推荐指数
1
解决办法
2672
查看次数

我必须重新启动IDE才能运行测试

在IDE中直接运行单个测试时Android Studio 2.2的奇怪错误 - 我要么"没有找到测试",要么运行我之前编译的测试.

例:

@Test
fun testyTest() {
}
Run Code Online (Sandbox Code Playgroud)

我将创建此测试,并获得"未找到测试".所以我重新启动,找到了测试!显然,上述测试通过,因为它是空的.接下来,我希望我的测试失败.所以我手动抛出异常并在下面添加一行代码.

@Test
fun testyTest() {
    throw RuntimeException()
}
Run Code Online (Sandbox Code Playgroud)

现在我重新编译,这个测试也通过,因为IntelliJ由于某种原因缓存了之前的测试并重新运行.要使此测试正确失败 - 我必须重新启动IDE.

有谁知道发生了什么?注意 - 我在这个项目中使用Kotlin非常重要.

编辑2:这是一个src/test/javaAndroid 项目中的JVM测试(非android ).

编辑:这是一个完整的测试课程

package com.example.zak

import org.junit.Before
import org.junit.Test


class ExampleTest {

    @Before
    fun setUp() {

    }

    @Test
    fun testyTest() {
        //throw RuntimeException()
    }
}
Run Code Online (Sandbox Code Playgroud)

kotlin android-testing android-studio

9
推荐指数
1
解决办法
2705
查看次数

使用命令提示符使用参数运行Instrumented Test

我有一个InstrumentedTest

@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Test
    public void useAppContext(String groupName) {
Context appContext = InstrumentationRegistry.getTargetContext();
        UiDevice device=UiDevice.getInstance(getInstrumentation());
...
...
  }
}
Run Code Online (Sandbox Code Playgroud)

我想用adb shell命令执行它.但我要传递groupName方法的参数值useAppContext(String groupName)

我正在使用命令

adb shell am instrument -w -r   -e debug false -e class 'com.<package_name>.ExampleInstrumentedTest' com.<package_name>.test/android.support.test.runner.AndroidJUnitRunner  
Run Code Online (Sandbox Code Playgroud)

但是如何将方法参数作为参数传递给在命令提示符下运行的命令?

android android-testing android-instrumentation

9
推荐指数
1
解决办法
1079
查看次数

launchFragmentInContainer无法解析Android中的活动

在编写使用的简单测试时launchFragmentInContainer,我收到以下错误消息:

java.lang.RuntimeException: Unable to resolve activity for: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.myapp.appname.debug/androidx.fragment.app.testing.FragmentScenario$EmptyFragmentActivity (has extras) }
Run Code Online (Sandbox Code Playgroud)

基本测试类是:

class OneFragmentTest {

    @Test
    fun testOneFragmentState_checkTitleText() {
        val args = Bundle().apply {
            putString("dummyKey", "dummyValue")
        }
        launchFragmentInContainer<OneFragment>(args)

        onView(withId(R.id.tv_title)).check(matches(withText("title here")))
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试更新AndroidManifest.xml以下内容:

java.lang.RuntimeException: Unable to resolve activity for: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.myapp.appname.debug/androidx.fragment.app.testing.FragmentScenario$EmptyFragmentActivity (has extras) }
Run Code Online (Sandbox Code Playgroud)

但标签似乎instrumentation有效,但值用红色书写,因此我认为targetPackageand 出了点问题name

我如何摆脱这个错误,并在OneFragment上运行一个简单的测试launchFragmentInContainer

android android-fragments android-testing androidx

9
推荐指数
2
解决办法
931
查看次数

自定义构建类型不适用于androidTest构建

嗨,我正在尝试根据以下定义的风格和自定义构建类型构建androidTest APK:

 productFlavors {
    FlavourOne {
        applicationIdSuffix ".live"
        buildConfigField 'String', 'SERVER_BASE_URL', '"http://live.com"'

    }
    FlavourTwo {
        applicationIdSuffix ".demo"
        buildConfigField 'String', 'SERVER_BASE_URL', '"http://demo.com"'
    }
Run Code Online (Sandbox Code Playgroud)

}

buildTypes {
        debug {
            minifyEnabled false
            // shrink code (remove unused classes and methods) - note that it falls back to experimental shrinker for Instant Run
            shrinkResources false // don't strip unused res files
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro', 'proguard-rules-debug.pro'
            testProguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules-test.pro'
        }
        release {
            minifyEnabled true // shrink code (remove unused classes and methods)
            shrinkResources false // …
Run Code Online (Sandbox Code Playgroud)

android android-testing android-gradle-plugin

9
推荐指数
2
解决办法
120
查看次数