Как использовать Robolectric и PIT для тестирования приложения Android?
С помощью Robolectric вы можете запускать тесты Android в JVM. С помощью PIT вы можете показать покрытие линии и провести тестирование на мутации. Для меня нормально использовать плагины Eclipse +, но не обязательно.
Это то, что я пробовал до сих пор:
У меня есть проект Android, назовем его MyProject.
Теперь я хочу протестировать MyProject в JVM, используя Robolectric и НДФЛ. Поэтому я создал еще один проект под названием MyTest, и мне удалось успешно запустить робоэлектрические тесты, как описано в быстрое начало работы с роботом. Вот как выглядит my.app.tests.MyActivityTest
:
@RunWith(RobolectricTestRunner.class)
public class MyActivityTest {
@Test
public void myTest() throws Exception {
String appName = new MainActivity().getResources().getString(R.string.app_name);
Assert.assertEquals(appName, "MyProject");
}
}
Теперь сложная часть: я хочу добавить тестирование покрытия линии и мутаций PIT в свои робоэлектрические тесты. Сначала попробовал использовать Pitclipse - не повезло. Pitclipse, похоже, еще не поддерживает зависимости проекта Eclipse.
Итак, моя вторая попытка - использовать командную строку, как описано в Быстрый запуск PIT:
Во-первых, я убедился, что мои тесты прошли успешно, используя Junit из командной строки:
java -cp <classpath> org.junit.runner.JUnitCore my.app.tests.MyActivityTest
<classpath>
содержит: junit4, robolectric, файлы классов MyProject, файлы классов MyTest, android.jar и другие необходимые библиотеки Android.
После успешного выполнения этого теста JUnit я использовал тот же <classpath>
в моем вызове PIT и выполняю этот вызов в корневом пути MyProject:
java -cp ../MyTest/bin:../MyTest/libs/*:bin/classes:~/android-sdk-linux/platforms/android-17/android.jar \
org.pitest.mutationtest.MutationCoverageReport \
--reportDir ../MyTest/pit-report \
--targetClasses my.app.* \ # package in MyProject
--targetTests my.app.tests.* \ # package in MyTest
--sourceDirs src/
Однако это приводит к исключению, которое я опубликовал ниже. Я думаю, мне нужно исключить некоторые классы, используя параметр PIT --excludedClasses
, но нет никаких подсказок о том, какой класс может вызвать проблемы. Обратите внимание, что MyActivityTest
не имеет суперкласса и явного конструктора.
java.lang.NullPointerException
ERROR Description [testClass=my.app.tests.MyActivityTest, name=myTest(my.app.tests.MyActivityTest)] -> java.lang.NullPointerException
at org.pitest.boot.CodeCoverageStore.visitProbes(CodeCoverageStore.java:92)
at my.app.tests.MyActivityTest.<init>(MyActivityTest.java:22)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:195)
at org.robolectric.RobolectricTestRunner$HelperTestRunner.createTest(RobolectricTestRunner.java:647)
at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:244)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:241)
at org.robolectric.RobolectricTestRunner$HelperTestRunner.methodBlock(RobolectricTestRunner.java:657)
at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:227)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:175)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.pitest.junit.adapter.CustomRunnerExecutor.run(CustomRunnerExecutor.java:42)
at org.pitest.junit.adapter.AdaptedJUnitTestUnit.execute(AdaptedJUnitTestUnit.java:86)
at org.pitest.coverage.execute.CoverageDecorator.execute(CoverageDecorator.java:50)
at org.pitest.containers.UnContainer.submit(UnContainer.java:46)
at org.pitest.Pitest$3.run(Pitest.java:148)
at java.lang.Thread.run(Thread.java:679)
MyActivityTest
, использующий robolectric, выдает сообщение об исключении, указанное выше. Вы хоть представляете, в чем может быть проблема? - person sulai   schedule 29.11.2013