【问题标题】:Integrating Robolectric and Cucumber集成 Robolectric 和 Cucumber
【发布时间】:2013-05-26 16:36:39
【问题描述】:

我想结合 Robolectric 和 Cucumber (JVM)。

目前我有两个类ActivityStepdefs,其中定义了活动管理的两个步骤定义。

我的第二个类是RoActivity,例如,一个活动是根据它的类名创建的,以及将在哪里使用 Robolectric。

当我使用RobolectricTestRunner 运行RoActivityTest 时,此类中的测试通过了,但是当我运行RunCukesTest(将功能作为junit 测试运行的类)时,RoActivity 中的代码没有作为Robolectric 的一部分运行,即RunCukesTest在我的项目中搜索功能并将其与ActivityStepdefs中的方法匹配,最后这个类将调用RoActivity中的方法

是否可以使用两个 junit both* 跑步者进行测试?

我不确定,但也许可以使用 junit 规则执行类似 powermock 的操作。

在那种情况下,我应该为哪一个定义规则?

*黄瓜和机器人

【问题讨论】:

  • 只是想知道您是否能够在这方面取得进展?我正在尝试做类似的事情,并且仍在研究不同的可能性
  • 还没有,如果你愿意我们可以尝试一起寻找解决方案
  • 看看github.com/mfellner/cucumber-jvm/tree/cucumber-android。此 repo 允许您使用 cucumber 在 Android 上进行集成测试。我昨天写完这篇评论后不久就找到了它。我几乎让它运行得很好。如果并且当我让它运行时,我会把它写成一个答案,并为其他人提供说明。如果你在我之前运行它,我会鼓励你也这样做:P
  • 这个项目似乎是为了在模拟器上运行测试,而不是使用 Robolectric。
  • 嗨 Axis,您找到使用黄瓜和机器人进行运行测试的解决方案了吗?

标签: android junit cucumber robolectric cucumber-jvm


【解决方案1】:

我的小 5 美分。

Cucumber 主要用于验收测试(如果您将它用于单元测试,请纠正我),而 Robolectric 主要用于单元测试。

对于我来说,在 TDD 期间写 cucumber 是大材小用。而且 Robolectric 仍然不是 android,我会在真实设备或至少模拟器上运行验收测试。

【讨论】:

  • 是的,用于验收测试。回到那个时候,我有兴趣在没有设备的情况下快速运行验收测试。
  • 您对此有何解决方案?我对做同样的事情很好奇
【解决方案2】:

我也面临同样的问题,经过一些谷歌工作,我得到了解决方案:

@RunWith(ParameterizedRobolectricTestRunner::class)
@CucumberOptions( features = ["src/test/features/test.feature","src/test/features/others.feature"], plugin = ["pretty"])
class RunFeatures(val index: Int, val name:String) {

    companion object {
        @Parameters(name = "{1}")
        @JvmStatic
        fun features(): Collection<Array<Any>> {
            val runner = Cucumber(RunFeatures::class.java)
            Cucumber()
            val children = runner.children
            return children.mapIndexed{index, feature ->
                arrayOf(index,feature.name)
            }
        }
    }



    @Test
    fun runTest() {
        val core = JUnitCore()
        val feature = Cucumber(RunFeatures::class.java).children[index]!!
        core.addListener(object: RunListener() {
            override fun testFailure(failure: Failure?) {
                super.testFailure(failure)
                fail("$name failed:\n"+failure?.exception)
            }
        })
        val runner = Request.runner(feature)
        core.run(runner)
    }
}

但对我来说似乎不是一个很好的解决方案,有人可以帮我解决这些问题:

  1. 必须明确列出所有功能文件路径。但不能使用 *.feature 等模式
  2. 失败时无法知道哪一步失败。
  3. 参数只能传递原始类型数据,

我已经进入黄瓜源,但似乎 CucumberOptions inline Cucumber,我无法以编程方式传递它,只能使用注释。

【讨论】:

  • 当您通过使用回答功能发布答案和问题的混合时,您正在尝试实现两件不同的事情 - 分享您的知识并寻求建议。专家将不会在这里尝试帮助您解决这 3 个问题,因为您没有创建新问题。请不要劫持旧问题来提出新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多