2013-02-22 139 views
4

当我创建JUnit中3.X的参数化测试的情况下,我通常喜欢的东西参数JUnit测试

public static Test suite() { 
    TestSuite s = new TestSuite(); 

    for (int i = MIN; i < MAX; ++i) { 
     s.addTest(new MyTest(i)); 
    } 
} 

suite()方法创建一个TestSuite正确调用-线。当我用我的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已经张贴了这个作为一个答案......

+1

[This](http://mylifewithandroid.blogspot.in/2008/11/junit-in-android.html)可能有帮助。这是我最喜欢的博客之一。 – Kanth 2013-02-22 06:11:07

+0

@Appu谢谢。随意张贴,作为答案。你至少值得赞赏;-) – 2013-02-22 06:13:36

+0

那么你的问题+1。但是,如果它真的帮助您解决问题,我可以将其作为答案发布。 – Kanth 2013-02-22 06:16:14

回答

2

您可以实现测试运行,以能够传递参数给Android的测试。 请参阅how to pass an argument to a android junit test (Parameterized tests)的示例。

+0

当我编辑我的问题后,我注意到你基本上发布了类似于我的想法引导我的东西。我不知道我错过了这个答复。我通常很全面地检查我的通知;-( – 2013-02-26 00:40:29

+0

现在我看了一下'InstrumentationTestRunner'javadocs,我发现我可以重写'getTestSuite()'和/或'getAllTests()'方法来插入测试到测试套件这样我可以使用构造函数或其他解决方案将参数传递给我的测试用例,而不是将一个getter添加到我的自定义InstrumentationTestRunner。 – 2013-02-26 00:50:24

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); 
    } 
} 
+0

enum是嵌套在测试类中还是可以嵌套是一个独立的类还是来自另一个类的嵌套'enum'? – 2014-10-21 18:59:56

+0

@代码学徒它不是必需的,任何枚举都可以工作。 – 2014-10-21 19:07:31

+0

太棒了!我会将它添加到我的Square库列表中以学习。不再感到惊讶。感谢您对Android开发社区的所有贡献。 – 2014-10-21 19:12:29

1

半响后最初写这个问题,我发现我可以直接运行测试类,它包含一个静态suite()方法:

adb shell am instrument -w -e class <fully qualified test class name> <Android package name>/android.test.InstrumentationTestRunner 

然而,测试套件没有按”当我尝试在给定的包中运行所有测试时运行。

当然,这已经有一段时间了。现在我正在使用Android Studio而不是命令行。我仍然可以单独运行测试类,但在选择包或尝试运行所有测试时仍然无法运行。

一个潜在的替代方法是用suite()方法编写一个主测试类,该方法将所有测试添加到返回的TestCase。不幸的是,每次向我的套件添加新的测试类时,都需要手动编辑。