【问题标题】:Using multiple TestRules in the same test在同一个测试中使用多个 TestRules
【发布时间】:2016-02-12 22:28:31
【问题描述】:

我编写了一个自定义的TestRule 来与我的 Android 测试套件一起使用。它在被测应用程序使用的数据库中填充一个表。现在我需要使用这个DataRuleActivityTestRule。我可以让我的测试类的两个字段用@Rule 注释吗?如何控制应用规则的顺序?

背景:

Android API 提供了一个用于启动 Activity 的 TestRule,它是每个带有 UI 的应用的核心类。我的应用程序有一个数据库,我有几个测试需要用一些已知数据预先填充数据库。以前,在基于 JUnit3 的测试中,我使用一个抽象超类来集中准备数据库的代码,然后我为不同的测试用例扩展了这个超类。现在我正在尝试使用 JUnit 4 实现相同的逻辑。我最近了解到测试规则是提供跨测试重用的逻辑的一种方式,因此我试图将逻辑从我的超类移动到测试规则。这是实现我的目标的合适方式吗?

【问题讨论】:

    标签: android junit4 junit-rule


    【解决方案1】:

    您当然可以在一个测试中拥有多个 @Rule 字段。我不确定规则应用的默认顺序是什么,或者它是否定义明确。但是,如果订购很重要,您可以使用RuleChain 控制它 它允许您定义在测试用例中有多个规则时如何应用规则的顺序。

    来自 Javadoc...

    @Rule
    public RuleChain chain = RuleChain
                               .outerRule(new LoggingRule("outer rule")
                               .around(new LoggingRule("middle rule")
                               .around(new LoggingRule("inner rule");
    

    【讨论】:

    • 谢谢。这就是我要找的!
    • " 我不确定规则应用的默认顺序是什么,或者它是否定义明确。"我有一个假设,即排序是由类中的声明顺序定义的。不过,我还没有对此进行测试。
    • @Code-Apprentice 可能是。我只是不确定 JLS 或 JDK 是否提供了关于从反射调用返回的顺序字段与它们在源中声明的顺序相比的保证。我当然不想依赖它来进行测试。
    • 这很好。当然,JUnit 本身可能会定义一个执行顺序。不过,我现在懒得研究它。
    • @Code-Apprentice 显然不是,请参阅junit.org/junit4/javadoc/4.12/org/junit/Rule.html: > 但是,如果有多个字段(或方法),它们的应用顺序将取决于您的 JVM 对反射 API 的实现,一般来说,这是未定义的。
    【解决方案2】:

    RuleChain 已弃用,从 4.13 开始,您可以在 Rule 中使用 order 参数。

    org.junit.Rule 注解有一个参数“order”,您可以使用它在一个文件中对规则进行排序。

    查看以下链接中的文档

    Rule.java

    【讨论】:

      【解决方案3】:

      如果您使用 JUnit 进行测试(我个人建议这样做),不建议在同一个文件中包含多个规则,因为规则是您的测试单元,并且在您进行单元测试时,您每个文件应该只有一个规则。

      如果您需要在运行测试之前创建某种数据,您应该使用@Before,然后加载必要的信息。 更多信息可以在这里找到:http://junit.sourceforge.net/javadoc/org/junit/Before.html

      如果您必须在多个类中加载相同的数据,我建议您使用您的逻辑创建一个类,在您的测试类中扩展该类,然后创建一个带有 @Before 注释的方法,然后调用您的超类方法。

      希望有帮助

      【讨论】:

      • 这些并不是真正的单元测试。它们是更多功能或集成测试。我仍在使用 JUnit,因为 Android 有检测工具。
      • 我明白了,但是在你的班级里真的有必要有多个规则吗?因为通常,您会为每个活动编写单独的测试文件
      • 另外,我的 TestRule 中没有断言。我不明白您与有关多个断言的问题的链接是如何相关的。我似乎对测试规则的使用感到困惑。我的理解是它们提供了旧的setUp()tearDown() 方法的替代方案。至少我是这样使用它们的。
      • 总而言之,Android API 提供了一个 TestRule 来启动应用程序。我想在某些测试运行之前添加一些配置。
      • 我想这就是你要找的东西:junit.sourceforge.net/javadoc/org/junit/Before.html
      猜你喜欢
      • 2020-12-04
      • 2016-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 2014-08-26
      • 2013-07-17
      相关资源
      最近更新 更多