【问题标题】:cucumber 2.0.0 not compatible with RubyMine 6.x and TeamCity formattercucumber 2.0.0 与 RubyMine 6.x 和 TeamCity 格式化程序不兼容
【发布时间】:2015-09-20 03:25:46
【问题描述】:

我正在尝试在我的自动化测试套件中设置 Cucumber。我目前使用的是 Ruby 2.0,但 Ruby 2.2 也有同样的问题。

我尝试过 Cucumber 2.0.0 和 2.0.0.beta.3。它们似乎都不兼容 Ruby 2.0 或 2.2。

每次我尝试运行我的 .feature 文件之一时,都会收到相同的错误。 Cucumber 声称与任何版本的 Ruby >= 1.9.3 (https://rubygems.org/gems/cucumber) 兼容,但事实并非如此。

有没有其他人看到这个错误?有没有其他人成功地将 Cucumber 2.0.0 与 Ruby 2.0 或 2.2 一起使用?如果是这样,您的 Gemfile 中有哪些 gem,运行 ruby --version 时会显示哪些特定的 ruby​​ 更新/版本?

**如果我恢复到旧版本的 Cucumber(我尝试了 1.3.3),我可以正确运行我的 .feature 文件。但是我正在从头开始构建一个新的测试套件,并想借此机会使用所有可能的 gem 的最新和最好的版本。我不想围绕已弃用的 Cucumber 版本构建我的 Gemfile。

`Cucumber::Ast` no longer exists. These classes have moved into the `Cucumber::Core::Ast` namespace, but may not have the same API. (RuntimeError)
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-2.0.0/lib/cucumber/ast.rb:10:in `const_missing'
C:/Program Files (x86)/JetBrains/RubyMine 6.3/rb/testing/patch/bdd/teamcity/cucumber/common.rb:210:in `scenario_outline?'
C:/Program Files (x86)/JetBrains/RubyMine 6.3/rb/testing/patch/bdd/teamcity/cucumber/common.rb:218:in `tc_before_feature_element'
C:/Program Files (x86)/JetBrains/RubyMine 6.3/rb/testing/patch/bdd/teamcity/cucumber/formatter_03103.rb:98:in `before_feature_element'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-2.0.0/lib/cucumber/formatter/ignore_missing_messages.rb:10:in `method_missing'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-2.0.0/lib/cucumber/formatter/legacy_api/adapter.rb:521:in `before'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-2.0.0/lib/cucumber/formatter/legacy_api/adapter.rb:394:in `switch_to_child'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-2.0.0/lib/cucumber/formatter/legacy_api/adapter.rb:316:in `switch_step_container'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-2.0.0/lib/cucumber/formatter/legacy_api/adapter.rb:242:in `after_test_case'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-2.0.0/lib/cucumber/formatter/legacy_api/adapter.rb:85:in `after_test_case'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-2.0.0/lib/cucumber/formatter/legacy_api/adapter.rb:37:in `after_test_case'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-2.0.0/lib/cucumber/formatter/fanout.rb:16:in `block in method_missing'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-2.0.0/lib/cucumber/formatter/fanout.rb:15:in `each'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-2.0.0/lib/cucumber/formatter/fanout.rb:15:in `method_missing'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-core-1.1.3/lib/cucumber/core/test/runner.rb:18:in `test_case'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-core-1.1.3/lib/cucumber/core/test/case.rb:21:in `describe_to'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-2.0.0/lib/cucumber/filters/prepare_world.rb:11:in `test_case'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-core-1.1.3/lib/cucumber/core/test/case.rb:21:in `describe_to'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-2.0.0/lib/cucumber/filters/apply_around_hooks.rb:8:in `test_case'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-core-1.1.3/lib/cucumber/core/test/case.rb:21:in `describe_to'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-2.0.0/lib/cucumber/filters/apply_after_hooks.rb:5:in `test_case'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-core-1.1.3/lib/cucumber/core/test/case.rb:21:in `describe_to'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-2.0.0/lib/cucumber/filters/apply_before_hooks.rb:5:in `test_case'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-core-1.1.3/lib/cucumber/core/test/case.rb:21:in `describe_to'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-2.0.0/lib/cucumber/filters/apply_after_step_hooks.rb:8:in `test_case'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-core-1.1.3/lib/cucumber/core/test/case.rb:21:in `describe_to'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-2.0.0/lib/cucumber/filters/activate_steps.rb:8:in `test_case'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-core-1.1.3/lib/cucumber/core/test/case.rb:21:in `describe_to'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-2.0.0/lib/cucumber/filters/quit.rb:11:in `test_case'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-core-1.1.3/lib/cucumber/core/test/case.rb:21:in `describe_to'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-core-1.1.3/lib/cucumber/core/test/filters/locations_filter.rb:17:in `block in done'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-core-1.1.3/lib/cucumber/core/test/filters/locations_filter.rb:16:in `each'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-core-1.1.3/lib/cucumber/core/test/filters/locations_filter.rb:16:in `done'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-core-1.1.3/lib/cucumber/core/filter.rb:61:in `done'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-core-1.1.3/lib/cucumber/core/test/filters/tag_filter.rb:18:in `done'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-core-1.1.3/lib/cucumber/core/compiler.rb:23:in `done'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-core-1.1.3/lib/cucumber/core/gherkin/parser.rb:31:in `done'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-core-1.1.3/lib/cucumber/core.rb:29:in `parse'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-core-1.1.3/lib/cucumber/core.rb:18:in `compile'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-2.0.0/lib/cucumber/runtime.rb:70:in `run!'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-2.0.0/lib/cucumber/cli/main.rb:38:in `execute!'
C:/Ruby200/lib/ruby/gems/2.0.0/gems/cucumber-2.0.0/bin/cucumber:9:in `<top (required)>'
C:/Ruby200/bin/cucumber:23:in `load'
C:/Ruby200/bin/cucumber:23:in `<top (required)>'
-e:1:in `load'

**更新:当我通过Windows Shell 运行文件时,它运行成功,没有错误。

【问题讨论】:

  • 这看起来像是 RubyMine 的问题。您可以尝试在终端/PowerShell/cmd 中运行某个功能吗?
  • 当我使用cucumber &lt;feature file&gt; 运行时,我收到一条错误消息,指出步骤未定义,但已定义。它们位于step definitions 目录中,它们应该位于...
  • 功能文件的路径是什么?它是否位于 features 下的子目录中?听起来您需要稍微不同地调用 Cucumber:cucumber -r features features/&lt;path_to_feature_file&gt;
  • 我的功能文件名为android_phone_responsiveness.feature,位于C:\workspace\inside_test_automation\features\scenarios。我的步骤定义位于C:\workspace\inside_test_automation\features\step_definitions
  • 当我运行 cucumber -r features features/C:\workspace\inside_test_automation\features\scenarios\android_phone_responsiveness.feature 时出现错误,我将在我的 OP 中发布堆栈跟踪的屏幕截图。

标签: ruby rubygems cucumber rubymine


【解决方案1】:

症状: 你可以在 cucumber 命令行下运行你的测试,但不能在 RubyMine 下运行它,你得到了错误:

wrong number of arguments (1 for 3..4)
Error creating formatter: Teamcity::Cucumber::Formatter (ArgumentError)
C:/Program Files (x86)/JetBrains/RubyMine 7.0.4/rb/testing/patch/bdd/teamcity/cucumber/formatter_03103.rb:22:in `initialize'

我找到了一个更简单的解决方案: 只需转到 Rubymine -&gt; Run -&gt; Edit Configuration ,转到 Runner 选项,添加 "--format pretty" .这将覆盖不兼容的Teamcity问题并顺利运行。

【讨论】:

  • 谢谢!直接打我。
  • 非常感谢。几个问题的直接答案,节省了我的一天! :-)
【解决方案2】:

看起来@FluffyKittens solution 有效。但是,对我来说问题是 RubyMine 2016。安装 RubyMine 2017 为我解决了这个问题。我猜 RubyMine 2017 和 Cucumber 3.1 之间有关系。

【讨论】:

    【解决方案3】:

    在@Johnson 的帮助下,我查明了问题所在。这是由 TeamCity formatter 引起的,它是每个(或至少版本 6.x 和 7.x)Rubymine 安装的一部分。

    TeamCity 格式化程序有一个名为cucumber 的目录,可以在JetBrains\RubyMine 6.3\rb\testing\patch\bdd\teamcity\cucumber 找到。该目录包含一个名为common.rb 的文件。

    我修改了名为scenario_outline?的方法,在common.rb的第208行找到,位于:
    C:\Program Files (x86)\JetBrains\RubyMine 6.3\rb\testing\patch\bdd\teamcity\cucumber

    我把这个方法的当前定义注释掉了,改写成这样:

    def scenario_outline?(feature_element)
             if defined? ::Cucumber::Core::Ast
               feature_element.class == ::Cucumber::Core::Ast::ScenarioOutline
             else
               feature_element.class == ::Cucumber::Ast::ScenarioOutline
             end
    end
    

    这解决了我的问题,我可以通过 Rubymine 成功运行 Cucumber 测试。

    我认为这里最重要的问题是 TeamCity 格式化程序似乎与 Cucumber 2.0.0 不兼容,因为 ::Cucumber::Ast::ScenarioOutlineAst 模块已放置在 Core 模块中::Cucumber::Core::Ast::ScenarioOutline

    【讨论】:

      猜你喜欢
      • 2018-11-14
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多