在 CI 中使用存储权限进行 Android UI 测试



我想在CI(Jenkins Pipeline(中的项目上运行UI测试和单元测试。UI 测试要求图像和视频位于测试设备/模拟器上。在 UI 测试中,我请求存储读/写访问权限的权限,以便我可以将一些资产转储到下载文件夹中,然后在测试套件结束时删除它们。

当我在 Jenkins (mac( 上运行测试时,未授予权限,不会进行媒体传输,并且所有测试都失败。

该项目包含一个应用程序模块和两个内部库模块。

管道步骤

sh "./gradlew clean assembleRelease"

单元测试

sh "./gradlew testReleaseUnitTest"

用户界面测试

sh "$ANDROID_HOME/emulator/emulator @my_sweet_emulator_name -no-boot-anim & $ANDROID_HOME/platform-tools/adb wait-for-device"
sh './gradlew connectedAndroidTest'

问题

1( CI 构建挂起隐式assembleDebugAndroidTest任务

2( 如果我在计算机上的命令行上运行该任务,测试将安装,但是未授予读/写存储权限,因此由于设备上没有任何预期内容,所有测试都会失败。

我尝试过的事情

  • 我只尝试测试发布版本,但这显示了相同的问题 2。testBuildType "release"
  • 我没有需要使用的其他权限

我如何授予权限

@RunWith(AndroidJUnit4::class)
class MyMediaClassTest {
@Rule
@JvmField
val activityRule = ActivityTestRule(MainActivity::class.java)
@Rule
@JvmField
val grantPermissionRule: GrantPermissionRule = GrantPermissionRule
.grant(android.Manifest.permission.READ_EXTERNAL_STORAGE,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
// tests and stuff
}

我已经看到了一个短期解决方案,可以将我的所有媒体资产手动复制到模拟器中。但这似乎不对,这应该能够自动化。

它与我一起工作的方式是按照以下步骤操作:

在我的app模块的AndroidManifest.xml文件中添加了权限。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

并尝试执行以下检测的测试用例/类:

@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Rule
@JvmField
val grantPermissionRule: GrantPermissionRule = GrantPermissionRule
.grant(android.Manifest.permission.READ_EXTERNAL_STORAGE,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
val rootDir = "/sdcard/"
@Test
fun testTargetContextPermission() {
val targetContext = InstrumentationRegistry.getTargetContext()
assertTrue("Not the target package",
!targetContext.packageName.endsWith(".test"))
assertTrue("Permissions not Granted", targetContext.checkSelfPermission(
android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
targetContext.checkSelfPermission(
android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)
val file = File(rootDir + "targetTest.txt")
if (file.exists()) {
file.delete()
}
assertTrue("File was not created", file.createNewFile())
val sdcard = File(rootDir)
assertTrue("sdcard is empty or file not found", sdcard.list().size != 0 &&
Arrays.asList<String>(*sdcard.list()).contains("targetTest.txt"))
}
@Test
fun testInstrumentationPermission() {
val instrumentationContext = InstrumentationRegistry.getContext()
assertTrue("Not the instrumentation package",
instrumentationContext.packageName.endsWith(".test"))
assertTrue("Permissions not Granted", instrumentationContext.checkSelfPermission(
android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
instrumentationContext.checkSelfPermission(
android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)
val file = File(rootDir + "instrumentationTest.txt")
if (file.exists()) {
file.delete()
}
assertTrue("File was not created", file.createNewFile())
val sdcard = File(rootDir)
assertTrue("sdcard is empty or file not found", sdcard.list().size != 0 &&
Arrays.asList<String>(*sdcard.list()).contains("instrumentationTest.txt"))
}
}

两个测试用例都成功返回。将rootDir更改为"/"时,测试失败,因为/目录是只读的,这是预期的。

拥有两个测试用例背后的想法是测试测试可以在运行时检索的不同ContexttestTargetContextPermission使用的应用程序Context,该应用程序没有包名称或以.test结尾的应用程序 ID。虽然testInstrumentationPermission使用检测应用Context但它的包名称或应用程序ID 以.test结尾。我认为权限需要在他们的每个AndroidManifest中定义,但事实证明,仅为appAndroidManifest定义权限也会自动向检测包授予相同的权限。

相关内容

  • 没有找到相关文章

最新更新