Тестирование пользовательского интерфейса Android с разрешениями хранилища в CI - PullRequest
0 голосов
/ 24 октября 2018

Я хочу запускать UI-тесты и юнит-тесты для проекта в CI (Jenkins Pipeline).Тесты пользовательского интерфейса требуют, чтобы изображения и видео находились на тестовом устройстве / эмуляторе.В тестах пользовательского интерфейса я запрашиваю разрешение на доступ к чтению / записи в хранилище, чтобы я мог сбросить несколько ресурсов в папку загрузок, а затем в конце набора тестов удалить их.

Когда я запускаю свои тесты на Jenkins(mac) разрешения не предоставлены, передача мультимедиа не завершена, и все мои тесты не пройдены.

Проект содержит модуль приложения и два внутренних модуля библиотеки.

Шаги конвейера

Сборка

sh "./gradlew clean assembleRelease"

Модульный тест

sh "./gradlew testReleaseUnitTest"

UI Test

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
}

Я нашел краткосрочное решение для ручного копирования всех моих медиаресурсов в эмулятор.Но это не кажется правильным, это должно быть в состоянии быть автоматизированным.

1 Ответ

0 голосов
/ 05 ноября 2018

Способ работы со мной заключается в следующем:

Добавлены разрешения в файле AndroidManifest.xml моего app модуля.

<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 на "/" тесты не пройдены, так как каталог / доступен только для чтения, что и ожидается.

Идея создания двух тестовых случаев заключается в том, чтобы проверить разные Context, которыетесты могут быть получены во время выполнения.testTargetContextPermission использует приложение Context, которое не имеет имя пакета или идентификатор приложения, заканчивающийся .test.В то время как testInstrumentationPermission использует инструментальное приложение Context, которое имеет , его имя пакета или идентификатор приложения заканчиваются на .test.Я думал, что разрешения должны быть определены в каждом из их AndroidManifest, но получается, что определение разрешений только для вашего app AndroidManifest автоматически даст те же разрешения для пакета Instrumentation.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...