【问题标题】:Parameterized JUnit tests in Android test projectAndroid 测试项目中的参数化 JUnit 测试
【发布时间】:2013-02-22 05:54:57
【问题描述】:

当我在 JUnit 3.x 中创建参数化测试用例时,我通常会使用类似的东西创建一个 TestSuite

public 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。我很可能会借用这些想法来创建一个可以用来代替android.test.InstrumentationTestRunner 的TestRunner。对于一项不常见的任务,这似乎需要做很多工作。如果 Android API 中已经有类似的解决方案,我不想重新发明轮子。有谁知道这样的事情?此外,其他替代解决方案也会有所帮助。

没关系,看起来@dtmilano 已经发布了这个作为答案...

【问题讨论】:

  • This 可能会有所帮助。这是我最喜欢的博客之一。
  • @Appu 谢谢。随意张贴作为答案。你至少应该为它投票;-)
  • 你的问题+1也是如此。但如果它真的帮助您解决问题,我可以将其发布为答案。
  • @Appu 当我花时间更彻底地阅读它时,我会告诉你的 ;-)
  • 好的。很好。这是你忘记问的问题;)希望其他人能回答以确切的方式解决它。这就是为什么我没有将其发布为答案。

标签: android unit-testing testing junit


【解决方案1】:

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

【讨论】:

  • 在我编辑了我的问题后,我注意到您基本上发布了一些类似于我的想法引导我的内容。我不知道我是怎么错过这个回复的。我通常会非常彻底地检查我的通知;-(
  • 现在我查看了InstrumentationTestRunner javadocs,我发现我可以覆盖getTestSuite() 和/或getAllTests() 方法来将测试插入到测试套件中。这样我可以使用构造函数或其他解决方案将参数传递给我的测试用例,而不是向我自定义的 InstrumentationTestRunner 添加 getter。
【解决方案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);
  }
}

【讨论】:

  • enum 是否需要嵌套在测试类中,或者它可以是独立类还是嵌套在另一个类中的enum
  • @Code-Apprentice 这不是必需的,任何枚举都可以。
  • 太棒了!我将把它添加到我的 Square 库列表中来学习。你们永远不会停止让我惊讶。感谢您为 Android 开发社区做出的所有贡献。
【解决方案3】:

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

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

但是,当我尝试运行给定包中的所有测试时,测试套件没有运行。

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

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

【讨论】:

    猜你喜欢
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多