如何使用Espresso点击Android Gallery

时间:2014-10-20 15:43:59

标签: android android-espresso

我们目前正在使用Espresso进行测试的Android应用程序。我们要测试的功能之一是从本地图库中选择图片/图片。我们可以一直调出图库视图,但无法在结果窗口中选择最近,下载,图库。关于我们如何得到的摘要如下所示。

public void testShouldBeAbleToSelectPhotoFromGallery() {

    getActivity();

    // given
    onView(withId(launch_gallery_button)).perform(click());
    onView(withText("Gallery")).perform(click());  // this is a button in our app
    // then we get stuck :(
}

谢谢!

3 个答案:

答案 0 :(得分:4)

使用Robotium或Espresso无法做到这一点,因为它们仅适用于受测试应用的活动。

要编写适用于不同应用和Android内置应用的集成测试,您可以使用Google提供的UiAutomator framework

基本上你会分析uiautomatorview中的gallery应用程序来学习如何选择测试用例所需的ui元素,然后对它们采取行动,与Espresso不同。

答案 1 :(得分:2)

如果要在应用中测试该功能,则应使用Espresso中的intent mocking功能。 Espresso测试不应该将您的应用放在首位。 相反,您会捕获用于打开图库应用程序的意图并将结果返回给您的应用程序。 在测试期间,您将留在您的应用程序中,您将立即得到结果。

要执行此操作,请检查Espresso的intendingintended api。

Here is a tutorial by Pengj让你熟悉意图嘲笑。该教程提到了Mockito但你可以在没有它的情况下完美地使用它。

答案 2 :(得分:0)

最佳和正确的方法是使用意式浓缩咖啡。因此,您需要在应用程序的build.gradle中添加依赖项

androidTestImplementation "androidx.test.espresso:espresso-intents:$espressoVersion"

对于我来说,我是通过应用程序内的按钮打开图库的,然后是测试代码以及​​Espresso的预期和预期api的添加,如下所示:

@Test
fun photos_CreationGalleryClickUI() {
    savePickedImage()
    val imgGalleryResult = createImageGallerySetResultStub()
    intending(hasAction(Intent.ACTION_CHOOSER)).respondWith(imgGalleryResult)
    onView(withId(R.id.photos_button_gallery)).perform(click())
    onView(withId(R.id.photos_bigimage_viewer)).check(matches(hasImageSet()))
}

在需要打开图库并避免手动选择图像时,用于匹配的对象是关键:

hasAction(Intent.ACTION_CHOOSER)

我正在使用两个助手: savePickedImage()可以模拟图库中的图像

private fun savePickedImage() {
    val bm = BitmapFactory.decodeResource(mActivityTestRule.activity.resources, R.mipmap.ic_launcher)
    assertTrue(bm != null)
    val dir = mActivityTestRule.activity.externalCacheDir
    val file = File(dir?.path, "myImageResult.jpeg")
    System.out.println(file.absolutePath)
    val outStream: FileOutputStream?
    try {
        outStream = FileOutputStream(file)
        bm.compress(Bitmap.CompressFormat.JPEG, 100, outStream)
        outStream.flush()
        outStream.close()
    } catch (e: FileNotFoundException) {
        e.printStackTrace()
    } catch (e: IOException) {
        e.printStackTrace()
    }
}

createImageGallerySetResultStub 可以在“拾取”图像后存根结果。在这里,将结果作为可打包的数组是关键,没有它,永不结果永远不会被识别:

private fun createImageGallerySetResultStub(): Instrumentation.ActivityResult {
    val bundle = Bundle()
    val parcels = ArrayList<Parcelable>()
    val resultData = Intent()
    val dir = mActivityTestRule.activity.externalCacheDir
    val file = File(dir?.path, "myImageResult.jpeg")
    val uri = Uri.fromFile(file)
    val myParcelable = uri as Parcelable
    parcels.add(myParcelable)
    bundle.putParcelableArrayList(Intent.EXTRA_STREAM, parcels)
    resultData.putExtras(bundle)
    return Instrumentation.ActivityResult(Activity.RESULT_OK, resultData)
}

hasImageSet()作为匹配器助手,用于检查imageView是否具有可绘制对象:

return item.getDrawable() == null

注意:请记住,要设置授予规则以避免权限出现问题,并将测试规则定义为IntentTestRule(已经从ActivityTestRule扩展了)

@get:Rule
var mActivityTestRule = IntentsTestRule(AuctionCreationActivity::class.java)

@get:规则     var mRuntimePermissionRule = GrantPermissionRule.grant(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)

依赖项:

androidTestImplementation "androidx.test:rules:$testRules"