我如何在Android和iOS上使用相同的Cucumber步骤定义

我目前正在为Android和iOS的stream程和devise开始一个应用程序的自动化项目。 我正在使用与Cucumber框架的Ruby。

我已经开始自动化Android,基本上我需要做的是每个步骤的定义,为Android和ios单独的代码有点像这样的伪代码:

Then (/^I click the Login Button$/) do if mobile_platform = android #android locators and code here else #iOS locators and code here end end 

我将如何去设置我的项目,以允许这样的具体步骤定义的用法?

为每个操作系统分别设置特征和步骤定义,而不是试图将它们融合在一起更好?

感谢您能给我的任何和所有的帮助。

考虑到应用程序之间的共同性,共享function文件是有意义的。 pipe理特定于平台的step_definitions的一种简单方法是将它们保存在不同的目录中。

以下面的简单示例项目。

简单的黄瓜项目

您可以使用cucumber -r(require)选项在替代步骤定义文件夹之间切换,如下所示:

 cucumber -r features/step_definitions_android -r features/support 

请注意,只要使用-r选项,自动加载就会被禁用,因此为什么您需要明确地包含第二个需求,以便将特征/支持文件夹中的任何代码提取出来。

为了便于运行替代目标,您可以创build相应的configuration文件:

 # cucumber.yaml android: -r features/step_definitions_android -r features/support ios: -r features/step_definitions_ios -r features/support 

如下所示,当运行这些configuration文件中的每一个时,将调用相关的特定于平台的步骤定义。

运行黄瓜替代配置文件

我不会去为不同的操作系统单独的function文件。 您希望您的应用程序的行为方式与操作系统无关。 如果你有两个,你的特征可能会出现分歧。

我的做法是做两个执行,并将目标环境分离到堆栈中。 我将使用一个环境variables来指出我目前所在的操作系统。

在特定环境下执行某些操作的代码将会非常不同,所以我将使用工厂来select当前的实现。 我不会考虑使用代码中的多个条件来分开执行,就像你的小例子所表明的那样。 我将有一个该types的条件的唯一的地方将在工厂方法,创build将使用您的应用程序的实际类。

你应该使用单一的function文件,不依赖于任何操作系统

如果你发现任何这样的情况下,你必须根据操作系统分离出来的操作,你已经添加了检查。像你上面显示的

 if mobile_platform = android #android locators and code here else #iOS locators and code here 

但是,95%的代码应该适用于这两个操作系统

为什么不在cucumber.yml中添加一行代表您是使用android还是使用ios?

 mobile_platform: 'android' 

在一个环境文件中,你可以这样做:

 require 'yaml' cucumber_options = YAML.load_file('cucumber.yml') $mobile_platform = cucumber_options['mobile_platform'] 

然后在你的步骤定义文件中,你可以开始这样做:

 Then (/^I click the Login Button$/) do if $mobile_platform = 'android' #android locators and code here else #iOS locators and code here end end 

正如托马斯所说,让这个简单的关键是把事情推下去。 要做到这一点,你需要应用一个简单的模式,相当多的纪律。

该模式是使每个步骤定义实现一个单一的调用辅助方法。 一旦你在你的帮手方法,那么你可以使用技术,如使用环境variables,configuration或一些条件select实施。

一个例子可能会澄清这一点。 可以说,这两个应用程序都有能力添加一个朋友。 当你第一次添加这个function,你会有一个像这样的步骤

 When 'I add a friend' do fill_in first_name: 'Frieda' fill_in last_name: 'Fish' ... end 

这需要成为

 When 'I add a friend' do add_friend name: 'Frieda' end 

由…实施

 module FriendStepHelper def add_friend( ...) // Only start thinking about IOS or Android from here down. ... end end 

现在看起来可能有点痛苦,但是你所做的就是把这个问题从Cucumber的领域中解放出来(并不是为了解决这个问题而devise的),并把它移植到Ruby的领域当中,处理这类问题。

现在你在编程语言中,你可以使用各种技术来使你的条件优雅和简单,例如

 #use hungarian prefix's def ios_add_friend def droid_add_friend #return early from os specific functions if wrong OS def ios_add_friend return if droid? ... end # run both implementations when they are different def add_friend ios_add_friend droid_add_friend end # loads of other alternatives ...