Как протестировать проект библиотеки Android

97

Я пишу проект библиотеки Android на основе класса Android Bitmap (назовите его AndroindLib), который содержит только служебный класс (без активности). Я попытался протестировать его с помощью Android JUnit, но он продолжает жаловаться, что не может найти AnroidLib.apk

Как правильно тестировать проект библиотеки Android?

Лили
источник
1
Или ( бесстыдное предупреждение о подключении ) вы можете использовать созданный мной проект: Android Library Test Harness (то, что я люблю называть «Alt H»). Он доступен в виде репозитория git: gitorious.org/alth . Проект все еще находится в разработке, а документация немного скудна, так что не стесняйтесь обращаться ко мне, если у вас есть какие-либо вопросы.
i41

Ответы:

75

Цитата из документации :

"Есть два рекомендуемых способа настройки тестирования кода и ресурсов в библиотечном проекте:

  • Вы можете настроить тестовый проект, который будет использовать проект приложения, зависящий от проекта библиотеки. Затем вы можете добавить в проект тесты для функций, специфичных для библиотеки.

  • Вы можете настроить стандартный проект приложения, зависящий от библиотеки, и поместить инструменты в этот проект. Это позволяет вам создать автономный проект, содержащий как тесты / инструменты, так и код для тестирования ».

CommonsWare
источник
27
поэтому в основном все, что вам нужно сделать, это добавить библиотеку в свой тестовый проект и протестировать тестовый проект.
njzk2
Ссылка больше не действительна, есть ли шанс указать нам на текущую?
Абдулла Джибали
Выглядит так: developer.android.com/guide/developing/projects/…
Абдулла Джибали
4
Не уверен, что кто-то еще добился успеха с этими рекомендациями, но я нет. Сначала попробовал второе решение, и когда я пытаюсь запустить в Eclipse, я получаю следующее: <ProjectName> не указывает инструментарий android.test.InstrumentationTestRunner или не объявляет uses-library android.test.runner в своем AndroidManifest.xml. И это несмотря на то, что я добавил в свой манифест элементы как инструментария, так и библиотеки использования.
Bellinghammer
2
Получил второй (и предпочтительный способ работы). Очень важно, чтобы вы разместили элементы uses-library и инструментария в правильном месте в вашем манифесте. Элемент инструментария является дочерним по отношению к корневому элементу манифеста, а элемент uses-library является дочерним элементом элемента приложения. Я помещал библиотеку uses под элементом manifest и в итоге получал сообщение об ошибке выше при попытке запустить тесты.
Bellinghammer
17

В вашем тестовом проекте просто измените имя пакета, чтобы оно было таким же, как у пакета вашей библиотеки. Например, у вас есть библиотека с пакетом "com.example.lib". Создайте тестовый проект, ориентированный на вашу библиотеку. В файле манифеста вы увидите package="com.example.lib.test", и targetPackage="com.example.lib". Просто измените пакет с com.example.lib.test на com.example.lib ( targetPackageоставьте как есть).

Кроме того, убедитесь, что библиотека ссылается на ваш тестовый проект НЕ в пути сборки Java, а как обычную библиотеку Android: в Eclipse она должна отображаться как библиотека на Project->Properties->Androidвкладке, но не на Project->Properties->Java Build Pathвкладке.

Затем запустите тесты.

Алексашка
источник
Ваши идеи имели для меня смысл, так что тест был нацелен на себя (как приложение), а приложение было связано с библиотекой .... но я не мог заставить его работать через сборку муравьев или IntelliJ .... как .apk (ожидаемый для тестируемого приложения) не существовал, когда он пытался его установить, поскольку он компилируется в «test / bin /.- debug.apk»
Эндрю Маккензи
Я заставил его работать, просто изменив имя пакета тестового проекта в его манифесте (и тестируемый пакет - который должен быть таким же), чтобы НЕ совпадать с именем пакета проекта библиотеки, а также удалив ссылку на целевой тест проект в файле ant.properties.
Эндрю Маккензи
1
Я думаю, что это лучший ответ, чем принятый, он просто перекликается с документацией - ИМХО.
Эндрю Маккензи
5

Согласно документации :

Тестирование библиотечного модуля аналогично тестированию приложения. Основное отличие состоит в том, что библиотека и ее зависимости автоматически включаются как зависимости тестового APK. Это означает, что тестовый APK включает в себя не только собственный код, но также AAR библиотеки и все ее зависимости. Поскольку отдельного «тестируемого приложения» не существует, задача androidTest устанавливает (и удаляет) только тестовый APK. При объединении нескольких файлов манифеста Gradle следует порядку приоритетов по умолчанию и объединяет манифест библиотеки с основным манифестом тестового APK.

Avilio
источник
какую задачу запускать тесты? Gradle Test или Gradle AndroidTest? androidTest - это не задача.
Sunnyday
но такие инструменты, как Firebase Test Lab, требуют APK или AAB и не принимают файл AAR, который является результатом задачи сборки библиотеки
Мустафа Беркай Мутлу
1

ПРИМЕЧАНИЕ. Это решение основано на использовании Eclipse Indigo (3.8.2) и может быть реализовано несколько иначе для другой среды IDE, хотя основные принципы останутся такими же.

У меня были похожие проблемы, и я обнаружил, что всегда работает следующее:

( ПРИМЕЧАНИЕ. Эти инструкции предназначены для создания новой группы проектов с нуля. Если вы уже создали части группы проектов, возможно, вам придется изменить свои проекты, чтобы они соединялись таким же образом. )

  1. Создайте новый проект библиотеки Android, установив флажок «Is Library» во время создания. (например, проект Android под названием «RemingtonAndroidTools»).
  2. Создайте проект библиотеки Android и убедитесь, что он создал файл jar в папке bin. (например, файл jar с именем «RemingtonAndroidTools.jar».)
  3. Создайте пустой проект Android для тестирования приложения Android, которое будет служить тестовым приложением Android. (Например, проект Android под названием «RemingtonAndroidToolsTestApp»). Вам не нужно будет изменять исходный код или ресурсы проекта Android Test App, если у вас нет чего-то, что нужно добавить для тестирования. Многие вещи можно протестировать без каких-либо изменений в проекте Android Test App. Проект Android Test App - это мост между вашим проектом Android Library и проектом Android Junit, который делает возможным тестирование проекта Android Library через Android Junit.
  4. Перейдите на вкладку «Библиотека» пути сборки Java для проекта Android Test App (в данном примере «RemingtonAndroidToolsTestApp»).
  5. Добавьте файл jar (в этом примере «RemingtonAndroidTools.jar») проекта библиотеки Android (в данном примере «RemingtonAndroidTools») с помощью кнопки «Добавить банки ...».
  6. Создайте новый проект Android Test (например, «RemingtonAndroidToolsTester»), который будет выступать в качестве тестера библиотеки Android, и выберите проект приложения Android Test (в данном примере «RemingtonAndroidToolsTestApp») в качестве цели.
  7. Перейдите на вкладку «Библиотека» в пути сборки Java для проекта Android Library Tester (в данном примере - «RemingtonAndroidToolsTester»).
  8. Добавьте файл jar (в этом примере «RemingtonAndroidTools.jar») проекта библиотеки Android (в данном примере «RemingtonAndroidTools») с помощью кнопки «Добавить банки ...».
  9. Найдите последнюю папку вашего пакета Android в проекте Android Library Tester (например, «danny.remington.remington_android_tools_test_app.test») и добавьте тестовый класс (например, «MainActivityTest»), который наследуется от ActivityInstrumentationTestCase2.
  10. Измените тестовый класс («TestActivityTest» в этом примере), чтобы использовать действие (например, «TestActivity») приложения Android Test («RemingtonAndroidToolsTestApp» в этом примере) в качестве параметра для ActivityInstrumentationTestCase2.
  11. Отредактируйте тестовый класс («TestActivityTest» в этом примере) и создайте конструктор по умолчанию, который вызывает super (Class) и передает класс приложения Android Test (например, «TestActivity.class»).

У вас должно получиться три проекта (Android Library, Android Test App, Android Library Tester), которые выглядят примерно так:

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

У вас должен получиться класс для тестирования вашей библиотеки Android, который выглядит примерно так:

package danny.remington.remington_android_tools_test_app.test;

import android.test.ActivityInstrumentationTestCase2;
import danny.remington.remington_android_tools_test_app.TestActivity;

/**
 * 
 */
public class TestActivityTest extends
      ActivityInstrumentationTestCase2<TestActivity> {

   public TestActivityTest() {
      super(TestActivity.class);
   }

}

Затем вы можете добавить любой тест, который хотите. Вам не нужно будет ссылаться на приложение Android Test («RemingtonAndroidToolsTestApp» в этом примере) для дальнейшего запуска тестов, если только они не требуют доступа к конкретному компоненту Android (например, к папке Assets). Если вам нужен доступ к каким-либо компонентам, специфичным для Android, вы можете сделать это, изменив приложение Android Test (в данном примере «RemingtonAndroidToolsTestApp»), а затем сославшись на него с помощью инструментов, предоставляемых стандартным Android Junit API. (Подробнее об этом можно прочитать здесь: http://developer.android.com/tools/testing/testing_android.html )

Дэнни Ремингтон - OMS
источник
0

Если ваши классы ulitiy не зависят от какого-либо кода, специфичного для Android, вы можете просто использовать стандартные модульные тесты JUnit. Нет необходимости использовать версии Android.

Шерил Саймон
источник
2
Это не работает, потому что стандартный JUnit компилируется в стандартную JVM, в то время как файлы Java Android компилируются в виртуальную машину Dalvik.
Дэнни Ремингтон - OMS,