如何使用Robolectric和PIT测试Android应用程序?
使用Robolectric,您可以在JVM中运行Android测试。使用PIT,您可以显示代码行覆盖率并进行变异测试。对我来说,使用Eclipse +插件也可以,但不是必需的。
这是我迄今为止尝试过的内容:
我有一个Android项目,让我们称其为“我的项目”(MyProject)。
现在,我想使用Robolectric和PIT在JVM中测试MyProject。因此,我创建了另一个名为MyTest的项目,并成功地运行了Robolectric测试,就像robolectric quick start中所描述的那样。这是
现在是棘手的部分:我想将PIT的行覆盖率和突变测试添加到我的Robolectric测试中。首先尝试使用Pitclipse - 没有成功。 Pitclipse似乎还不支持Eclipse项目依赖项。
"
然而,这会导致我下面发布的异常。我认为我需要使用PIT的
使用Robolectric,您可以在JVM中运行Android测试。使用PIT,您可以显示代码行覆盖率并进行变异测试。对我来说,使用Eclipse +插件也可以,但不是必需的。
这是我迄今为止尝试过的内容:
我有一个Android项目,让我们称其为“我的项目”(MyProject)。
现在,我想使用Robolectric和PIT在JVM中测试MyProject。因此,我创建了另一个名为MyTest的项目,并成功地运行了Robolectric测试,就像robolectric quick start中所描述的那样。这是
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的行覆盖率和突变测试添加到我的Robolectric测试中。首先尝试使用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 测试成功,我就在 MyProject 的根路径下使用相同的 <classpath>
进行 PIT 调用,并执行该调用:
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
会产生上面发布的异常。您有任何关于问题可能是什么的想法吗? - sulai