2017-04-10 101 views
0

我目前正在为Android和iOS的流程和设计开始一个应用程序的自动化项目。我在使用Cucumber和Cucumber框架。我如何为Android和iOS使用相同的黄瓜步骤定义

我已经开始自动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 

我怎么会去建立我的项目允许使用这种特定的步骤定义?

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

感谢您的任何和所有帮助,可以给我。

回答

1

鉴于应用程序之间的共同性,共享功能文件是有意义的。管理特定于平台的step_definitions的干净方法是将它们保存在不同的目录中。

请看下面这个简单的示例项目。

simple cucumber project

可以(需要)的选项,像这样用黄瓜-r替代步骤定义文件夹之间切换:

cucumber -r features/step_definitions_android -r features/support 

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

为了方便兑替代终端上运行,你可以创建相应的配置文件:

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

正如你可以看到下面,每个这些配置文件运行时,相关的特定于平台的步骤定义调用。

run cucumber with alternative profiles

+0

这正是我一直在寻找的东西。谢谢。 –

0

我不会去为不同的操作系统单独的功能文件。您希望您的应用程序的行为与操作系统无关。如果你有两个,你的功能可能会发生分歧。

我的做法是执行两次执行,并将目标环境分离到堆栈中。我会使用一个环境变量来指出我目前正在定位哪个操作系统。

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

0

您应该使用与任何O.S.无关的单个功能文件。

如果你发现,你必须根据你O.S有加的it.Like你上面的代码的

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

但95%表示应同时为O.S.工作检查,以分离出操作的任何这样的情况下

0

你为什么不添加一行到表示是否要使用Android或iOS的cucumber.yml?

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 
0

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

该模式是使每个步骤定义实现一个单一的调用辅助方法。一旦你在你的助手方法中,那么你可以使用像使用环境变量,配置或一些条件来选择实现的技术。

一个例子可能会说明这一点。可以说,这两个应用程序都有能力添加一个朋友。当你第一次添加此功能,您将有一个像

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的领域(它不是为了解决这类问题而设计的)中解决,并将它移植到Ruby的领域当中,这个领域当然是为了处理这种类型的pr oblem。

现在,您已经掌握了编程语言,您可以使用各种技术来使用条件优雅而简单的例如

#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 

... 
相关问题