当我在JUnit 3.x中创建参数化测试用例时,我通常创建一个类似
的TestSuitepublic static Test suite() {
TestSuite s = new TestSuite();
for (int i = MIN; i < MAX; ++i) {
s.addTest(new MyTest(i));
}
}
从桌面命令行运行JUnit时,会正确调用此suite()
方法。当我用我的Android测试项目尝试这个时,测试不会运行。如何让我的测试在模拟器上运行?或者是否有不同的方法为Android创建参数化测试?
更多想法:
通常我使用命令行运行我的测试:
adb shell am instrument -w [-e class <fully qualified test class name>[#<test method name>()]] <Android package name>/android.test.InstrumentationTestRunner
这允许我选择从我的测试套件中运行哪些测试。理想情况下,我也希望以这种方式运行参数化测试。来自@Appu的评论中的链接描述了构建一个运行JUnit测试的独立应用程序。作为其中一部分,此应用程序具有自定义TestRunner。我很可能借用这些想法来创建一个TestRunner,我可以使用它代替 android.test.InstrumentationTestRunner
。对于一项并非罕见的任务来说,这似乎是很多工作。如果Android API中已有类似的解决方案,我宁愿不重新发明轮子。有谁知道这样的事情?此外,其他替代解决方案也会有所帮助。
没关系,看起来@dtmilano已经发布了这个答案......
答案 0 :(得分:2)
您可以实现测试运行器,以便能够将参数传递给Android测试。 请参阅how to pass an argument to a android junit test (Parameterized tests)上的示例。
答案 1 :(得分:2)
或者是否有不同的方法为Android创建参数化测试?
我们(Square)为此目的写了一个名为Burst的库。如果在测试构造函数中添加枚举参数,Burst的测试运行器将为每个枚举值组合生成测试。例如:
public class ParameterizedTest extends TestCase {
enum Drink { COKE, PEPSI, RC_COLA }
private final Drink drink;
// Nullary constructor required by Android test framework
public ConstructorTest() {
this(null);
}
public ConstructorTest(Drink drink) {
this.drink = drink;
}
public void testSomething() {
assertNotNull(drink);
}
}
答案 2 :(得分:1)
在最初写这个问题后的一段时间,我发现我可以直接运行一个包含静态suite()
方法的测试类:
adb shell am instrument -w -e class <fully qualified test class name> <Android package name>/android.test.InstrumentationTestRunner
但是,当我尝试在给定包中运行所有测试时,测试套件不会运行。
当然,这已经有一段时间了。现在我使用Android Studio而不是命令行。我仍然可以单独运行测试类,但是当我选择一个包或尝试运行我的所有测试时它仍然没有运行。
一种可能的替代方法是使用suite()
方法编写一个主测试类,该方法将所有测试添加到返回的TestCase
。不幸的是,每次我向我的套件中添加一个新的测试类时,都需要手动编辑。