繁体   English   中英

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

[英]How do I use same Cucumber step definitions for android and iOS

我目前正在为一个应用程序执行自动化项目,该应用程序在流程和设计上都适用于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

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

最好为每个操作系统都具有单独的功能和步骤定义,而不是尝试将它们融合在一起?

感谢您提供的所有帮助。

考虑到应用程序之间的通用性,共享功能文件很有意义。 管理特定于平台的step_definitions的一种干净方法是将它们保留在单独的目录中。

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

简单黄瓜项目

您可以使用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

正如您在下面看到的那样,当运行每个概要文件时,将调用相关的平台特定步骤定义。

用其他配置文件运行黄瓜

您为什么不在黄瓜.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

我不会为不同的操作系统使用单独的功能文件。 您希望您的应用程序独立于操作系统以相同的方式运行。 如果您同时拥有两个功能,则可能会有所不同。

我的方法是执行两次执行,并将目标环境分离到堆栈中。 我将使用一个环境变量来指示我当前所针对的操作系统。

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

您应该使用不依赖任何操作系统的单个功能文件

如果发现任何这样的情况,您必须根据操作系统来分离操作,则可以对其进行添加检查。

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

但是您的代码中有95%都可以在两个操作系统上使用

正如托马斯所说,使其变得简单的关键是将事物推入堆栈。 要做到这一点,您需要应用一个具有相当纪律的简单模式。

模式是使每个步骤定义实现都可以单独调用一个辅助方法。 一旦使用了辅助方法,就可以使用诸如使用环境变量,配置或某些条件来选择实现的技术。

一个例子可以澄清这一点。 可以说,这两个应用程序都可以添加朋友。 首次添加此功能时,您将执行以下步骤

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

...

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

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

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

IOS的Exec cmd

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

适用于Android的Exec cmd

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM