【问题标题】:Terminal execution shows .rb steps before .feature scenario steps终端执行在 .feature 场景步骤之前显示 .rb 步骤
【发布时间】:2022-01-03 13:00:08
【问题描述】:

问题描述

我在使用 Ruby 创建 Cucumber 自动化时遇到了“问题”。我的终端在 .feature 场景步骤之前显示 .rb 步骤,这对于可读性来说真的很烦人。

Information
Ruby: 3.0.3p157
Terminal: Git 2.34.1
Cucumber: 7.1.0

我的功能文件包含:

@home_screen
Feature: Tests for home screen functionality

  @default
  Scenario: Default values on home screen is Foot and Centimeter
    Given I land on the home screen
    Then left unit picker value should be 'Foot'
    And right unit picker value should be 'Centimeter'

  Scenario: Show All button should be enabled at launch
    Given I land on home screen
    Then the Show All button is enabled
    When I press on Clear button
    Then the Show All button is disabled

  @conversions
  Scenario Outline: Verify default conversions
    Given I land on home screen
    When I type <target> to target field
    Then I should should see <result> as the result

      Examples:
      | target | result |
      | 1      | 12     |
      | 2      | 24     |
      | 3      | 36     |
      | 9      | 106    |

我的步骤定义包含:

Given('I land on home screen') do
  puts 'I am at the home screen'
end

Then('left unit picker value should be {string}') do |string|
  puts "left unit picker value is #{string}"
end

And('right unit picker value should be {string}') do |string|
  puts "right unit picker value is #{string}"
end

When('I press on Clear button') do
  puts 'Clear button is pressed'
end

When('I type {int} to target field') do |target|
  puts "Target is: #{target}."
end

Then(/the Show All button is (enabled|disabled)/) do |state|
  state == 'enabled' ? puts('Button is enabled') : puts('Button is disabled')
end

Then('I should should see {int} as the result') do |result|
  puts "Result is: #{result}."
end

一个场景的终端执行

预期输出

感谢您的宝贵时间!

【问题讨论】:

  • 好吧,你的步骤定义是puts,所以你真的告诉打印这些消息,它没有显示步骤,它正在打印你告诉它打印的消息。您还期望这里有什么?
  • 您好,我期待 Given/When/Then 按预期在 put 之前出现。我是红宝石和黄瓜的新手,所以我不确定你的意思,但我想这样输出:鉴于我登陆主屏幕/我在主屏幕我无法格式化评论,但给定的应该在看跌之前来
  • puts 是在屏幕上打印消息的命令,这就是正在发生的事情。您的步骤没有做任何事情 - 根本没有与其中的页面交互。我假设这些 puts 是临时占位符,您通常不会打印到测试的输出
  • 是的,它只是一个用于学习的占位符,但是黄瓜步骤仍然应该首先显示,因为它更符合逻辑,此外,我正在学习的课程显示输出的正确顺序,比如所以:i.stack.imgur.com/fZQKp.png 为了以防万一,我一个字一个字地跟着课程的代码,它们的输出顺序不同
  • 我不会说它更合乎逻辑 - 步骤是否在开始时显示与结束时显示是不同的。我认为后者更合乎逻辑,因为您无法知道该步骤在完成之前是否成功(因此您还不知道如何实际打印它)。教程的问题在于它们没有更新,而软件和库是。现在,只需忽略这一点并专注于更重要的事情,例如实际实施这些步骤或针对/反对黄瓜的原因。

标签: ruby automated-tests cucumber output bdd


【解决方案1】:

将步骤视为断言,而不是消息生成器

在 Cucumber 中,步骤的主体在确定它执行的 Gherkin 语句是否成功之前执行。您遇到的问题是您将该步骤视为直接报告的结果,而不是作为使 Gherkin 语句通过或失败的测试断言。由于您的示例中每个步骤的主体都通过Kernel#puts 创建到 STDOUT 的输出,因此在知道相关 Gherkin 语句的状态之前,该步骤的输出可能会打印到屏幕上。在任何情况下,它都会将步骤中的消息打印到标准输出,因为步骤定义明确告诉它这样做。

与其直接从您的步骤打印结果,不如将步骤视为返回布尔值的断言。 cucumber-ruby documentation 提供了一些有用的例子。如果您认为 Gherkin 语句更像是 RSpec 描述,而 Cucumber 步骤更像是 RSpec 期望而不是状态消息,那么您将在标准输出上获得更合理的结果。

一些一般 BDD 建议

Cucumber 步骤实际上不应该首先将输出直接发送到 STDOUT,因为它会造成混乱(正如您所发现的那样)。而是:

  • 如果您想记录某些内容,请使用Logger module
  • 如果您想打印步骤中的错误或其他信息,请使用 $stderr.puts 并通过 shell 重定向或 Ruby 文件句柄将其定向到终端以外的其他位置。
  • 如果您使用 Cucumber 进行低级测试,请考虑将这些测试(尤其是任何嘈杂的测试)转移到 RSpec 或 MiniTest 单元测试,以免污染您的 Cucumber 测试或输出。

Cucumber 可以通过各种方式被滥用,但它不能替代单元测试或功能测试。与单元测试相比,它确实最适合集成测试和域级可执行文档,但您的应用范围可能会有所不同。

【讨论】:

  • 按“当我做某事时 => 某事发生”的顺序​​对我来说似乎更合乎逻辑,我正在学习的两门课程的输出都是这样,所以它可能是一些本地配置/框架版本,因为这两个课程都已经过时了。我同意记录器的观点,我们在工作中使用一个。但由于我的课程处于初学者水平,他们采用这种方法。这件事与其说是一个实际的问题,倒不如说是一个障碍,所以我只能忍受它,没问题。雅各布斯先生,我很欣赏全面的回应。谢谢!
猜你喜欢
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
  • 2011-04-06
相关资源
最近更新 更多