如何为Android和iOS使用相同的Cucumber步骤定义

时间:2017-04-10 20:28:18

标签: android ios ruby cucumber appium

我目前正在为Android和iOS的流量和设计相同的应用开始自动化项目。我使用Ruby和Cucumber框架。

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

我如何设置项目以允许使用这种特定的步骤定义?

为每个操作系统分别使用功能和步骤定义而不是尝试将它们合并在一起是否更好?

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

6 个答案:

答案 0 :(得分:2)

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

采取以下简单的示例项目。

simple cucumber project

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

cucumber -r features/step_definitions_android -r features/support

请注意,只要您使用-r选项,就会禁用自动加载,因此您需要明确包含第二个要求,以便在features / support文件夹中提取您的任何代码。

为了便于针对替代目标运行,您可以创建相应的配置文件:

# 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

答案 1 :(得分:1)

为什么不在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

答案 2 :(得分:0)

我不会为不同的操作系统寻找单独的功能文件。您希望应用程序的行为方式与操作系统无关。如果你有两个功能,你的功能可能会有所不同。

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

将在特定环境中执行某些操作的代码将非常不同,因此我将使用工厂选择要使用的当前实现。我不会考虑使用代码中的多个条件来分离执行,如您的小示例所示。我将拥有该类型条件的唯一地方是工厂方法,它创建将使用您的应用程序的实际类。

答案 3 :(得分:0)

您应该使用不依赖任何O.S。

的单一功能文件

如果您发现任何此类情况,您必须根据O.S分开操作。您已添加支票。就像上面显示的那样

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

但是95%的代码应该适用于O.S。

答案 4 :(得分: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的领域当然旨在解决这类问题。

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

#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

...

答案 5 :(得分:0)

(-r) require选项无法解决此问题。假设您在两个不同的文件夹中定义了步骤,

--features
----step_definitions_android
----step_definitions_ios

解决方案是启用(-e) exclude选项,而不是设置所需的步骤。

用于iOS的Exec cmd

cucumber -e features/step_definitions_android -r features/scenarios/

Exec cmd for Android

cucumber -e features/step_definitions_ios -r features/scenarios/