最常问的 Cucumber 面试题

2025年3月17日 | 阅读 12 分钟

以下是最常问的 Cucumber 面试题列表及其最佳答案。

1) 什么是 Cucumber?它有什么用途?

Cucumber 是一个基于行为驱动开发(BDD)框架的测试工具。它用于运行以纯文本编写的功能性测试,并为软件功能开发测试用例。它在自动化测试中起着支持作用。

换句话说,我们可以说“Cucumber 是测试人员用来开发测试用例以测试软件行为的软件工具。”


2) Cucumber 软件是用什么语言编写的?

Cucumber 软件是用 Ruby 编程语言编写的。


3) 行为驱动开发(BDD)框架的主要目标是什么?

行为驱动开发框架的主要目标是让各种项目角色,如业务分析师、质量保证、开发人员等,在不深入技术细节的情况下理解应用程序。


4) Cucumber 工具使用什么语言?

Cucumber 工具使用 Gherkin 语言,这是一种简单描述应用程序行为的英语。Gherkin 语言使用多种关键字来描述应用程序的行为,如 Feature、Scenario、Scenario Outline、Given、When、Then 等。


5) 执行 Cucumber 测试场景需要哪两个文件?

执行 Cucumber 测试场景需要以下两个文件:

  • 特点
  • Step Definition(步骤定义)

6) 您如何理解 Feature 文件?

Feature 文件用于提供待测应用程序(AUT)的高级描述。Feature 文件的第一行必须以关键字 'Feature' 开头,后跟待测应用程序的描述。一个 Feature 文件可以在同一个文件中包含多个场景,并且 Feature 文件的扩展名必须是“.feature”。


7) 在编写 Cucumber 场景时,可以使用哪些关键字?

以下是用于在 Cucumber 工具中编写场景的关键字:

  • 给定
  • 何时
  • 那么

8) Cucumber 中 Background 关键字的作用是什么?

在 Cucumber 工具中,Background 关键字用于将多个 Given 语句分组。当 Feature 文件中的每个场景都重复使用相同的 Given 语句集时,通常会使用此关键字。


9) Cucumber 工具中 Scenario Outline 的用途是什么?

在 Cucumber 中,Scenario Outline 用作场景的参数。当同一个场景需要针对多组数据执行,但测试步骤保持不变时,就会使用它。Scenario Outline 后面必须跟 'Examples' 关键字,该关键字指定每个参数的值集。


10) 您如何理解 Cucumber 中的 Step Definition(步骤定义)?

在 Cucumber 中,Step Definition 是 Feature 文件中提到的功能的实际代码实现。


11) Cucumber 支持哪些编程语言?

Cucumber 工具支持多种编程语言,如 Java、.Net、Ruby 等。您还可以轻松地将其与多种工具集成,如 Selenium、Capybara 等。


12) Jbehave 和 Cucumber 有什么区别?

尽管 Cucumber 和 Jbehave 的设计目的相同,但它们最显著的区别在于 Jbehave 基于 stories(故事),而 Cucumber 基于 features(功能)。


13) 您如何理解正则表达式?

正则表达式是一种用于描述特定文本模式的模式。最基本的正则表达式包含一个单独的文字字符。


14) 运行 Cucumber Web 测试用例使用什么软件?

运行 Cucumber Web 测试用例使用以下软件:

  • Cucumber
  • Ruby 及其开发环境
  • IDE,如 ActiveState
  • Watir(用于模拟浏览器)
  • Ansicon 和 RSpec(如果需要)

15) Cucumber 框架最显著的优点是什么?

以下是 Cucumber 框架的优点列表,这些优点使 Cucumber 成为当今企业界快速发展的敏捷方法学的理想选择:

  • Cucumber 是一个开源且免费使用的工具。
  • 它易于使用。由于其纯文本表示,即使是非技术用户也能理解场景。
  • 它弥合了业务分析师、开发人员和质量保证人员等各种项目利益相关者之间的沟通鸿沟。
  • 使用 Cucumber 工具,我们可以开发更易于维护和理解的自动化测试用例。
  • 它易于与 Selenium 和 Capybara 等其他工具集成。

16) 您如何理解 Cucumber 中的 Test Harness(测试平台)?

在 Cucumber 中,Test Harness 允许将设置上下文和与浏览器交互的职责与清理步骤定义文件分开。它收集 stub、driver 和其他支持工具,这些工具是自动化测试执行所必需的。


17) RSpec 和 Cucumber 有什么区别?我们应该何时使用 RSpec,何时使用 Cucumber?

RSpec 和 Cucumber 都是测试框架的示例。RSpec 使用传统的单元测试。这意味着它会单独测试应用程序的一个类或部分。因此,您的模型可以正常工作,控制器可以正常工作,依此类推。RSpec 和 Cucumber 都用于验收测试,也称为 ATDD、BDD 等。

RSpec 和 Cucumber 之间的区别

  • RSpec 和 Cucumber 之间的主要区别在于业务可读性因素。
  • RSpec 主要用于单元测试。另一方面,Cucumber 主要用于行为驱动开发。我们也可以将其用于系统和集成测试。
  • 在 Cucumber 中,规范或功能与测试代码是分开的,因此产品所有者可以在不查看代码的情况下提供或审查规范。这些就是我们在 Cucumber 中创建的 .feature 文件。
  • RSpec 也有类似的机制,但它不是用 Describe 或 Context 来描述一个步骤,而是使用业务规范来执行该语句。这种方法对于开发人员来说稍微容易一些,但对于非技术人员来说则有点困难。

我们应该使用哪个?

  • 对于核心开发人员来说,使用 RSpec 是最佳选择。技术人员更容易理解,并且在保持事物范围和可控性方面具有一些优势,因为您不必为了测试步骤而处理正则表达式。
  • 如果您正在为客户构建,则应选择 Cucumber 进行验收测试,并选择 RSpec 进行单元测试。

18) 什么是 Selenium?

Selenium 是一个 Web 浏览器自动化工具,广泛用于 Web 应用程序的功能测试。Selenium 支持多种编程语言,如 Java、Python、Ruby、C# 等。


19) Selenium 和 Cucumber 有什么区别?

Selenium 和 Cucumber 都是开源测试工具,都用于功能测试。但它们之间存在一些区别。

以下是 Selenium 和 Cucumber 之间的一些关键区别:

  • Selenium 是 Web 应用程序的 Web 浏览器自动化工具,而 Cucumber 是用于行为驱动开发的自动化工具,可以与 Selenium(或 Appium)一起使用。
  • Selenium 用于自动化 UI 测试,而 Cucumber 用于验收测试。
  • Selenium 更受技术团队(SDET/程序员)的青睐,而 Cucumber 通常更受非技术团队(业务利益相关者和测试人员)的青睐。
  • Selenium 可以独立于 Cucumber 工作。Cucumber 依赖 Selenium 或 Appium 来实现步骤定义。
  • 在 Selenium 中,脚本创建复杂,而 Cucumber 比 Selenium 简单。

20) 为什么我们必须将 Cucumber 与 Selenium 一起使用?

Cucumber 和 Selenium 都是测试框架和流行技术。许多组织使用 Selenium 进行功能测试。这些组织将 Cucumber 与 Selenium 集成,因为 Cucumber 使得阅读和理解应用程序流程变得容易。使用 Cucumber 与 Selenium 的最显著好处是,它有助于开发人员轻松地在由经理、非技术利益相关者和业务分析师易于理解的简单 Feature 文件中编写测试用例。它提供了使用一种人类可读的语言 Gherkin 编写测试的功能。Selenium-Cucumber 框架支持 Java、.NET、PHP、Python、Perl 等编程语言。


21) 您如何理解 Step Definition(步骤定义)?

Step Definition 用于将 Feature 文件中的测试用例步骤映射到代码。它在待测应用程序上执行步骤并检查结果。要执行 Step Definition,它必须与 Feature 文件中的给定组件匹配。


22) Feature 文件中最多可以包含多少个场景?

在 Cucumber 中,一个 Feature 文件最多可以包含 10 个场景。这个数字可能因项目和组织而异。限制 Feature 文件中包含的场景数量是最佳实践。


23) 行为驱动开发(BDD)方法在现实世界中的目的是什么?

行为驱动开发或 BDD 是一种用于以简单的纯文本表示理解应用程序功能的方法。行为驱动开发框架的主要目的是让各种项目角色,如业务分析师、质量保证、开发人员、支持团队,在不深入技术细节的情况下理解应用程序。


24) 您如何理解 TDD,TDD 中使用了哪些不同的流程?

TDD 是 Test-Driven Development 的缩写。这是一种软件开发技术,用于首先创建测试用例,然后编写这些测试用例的底层代码。尽管 TDD 是一种开发技术,但它也可用于自动化测试开发。TDD 开发耗时较长,因为它倾向于找到很少的缺陷。TDD 开发技术所提供的结果提高了代码质量,使其更具可重用性和灵活性。TDD 还有助于开发人员实现约 90-100% 的高测试覆盖率。遵循 TDD 的开发人员唯一的缺点是必须在编写代码之前编写自己的测试用例。

以下是 TDD 方法使用的简单 6 步流程列表:

  1. 首先,编写测试用例: 您需要根据需求编写自动化测试用例。
  2. 运行所有测试用例: 现在,在当前开发的软件上运行这些自动化测试用例。
  3. 为该测试用例开发代码:在此过程中,您必须编写代码以使该测试用例在失败时按预期工作。
  4. 再次运行测试用例:现在,您必须重新运行测试用例,并检查是否已实现迄今为止开发的所有测试用例。
  5. 重构您的代码:这是一个可选步骤。但是,建议重构您的代码以使其更具可读性和可重用性。因此,这是必不可少的。
  6. 为新测试用例重复步骤 1-5:这是最后一步。在这里,您必须为其他测试用例重复此周期,直到所有测试用例都已实现。

25) BDD 和 TDD 有哪些相似之处?

TDD 代表 Test-Driven Development,BDD 代表 Behavior Driven Development。两者都是软件开发技术。

BDD 和 TDD 都非常相似,因为它们都是软件应用程序的测试策略。在两种情况下,开发人员都必须在编写代码以通过测试之前编写测试。它们之间的第二个主要相似之处在于,在两种情况下,测试都可以用作自动化测试框架的一部分,以防止错误。


26) TDD 和 BDD 的主要区别是什么?

以下是 TDD 和 BDD 之间的主要区别列表:

TDDBDD
TDD 代表 Test-Driven Development。它是一个以测试为中心的开发过程。这意味着开发人员必须首先编写测试用例,然后编写代码。BDD 代表 Behavior Driven Development。它是一个以行为为中心的开发过程。
在 TDD 中,编写一个测试会失败,因为指定的功能不存在,然后编写最简单的代码来使测试通过,然后重构以消除重复等。在 BDD 中,创建一个可执行的规范,由于功能不存在而失败,然后编写最简单的代码来使规范通过。您会重复此过程,直到发布候选版本准备好发货为止。
TDD 测试使用 Java、.Net、Python、Ruby 等编程语言编写。BDD 测试使用 Given-When-Then 步骤以人类可读的格式编写。这些测试也对非技术人员具有可读性和可理解性。
TDD 测试由于是用特定的编程语言编写的,因此非程序员难以阅读。BDD 测试由于是以人类可读的格式编写的,因此非程序员也可以阅读。
TDD 和 BDD 之间的关键区别在于范围。TDD 是一种开发实践。另一方面,BDD 是一种团队方法。
在 TDD 中,开发人员编写测试用例。在 BDD 中,用户或测试人员创建可执行的规范,然后开发人员将其与被测代码关联。

27) 您如何理解 Cucumber Dry Run(空运行)?

Cucumber Dry Run 用于编译 Cucumber Feature 文件和 Step Definitions。它用于查找任何编译错误。如果找到任何错误,它会在使用 Dry Run 时显示。


28) 您如何理解 Cucumber 测试方法中的 TestRunner 类?举例说明。

在 Cucumber 测试方法中,TestRunner 类提供了 Feature 文件和 Step Definition 文件之间的链接。TestRunner 类通常是一个空类,没有类定义。

Cucumber 中 TestRunner 类的示例


29) 我们应该在 TestRunner 类中编写代码吗?

建议不要在 TestRunner 类中编写代码。它应该包含 @RunWith 和 @CucumberOptions 标签。


30) Feature 文件的执行起点是什么?

当 Cucumber 与 Selenium 集成时,执行的起点必须是 TestRunner 类。


31) 如何使用 Cucumber 框架中的 Options 标签?

在 Cucumber 框架中,Options 标签是 TestRunner 文件的一部分,以 @CucumberOptions 注释的形式出现。它包含两个参数:feature 和 glue。

  • Feature 参数: feature 参数用于指定 Feature 文件的路径。
  • Glue 参数: glue 参数用于指定 Step Definition 文件的路径。

查看带 Option 标签的 TestRunner 文件的代码实现

我们必须导入 org.junit.runner.RunWith 以使用 @RunWith 注释,并导入 cucumber.api.CucumberOptions 以使用 @CucumberOptions 注释。


32) Cucumber Options 标签下的 features 属性有什么用?

在 Cucumber 框架中,features 属性用于识别 Feature 文件的位置。


33) Cucumber Options 标签下的 glue 属性有什么用?

Glue 属性用于帮助 Cucumber 框架识别 Step Definition 文件的位置。


34) 可以与 Cucumber 集成的两个构建管理工具有哪些?

可以与 Cucumber 集成的两个构建管理工具如下:

  • Gradle
  • Maven

35) Cucumber 框架中 Hooks(钩子)的用途是什么?

在 Cucumber 框架中,Hooks 用于控制程序流并优化代码行。通过 @Before 和 @After 注释,可以运行带有 Hooks 标签的代码块,在场景之前或之后执行。

某些场景可能需要执行某些先决条件,例如启动应用程序、建立数据库连接、配置测试数据等。此外,还应执行某些后置条件,例如终止数据库连接、关闭浏览器、刷新测试数据、应用程序登出等。所有这些条件都通过 Hooks 在 Cucumber 中处理。@Before Hook 在实际场景之前执行,@After Hook 在实际场景之后执行,即使与实际场景相对应的测试失败。

对于 @Before 注释,我们必须导入 cucumber.api.java.en.Before,对于 @After 注释,我们必须导入 cucumber.api.java.en.After。

查看带 Hooks 的代码实现

Feature 文件:在此 Feature 文件中,我们包含了两个场景。

Feature: 发票生成。

Scenario 1: 验证发票是否以 PDF 格式生成。

Given 用户导航到发票页面。

Then 用户应能够以 PDF 格式打开发票。

Scenario 2: 验证发票字段。

Given 用户打开发票。

Then 用户应能在发票中看到付款金额。

查看 Step Definition 文件

在上面的示例中,您可以看到我们使用了两个场景,通过 @Before 注释的测试方法先决条件和通过 @After 注释的测试方法后置条件。