【问题标题】:How do I use same Cucumber step definitions for android and iOS如何为 android 和 iOS 使用相同的 Cucumber 步骤定义
【发布时间】:2017-09-06 00:58:30
【问题描述】:

我目前正在为 Android 和 iOS 的流程和设计相同的应用开始一个自动化项目。我在 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

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

为每个操作系统分别定义功能和步骤而不是试图将它们融合在一起会更好吗?

感谢您给予我的所有帮助。

【问题讨论】:

    标签: android ios ruby cucumber appium


    【解决方案1】:

    鉴于应用程序之间的共性,共享功能文件是有意义的。管理特定于平台的 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
    

    如下所示,当运行每个配置文件时,会调用相关的特定于平台的步骤定义。

    【讨论】:

    • 这正是我一直在寻找的东西。谢谢。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我不会为不同的操作系统寻找单独的功能文件。您希望您的应用程序在独立于操作系统的情况下以相同的方式运行。如果你有两个,你的特征很可能会发生分歧。

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

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

      【讨论】:

        【解决方案4】:

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

        如果您发现任何这样的情况,您必须根据操作系统分离操作,您可以为其添加检查。如上所示

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

        但您的代码中 95% 应该适用于这两种操作系统

        【讨论】:

          【解决方案5】:

          正如 Thomas 所说,让这一切变得简单的关键是把事情往下推。要做到这一点,您需要应用一个非常严格的简单模式。

          该模式是使每个步骤定义实现对辅助方法的单个调用。进入辅助方法后,您可以使用环境变量、配置或一些条件等技术来选择实现。

          一个例子可以说明这一点。假设这两个应用程序都可以添加朋友。当您第一次添加此功能时,您将有一个类似的步骤

          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
          
          ...
          

          【讨论】:

            【解决方案6】:

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

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

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

            IOS 执行 cmd

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

            Android 执行 cmd

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-01-05
              • 2014-04-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多