Модульное тестирование логики приложений Android

Желая написать несколько тестов для моего приложения, я наткнулся на страницы тестирования Android . После довольно долгого чтения быстро стало очевидно, что единственное, что я мог бы получить от него, – это информация о том, как тестировать пользовательский интерфейс / действия. Я действительно хочу, чтобы проверить мою логику с помощью простого ant test , желательно, даже без участия устройства. На этом этапе я должен упомянуть, что я не использую Eclipse, и довольно печально, что 99% ресурсов Java на Android предполагают, что люди это делают.

В любом случае, пытаясь добиться чего-либо вообще, я играл с учебником настолько, насколько мог. Он спрашивает, что каталог tests выполнен на том же уровне, что и src . Конечно, даже если каждая из их страниц подразумевает, что тестовый проект является полностью отдельным объектом. В то время как в каталоге проекта верхнего уровня я запускал android create test-project -m /path/to/my/project/ -n MyProjectTest -p tests . Стоит отметить, что они очень не согласуются с тем, как они хотят, чтобы вещи были настроены, как видно по этому вопросу . Посещая каталог, я вижу файл тестирования по умолчанию. Вот где начинаются проблемы.

Насколько я понимаю, тестирование выполняется следующим образом: build application, install; Идти на тесты, строить тесты, устанавливать; Запускать тесты из каталога тестов с помощью ant test или запускать их непосредственно с помощью adb shell am instrument . Это отлично работает. Однако у меня нет желания тестировать активность, а только логику (которая не имеет доступа к каким-либо представлениям / действиям).

Изменение теста по умолчанию для расширения AndroidTestClass похоже, некоторое время работало. Тесты выполнялись, но были оговорки: tests очистки с ant clean ../tests также очищали каталог проекта ( ../tests ), поэтому потребовалось навсегда создание тестов в чистой среде (что необходимо, потому что ant debug кажется ужасным при обнаружении изменений) Но это сработало, и я был счастлив.

Мало больше тестов позже, я получаю java.lang.VerifyError на моем единственном тестовом классе. Разбивка в Google и сворачивание вокруг, это сводилось к чему-то неправильному с внешними библиотеками или что-то не так с моим курсом класса. Я не использую никаких внешних .jar так что это, наверное, мой путь.

В любом случае, вот мой вопрос: что такое The Proper Way ™ для модульной тестовой логики в приложениях Android с JUnit? Я не могу найти никаких ресурсов по этому поводу: все ресурсы предназначены либо для тестирования компонентов пользовательского интерфейса, либо для тестирования отдельных приложений.

Как я могу тестировать только свою логику? Для этого даже не нужно запускать устройство, учитывая, что мне не нужно использовать какие-либо части Android. Где я могу разместить тесты? Что мне нужно изменить, чтобы запустить ant test в моем каталоге проектов, затем запустите их?

Длинный беспорядок позже, и мне удалось это сделать.

Прежде всего, я проигнорировал создание какого-либо проекта с помощью adb .

Представьте, что мой пакет называется com.foo.bar . Я создал tests в src/com/foo/bar/tests . Там, напишите ваши обычные тесты JUnit. Убедитесь, что вы поместите package com.foo.bar.tests в свои тестовые классы. Вот пример класса:

 package com.foo.bar.tests; import com.foo.bar.baz.Foo; import org.junit.*; import junit.framework.*; import static org.junit.Assert.*; public class MyTests extends TestCase { public void testSomething() { Foo testFoo= new Foo(); assertEqual(testFoo.getBar(), 1); } } 

Далее следует, что тесты выполняются с помощью ant test . Для этого добавьте следующее к вашему AndroidManifest.xml непосредственно перед последней закрывающей скобкой ( </manifest> ):

 <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.foo.bar" android:label="Tests for com.foo.bar"/> 

Вам также нужно

 <uses-library android:name="android.test.runner" /> 

Добавлен в раздел <application> .

Я не могу понять, что нужно менять, чтобы тестировать локально, а не на устройстве, но это 75% ответа и, надеюсь, будет полезным для такого, как я, в будущем.

EDIT: можно просто затенять исходное поведение ant test , добавив следующий ниже последний импорт в build.xml :

  <target name="test" > <junit> <!-- all your junit stuff here --> </junit> </target> 

Посмотрите Robolectric – это позволит вам избежать кошмара Google в тестировании.

Хорошая статья из Square на тему: «Воскрешение Тестирования для Android» .

Intereting Posts