整合Robolectric和Cucumber

9
我希望将Robolectric和Cucumber(JVM)结合起来。
目前我有两个类:ActivityStepdefs,在其中定义了两个活动管理的步骤定义;RoActivity是我的第二个类,在其中创建了一个活动(例如,从它的类名),并使用Robolectric。
当我使用RobolectricTestRunner运行RoActivityTest时,这个类中的测试通过了,但是当我运行RunCukesTest(作为junit测试运行特性的类)时,来自RoActivity的代码不会作为Robolectric的一部分运行,也就是说,RunCukesTest搜索我的项目上的特性,并将其与ActivityStepdefs中的方法匹配,最后这个类将调用RoActivity的一个方法。
是否可以同时使用junit和runners运行测试?
我不确定,但可能可以像powermock一样使用junit rules。
在这种情况下,我应该定义规则吗?
*Cucumber和Robolectric

你能否在这方面有所进展呢?我正在尝试做类似的事情,仍在研究不同的可能性。 - zabawaba99
暂时还没有,如果您愿意,我们可以一起尝试找到解决方案。 - Axxiss
请查看 https://github.com/mfellner/cucumber-jvm/tree/cucumber-android 。这个仓库允许您使用cucumber在Android上进行集成测试。我昨天在写完这条评论后不久发现了它。我几乎已经成功运行了它。如果我成功运行,我会将其作为答案编写,并为其他人提供说明。如果您在我之前运行它,请鼓励您也这样做 :P - zabawaba99
这个项目似乎是在模拟器上运行测试,而不是使用Robolectric。 - Axxiss
Axis,你找到使用Cucumber和Robolectric运行测试的解决方案了吗? - M-S
经过一天的搜索工作,我找到了一个解决方案:https://github.com/bySabi/RoboCuke/tree/master/src/test/java/com/iguanalab/app/RoboCuke。希望它能帮助到某些人。 - iptton
2个回答

1

我也遇到了同样的问题,经过一些谷歌搜索,我找到了解决方案:

@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. 参数只能传递原始类型数据,

我已经进入了cucumber源代码,但似乎CucumberOptions内联了Cucumber,我无法以编程方式传递它,只能使用注释。


当您使用答案功能发布答案和问题的混合时,您试图实现两个不同的目标 - 分享您的知识并寻求建议。专家们将不会在此处尝试帮助您解决这三个问题,因为您没有创建新问题。请不要劫持旧问题来提出新问题。 - Maxim Sagaydachny

-1

我的小建议。

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

对我来说,在TDD期间编写Cucumber有些过度。而Robolectric仍然不是Android,我会在真实设备上或至少模拟器上运行验收测试。


是的,这是为了验收测试。当时我对快速运行验收测试而不需要设备很感兴趣。 - Axxiss
你对此有什么解决方案?我很想尝试做同样的事情。 - Nelson Ramirez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接