Настройка каталога пользовательских ресурсов для модульного тестирования в Android Studio

У нас есть весьма распространенное требование выполнять модульные тесты нашего приложения для Android, в которых используются ресурсы, необходимые только для модульного тестирования.

С SDK на основе Eclipse это было просто и очевидно - тестовый проект представлял собой отдельный проект с собственной папкой ресурсов. В Android Studio это предназначено для настройки в build.gradle (или по соглашению).

Наконец, наши модульные тесты выполняются, но я исчерпал каждое найденное мной предложение относительно пользовательской (и, в идеале, объединенной) папки ресурсов. Вот что я попробовал:

  • Добавление тестового замыкания в sourceSets внутри замыкания Android (под закрытием я подразумеваю то, что находится между фигурными скобками в build.gradle).

    androidTest {
        assets.srcDirs = ['src/androidTest/assets/']
    }
    
  • То же самое, но с "test" в качестве имени sourceSet (в отличие от "androidTest", выше), а также с "instrumentTest".

  • Различные комбинации выше, плюс androidTest.setRoot ("test"), androidTest.setRoot ("androidTest"), из-за которых наши модульные тесты не распознаются ("пустой набор").

Этот вопрос можно сформулировать более обобщенно как "как использовать разные каталоги для модульных тестов в Android Studio".

Мы изучили документацию по Android и либо не понимаем, либо это неправильно, либо где-то есть ошибка.

Любая помощь будет очень высоко ценится.

5 ответов

Решение

Я наткнулся на ответ на свой собственный вопрос, за который набрал заветную награду "Tumbleweed", зарезервированную за вопросы, которые вызывают особенно заметное отсутствие интереса. Тем не менее, это может оказаться полезным для кого-то.

В конце я собираюсь описать это как ошибку в сборке Android на Gradle, но в отсутствие какой-либо убедительной документации, которая останется в силе.

Казалось бы, "androidTest/assets" просто не работает. Однако "отладка / активы" делает. То же самое происходит с "debug/java", поэтому решение состоит в том, чтобы поместить все и все ресурсы и код тестирования в корень отладки, за исключением самих модульных тестов.

Я также добавил следующие модификации в свой build.gradle:

    androidTest {
        assets.srcDirs = ['src/main/assets', 'src/androidTest/assets/', 'src/debug/assets/']
        java.srcDirs = ['src/main/java', 'src/androidTest/java', 'src/debug/java']
    }

И теперь у меня есть работающие модульные тесты, использующие ресурсы и макеты, которые неизвестны при сборке релиза.

Я не знаю, как это было раньше, но я смог создать инструментальные тесты Android с инструментарием, где я мог бы читать тестовые ресурсы или производственные ресурсы. Смотрите этот ответ для получения дополнительной информации.

Ваша проблема, скорее всего, в том, что вы пытаетесь получить доступ к активам в приложении. Context(целевой контекст), но androidTestактивы фактически находятся в отдельном инструментальном контексте. То есть что-то вроде этого:

      InstrumentationRegistry.getInstrumentation().getTargetContext().getAssets()

Чтобы получить доступ к активам под androidTest/assetsиспользуйте это вместо этого:

      InstrumentationRegistry.getInstrumentation().getContext().getAssets()

Обязательно импортируйте из androidx.test.platform.app, который не устарел с марта 2022 года.

Я использую Android Studio 1.3 + Gradle 1.2.3, и src/androidTest/assets у меня не работает. Я поместил все в src/debug без каких-либо изменений в build.gradle, и это сработало. Похоже, что Android собирает элементы из папки отладки автоматически при сборке apk.

Я нашел это подходящим для себя

android{
    sourceSets {
        androidTest {
            assets.srcDirs = ['src/main/assets', 'src/androidTest/assets/', 'src/debug/assets/']
            java.srcDirs = ['src/main/java', 'src/androidTest/java', 'src/debug/java']
        }
    }
}
Другие вопросы по тегам