避免使用箭头函数
ES6 箭头函数 () => {}
将 this
绑定到当前上下文,这会阻止在钩子和步骤定义之间共享状态。
Cucumber 可用于基于 Gherkin 功能文件中描述的场景实现自动化测试。
在 步骤定义 中给出的示例中,Cucumber 从步骤中提取文本 48
,将其转换为 int
,并将其作为参数传递给 方法函数块函数函数。
在 方法函数块函数函数 中的参数数量必须与表达式中的 捕获组 捕获组 捕获组 输出参数 输出参数 数量相匹配。(如果数量不匹配,Cucumber 将抛出错误)。
来自 Gherkin 的数据表可以通过将 DataTable 对象作为步骤定义中的最后一个参数来访问。 此转换可以通过 Cucumber 或手动完成。
根据表形作为以下集合之一:根据表形作为以下集合之一:List<List<String>> table
List<Map<String, String>> table
Map<String, String> table
Map<String, List<String>> table
Map<String, Map<String, String>> table
将 List<String>
List<String>
java.util.List[String]
字符串列表字符串列表 传递给步骤定义的最简单方法是使用数据表
Given the following animals:
| cow |
| horse |
| sheep |
将参数声明为 List<String>
List<String>
java.util.List[String]
字符串列表字符串列表,但在表达式中不要定义任何 捕获组 捕获组 捕获组 输出参数 输出参数 。
带注释的方法风格
@Given("the following animals:")
public void the_following_animals(List<String> animals) {
}
带注释的方法风格
@Given("the following animals:")
fun the_following_animals(animals: List<String>) {
}
Given("the following animals:") { animals: java.util.List[String] =>
}
在这种情况下,DataTable
会被 Cucumber 自动扁平化为 List<String>
List<String>
java.util.List[String]
字符串数组字符串数组(使用 DataTable.asList(String.class)
),然后调用步骤定义。
注意:除了 String、Integer、Float、BigInteger 和 BigDecimal 集合之外,还支持 Byte、Short、Long 和 Double。
注意:除了 String、Integer、Float、BigInteger 和 BigDecimal 集合之外,还支持 Byte、Short、Long 和 Double。
注意:目前,Cucumber Scala 不支持使用 Scala 集合类型。
查看 Github
此外,请查看 cucumber-jvm 数据表
此外,请查看 cucumber-jvm 数据表
步骤类似于方法调用或函数调用。
例如
Given I have 93 cucumbers in my belly
在此步骤中,您正在使用一个参数(值 93
)“调用”上述步骤定义。
步骤在您的 features/\*.feature
*.feature
*.feature
*.feature
*.feature
文件中声明。
Regexp
进行匹配。请记住,步骤定义以 介词 或 副词(Given
、When
、Then
、And
、But
)开头。
所有步骤定义在 Cucumber 开始执行功能文件中的纯文本之前加载(并定义)。
一旦执行开始,对于每个步骤,Cucumber 将查找具有匹配 Regexp
的已注册步骤定义。 如果找到,它将执行它,并将 Regexp
中的所有 捕获组 捕获组 捕获组 输出参数 输出参数 和变量作为参数传递给 方法函数块函数函数。
在 Cucumber 注册或查找步骤定义时,使用的具体介词/副词没有意义。
此外,请查看 多行步骤参数,以获取有关如何将整个表或更大的字符串传递给步骤定义的更多信息。
每个步骤可以具有以下结果之一
当 Cucumber 找到匹配的步骤定义时,它将执行它。 如果步骤定义中的块没有引发错误,则该步骤将被标记为成功(绿色)。 从步骤定义中 return
的任何内容都没有任何意义。
当 Cucumber 找不到匹配的步骤定义时,该步骤将被标记为未定义(黄色),并且该场景中的所有后续步骤都会被跳过。
当步骤定义的 方法函数块函数函数 调用 pending
方法函数块函数函数 时,该步骤将被标记为待定(黄色,与 undefined
一样),表明您还有工作要做。
当步骤定义的 方法函数块函数函数 被执行并引发错误时,该步骤将被标记为失败(红色)。 从步骤定义中返回的内容没有任何意义。
返回 nil
null
null
null
null
或 false
不会导致步骤定义失败。
在 undefined
、pending
或 failed
步骤之后的步骤永远不会执行,即使存在匹配的步骤定义。 这些步骤被标记为跳过(青色)。
Cucumber 需要步骤定义是唯一的,以便知道要执行什么。如果你使用了模棱两可的步骤定义,Cucumber 将会抛出一个 Cucumber::Ambiguous
错误, Cucumber 将会抛出一个 AmbiguousStepDefinitionsException
错误,Cucumber 将会抛出一个 AmbiguousStepDefinitionsException
错误,Cucumber 将会抛出一个 AmbiguousStepDefinitionsException
错误, 步骤/场景将得到一个“Ambiguous”结果, 告诉你修复模糊性。
钩子是在 Cucumber 执行周期中的不同点运行的代码块。它们通常用于在每个场景之前和之后设置和拆除环境。
钩子定义的位置不会影响它对哪些场景或步骤生效。如果你想要更细粒度的控制,可以使用 条件钩子.
你可以在任何类中声明钩子。
你可以在任何类中声明钩子。
你可以在任何类、特征或对象中声明钩子。
你可以在 features/support/env.rb
文件中声明钩子,或在 features/support
目录下的任何其他文件(例如,在名为 support/hooks.rb
的文件中)。
你可以在 features/support/env.js
文件中声明钩子,或在 features/support
目录下的任何其他文件(例如,在名为 features/support/hooks.js
的文件中)。
场景钩子对每个场景都运行。
Before
钩子在每个场景的第一个步骤之前运行。
带注释的方法风格
@Before
public void doSomethingBefore() {
}
Lambda 样式
Before(() -> {
});
Lambda 样式
Before { scenario: Scenario ->
// doSomething
}
Before { scenario: Scenario =>
// doSomething
}
// Import the Before function
const { Before } = require('@cucumber/cucumber')
Before(async function () {
})
Before do
# Do something before each scenario
end
如果你需要,可以为钩子指定一个明确的顺序。
如果你需要,可以为钩子指定一个明确的顺序。
如果你需要,可以为钩子指定一个明确的顺序。
带注释的方法风格
@Before(order = 10)
public void doSomething(){
// Do something before each scenario
}
Lambda 样式
Before(10, () -> {
// Do something before each scenario
});
Before(10) { scenario: Scenario ->
// Do something before each scenario
}
package io.cucumber.example
import io.cucumber.java.AfterAll
import io.cucumber.java.BeforeAll
@BeforeAll
fun beforeAll() {
println("before all")
}
@AfterAll
fun afterAll() {
println("after all")
}
Before(10) { scenario: Scenario =>
// Do something before each scenario
}
Before
钩子按它们声明的相同顺序运行。
Before
钩子按它们声明的相同顺序运行。
After
钩子在每个场景的最后一个步骤之后运行,即使步骤结果是 failed
、undefined
、pending
或 skipped
。
带注释的方法风格
@After
public void doSomethingAfter(Scenario scenario){
// Do something after after scenario
}
Lambda 样式
After((Scenario scenario) -> {
});
Lambda 样式
After { scenario: Scenario ->
// doSomething
}
After { scenario: Scenario =>
// doSomething
}
After(async function (scenario) {
})
After do |scenario|
end
scenario
参数是可选的。如果你使用它,你可以检查场景的状态。
例如,你可以使用 WebDriverWebDriverWebDriverWebDriverCapybara 为失败的场景拍摄截图,并将它们嵌入 Cucumber 的报告中。
查看 浏览器自动化页面 以获取关于如何执行此操作的示例。
以下是一个示例,其中我们在第一次失败时退出(在某些情况下可能有用,例如 持续集成,其中快速反馈很重要)。
After do |s|
# Tell Cucumber to quit after this scenario is done - if it failed.
Cucumber.wants_to_quit = true if s.failed?
end
Around
钩子将“围绕”场景运行。这可以用来将场景的执行包装在一个块中。Around
钩子接收一个 Scenario
对象和一个块 (Proc
) 对象。当你调用 block.call
时,场景将被执行。
以下示例将导致标记为 @fast
的场景在执行时间超过 0.5 秒时失败
Around('@fast') do |scenario, block|
Timeout.timeout(0.5) do
block.call
end
end
Around
钩子。Around
钩子。Around
钩子。Around
钩子。步骤钩子在步骤之前和之后被调用。钩子具有“调用周围”语义,这意味着如果执行了 BeforeStep
钩子,那么无论步骤的结果如何,AfterStep
钩子也会被执行。如果一个步骤没有通过,那么接下来的步骤及其钩子将被跳过。
步骤钩子在步骤之前和之后被调用。钩子具有“调用周围”语义,这意味着如果执行了 BeforeStep
钩子,那么无论步骤的结果如何,AfterStep
钩子也会被执行。如果一个步骤没有通过,那么接下来的步骤及其钩子将被跳过。
步骤钩子在步骤之前和之后被调用。钩子具有“调用周围”语义,这意味着如果执行了 BeforeStep
钩子,那么无论步骤的结果如何,AfterStep
钩子也会被执行。如果一个步骤没有通过,那么接下来的步骤及其钩子将被跳过。
步骤钩子在步骤之前和之后被调用。钩子具有“调用周围”语义,这意味着如果执行了 BeforeStep
钩子,那么无论步骤的结果如何,AfterStep
钩子也会被执行。如果一个步骤没有通过,那么接下来的步骤及其钩子将被跳过。
BeforeStep
钩子。
带注释的方法风格
@BeforeStep
public void doSomethingBeforeStep(Scenario scenario){
}
Lambda 样式
BeforeStep((Scenario scenario) -> {
});
Lambda 样式
BeforeStep { scenario: Scenario ->
// doSomething
}
BeforeStep { scenario: Scenario =>
// doSomething
}
BeforeStep(async function({pickle, pickleStep, gherkinDocument, testCaseStartedId, testStepId}) {
// doSomething
})
BeforeStep({tags: "@foo"}, async function() {
// apply this hook to only specific scenarios
})
AfterStep do |scenario|
end
带注释的方法风格
@AfterStep
public void doSomethingAfterStep(Scenario scenario){
}
Lambda 样式
AfterStep((Scenario scenario) -> {
});
Lambda 样式
AfterStep { scenario: Scenario ->
// doSomething
}
AfterStep { scenario: Scenario =>
// doSomething
}
AfterStep(async function({pickle, pickleStep, gherkinDocument, result, testCaseStartedId, testStepId}) {
// doSomething
})
可以根据场景的标签有条件地选择钩子以供执行。要仅针对某些场景运行特定的钩子,可以将 Before
或 After
Before
或 After
Before
或 After
Before
或 After
Before
、After
、Around
或 AfterStep
钩子与 标签表达式 关联。
带注释的方法风格
@After("@browser and not @headless")
public void doSomethingAfter(Scenario scenario){
}
Lambda 样式
After("@browser and not @headless", (Scenario scenario) -> {
});
Lambda 样式
After (arrayOf("@browser and not @headless")) { scenario: Scenario ->
driver.quit()
}
After("@browser and not @headless") { scenario: Scenario =>
}
Before({tags: '@browser and not @headless'}, async function () {
})
Before('@browser and not @headless') do
end
查看有关 标签 的更多文档。
全局钩子在任何场景运行之前或所有场景运行之后运行一次。
将代码放在 env.rb
文件(或 features/support
目录下的任何其他文件)中的顶层。
BeforeAll
在任何场景运行之前运行。
BeforeAll do
# Do something before any scenario is executed
end
const { BeforeAll } = require('@cucumber/cucumber');
BeforeAll(async function () {
// perform some shared setup
});
带注释的方法风格
@BeforeAll
public static void beforeAll() {
// Runs before all scenarios
}
BeforeAll {
// doSomething
}
BeforeAll {
// doSomething
}
AfterAll
在所有场景执行完毕后运行。
AfterAll do
# Do something after all scenarios have been executed
end
const { AfterAll } = require('@cucumber/cucumber');
AfterAll(async function () {
// perform some shared setup
});
带注释的方法风格
@AfterAll
public static void afterAll() {
// Runs after all scenarios
}
AfterAll {
// doSomething
}
AfterAll {
// doSomething
}
你还可以提供一个 InstallPlugin
钩子,它将在 Cucumber 配置完成之后运行。你提供的块将传递给 Cucumber 的配置(Cucumber::Cli::Configuration
的实例),以及一些 Cucumber 内部结构的包装器,作为注册表。
InstallPlugin do |config, registry|
puts "Features dwell in #{config.feature_dirs}"
end
此钩子将仅运行一次:在加载支持后,以及在加载任何功能之前。
你可以使用此钩子来扩展 Cucumber。例如,你可以影响功能的加载方式,或以编程方式注册自定义格式化程序。
cucumber-wire 是如何使用 InstallPlugin 以及 Cucumber 插件可以做什么的很好的例子。
Cucumber-JVM 不支持 InstallPlugin
钩子。Cucumber-JVM 不支持 InstallPlugin
钩子。Cucumber-JVM 不支持 InstallPlugin
钩子。 Cucumber.js 不支持 InstallPlugin
钩子。
AfterConfiguration
已被弃用,取而代之的是根据你的需要使用 BeforeAll
和 InstallPlugin
。
标签是组织你的功能和场景的好方法。
它们可以用于两个目的
考虑以下示例
@billing
Feature: Verify billing
@important
Scenario: Missing product description
Given hello
Scenario: Several products
Given hello
一个功能或场景可以拥有任意数量的标签。用空格隔开它们
@billing @bicker @annoy
Feature: Verify billing
标签可以放在以下 Gherkin 元素之上
Feature
Scenario
Scenario Outline
Examples
在 Scenario Outline
中,你可以在不同的示例上使用标签,如下所示
Scenario Outline: Steps will run conditionally if tagged
Given user is logged in
When user clicks <link>
Then user will be logged out
@mobile
Examples:
| link |
| logout link on mobile |
@desktop
Examples:
| link |
| logout link on desktop |
不能将标签放在 Background
或步骤 (Given
、When
、Then
、And
和 But
) 之上。
标签由子元素继承。
放在 Feature
上的标签将被 Scenario
、Scenario Outline
或 Examples
继承。
放在 Scenario Outline
上的标签将被 Examples
继承。
你可以告诉 Cucumber 只运行带有特定标签的场景
对于 JUnit 5,请查看 cucumber-junit-platform-engine 文档
对于使用 JVM 系统属性的 JUnit 4 和 TestNG
mvn test -Dcucumber.filter.tags="@smoke and @fast"
或者环境变量
# Linux / OS X:
CUCUMBER_FILTER_TAGS="@smoke and @fast" mvn test
# Windows:
set CUCUMBER_FILTER_TAGS="@smoke and @fast"
mvn test
或者更改你的 JUnit 4/TestNG 运行器类
对于 JUnit 5,请查看 cucumber-junit-platform-engine 文档
对于使用 JVM 系统属性的 JUnit 4 和 TestNG
mvn test -Dcucumber.filter.tags="@smoke and @fast"
或者环境变量
# Linux / OS X:
CUCUMBER_FILTER_TAGS="@smoke and @fast" mvn test
# Windows:
set CUCUMBER_FILTER_TAGS="@smoke and @fast"
mvn test
或者更改你的 JUnit 4/TestNG 运行器类
对于 JUnit 5,请查看 cucumber-junit-platform-engine 文档
对于使用 JVM 系统属性的 JUnit 4 和 TestNG
mvn test -Dcucumber.filter.tags="@smoke and @fast"
或者环境变量
# Linux / OS X:
CUCUMBER_FILTER_TAGS="@smoke and @fast" mvn test
# Windows:
set CUCUMBER_FILTER_TAGS="@smoke and @fast"
mvn test
或者更改你的 JUnit 4/TestNG 运行器类
@CucumberOptions(tags = "@smoke and @fast")
public class RunCucumberTest {}
@CucumberOptions(tags = "@smoke and @fast")
class RunCucumberTest
@CucumberOptions(tags = "@smoke and @fast")
class RunCucumberTest {}
# You can omit the quotes if the expression is a single tag
./node_modules/.bin/cucumber.js --tags "@smoke and @fast"
# You can omit the quotes if the expression is a single tag
cucumber --tags "@smoke and @fast"
你可以告诉 Cucumber 忽略带有特定标签的场景
使用 JUnit 运行器类
使用 JUnit 运行器类
使用 JUnit 运行器类
@CucumberOptions(tags = "not @smoke")
public class RunCucumberTest {}
@CucumberOptions(tags = "not @smoke")
class RunCucumberTest
@CucumberOptions(tags = "not @smoke")
class RunCucumberTest {}
# You can omit the quotes if the expression is a single tag
./node_modules/.bin/cucumber.js --tags "not @smoke"
# You can omit the quotes if the expression is a single tag
cucumber --tags "not @smoke"
标签表达式是一个中缀布尔表达式。以下是一些示例
表达式 | 描述 |
---|---|
@fast |
标记为 @fast 的场景 |
@wip and not @slow |
标记为 @wip 但没有标记为 @slow 的场景 |
@smoke and @fast |
同时标记为 @smoke 和 @fast 的场景 |
@gui or @database |
标记为 @gui 或 @database 的场景 |
为了更高级的标签表达式,你可以使用括号来提高清晰度,或者更改运算符优先级
(@smoke or @ui) and (not @slow)
在使用标签进行文档方面,你的想象力是唯一的限制。
标签可以引用外部系统中的 ID,例如需求管理工具、问题跟踪器或测试管理工具。
@BJ-x98.77 @BJ-z12.33
Feature: Convert transaction
您可以使用自定义的 Cucumber 报告插件,将标签转换为指向您外部工具中的文档的链接。
另一种使用标签的创造性方法是跟踪某个功能在开发流程中的位置。
@qa_ready
Feature: Index projects
在分布式环境中,Cucumber-Rails 会构建一个 Rake 任务来识别 @wip
标签。但是,任何字符串都可以用作标签,任何场景或整个功能都可以关联多个标签。
分布式 config/cucumber.yml
中的默认配置文件包含以下几行代码
<%
. . .
std_opts = "--format #{ENV['CUCUMBER_FORMAT'] || 'progress'} --strict --tags ~@wip"
%>
default: <%= std_opts %> features
. . .
注意尾部的选项 --tags ~@wip
。Cucumber 通过在 --tags
参数前面加上波浪号 (~
) 来否定标签。这告诉 Cucumber 不要处理带有此标签的功能和场景。如果您没有指定不同的配置文件 (cucumber -p profilename
),则将使用默认配置文件。如果使用默认配置文件,则 --tags ~@wip
将导致 Cucumber 跳过具有此标签的任何场景。这将覆盖在命令行中传递的 --tags=@authen
选项,因此您将看到以下内容
$ cucumber --tags=@authent
Using the default profile...
0 scenarios
0 steps
0m0.000s
从 0.6.0 版本开始,您无法通过在命令行的 Cucumber 参数列表中添加 --tags=@wip
来克服此默认设置,因为现在所有 --tags
选项都被 AND 运算符组合在一起。因此,--tags @wip
AND --tags ~@wip
的组合在任何地方都无法正常工作。
您必须在 config/cucumber.yml
中创建一个特殊配置文件来处理这种情况,或者更改默认配置文件以满足您的需求。
@wip
标签是一个特殊情况。如果任何标记为 @wip
的场景都通过了其所有步骤而没有错误,并且还传递了 --wip
选项,则 Cucumber 会将运行报告为失败(因为标记为进行中的场景不应该通过!)。
还要注意,--strict
和 --wip
选项是互斥的。
可以在您的功能中出现的特定标签的数量可以通过在传递给 --tags
选项的标签名称末尾追加冒号,然后追加数字来控制,例如
$ cucumber --tags=@wip:3 features/log\*
如果在特定 Cucumber 运行期间执行的所有功能中,该标签出现的次数超过指定的次数,则会生成警告消息。如果还传递了 --strict
选项(就像默认配置文件一样),则运行将失败,而不是生成警告。
限制出现的次数通常与 @wip
标签一起使用,以将未指定场景的数量限制在可管理的范围内。遵循 看板 或 精益软件开发 方法论的人会发现这很有用。
Cucumber 是一个 Java 库,具有针对不同工具和平台的扩展。它通过运行 JUnit 4、JUnit 5、您的构建工具、您的 IDE 或 CLI 来启动。
Cucumber 是一个 Java 库,具有针对不同工具和平台的扩展。它通过运行 JUnit 4、JUnit 5、您的构建工具、您的 IDE 或 CLI 来启动。
Cucumber 是一个 Java 库,具有针对不同工具和平台的扩展。它通过运行 JUnit 4、JUnit 5、您的构建工具、您的 IDE 或 CLI 来启动。
Cucumber 是一个命令行工具。它通过从命令行运行 cucumber-js
或构建脚本启动。
Cucumber 是一个命令行工具。它通过从命令行运行 cucumber
或构建脚本启动。
可以 配置 Cucumber 如何运行功能。
最常见的选项是从命令行运行 Cucumber。默认情况下,Cucumber 会将根库目录下以 .rb
结尾的任何文件视为步骤定义文件。因此,包含在 features/models/entities/step_definitions/anything.rb
中的步骤可以在包含在 features/views/entity_new
中的功能文件中使用,前提是
./features
,在本例中) 上调用 Cucumber;或者最常见的选项是从命令行运行 Cucumber。默认情况下,Cucumber 会将根库目录下以 .js
结尾的任何文件视为步骤定义文件。因此,包含在 features/models/entities/step-definitions/anything.js
中的步骤可以在功能文件中使用,前提是
./features
,在本例中) 上调用 Cucumber;或者以下命令将运行 authenticate_user
功能。features/
目录子目录中的任何功能都必须 require
功能。
cucumber --require features features/authentication/authenticate_user.feature
请注意,如果传递了 --require
选项,则仅在该目录树中搜索步骤定义匹配项。如果需要包含来自没有方便的根目录的目录的步骤定义,可以多次指定 --require
选项。
否则,要运行所有功能
cucumber
命令行界面运行器 (CLI 运行器) 是一个可执行的 Java 类,可以从命令行运行。
java io.cucumber.core.cli.Main
请注意,您需要将 cucumber-core
jar 及其所有传递依赖项添加到您的类路径中,以及您的编译 .class 文件的位置。您可以在 Maven 中央仓库 中找到这些 jar 包。
您还需要通过 --glue
选项,后面跟其包名,以及功能文件(s)的文件路径,向 CLI 提供您的步骤定义。
例如
java -cp "path/to/each/jar:path/to/compiled/.class/files" io.cucumber.core.cli.Main /path/to/your/feature/files --glue hellocucumber --glue anotherpackage
或者,如果您使用的是 Maven 项目,则可以使用 Exec Maven 插件运行 CLI
mvn exec:java \
-Dexec.classpathScope=test \
-Dexec.mainClass=io.cucumber.core.cli.Main \
-Dexec.args="/path/to/your/feature/files --glue hellocucumber --glue anotherpackage"
命令行界面运行器 (CLI 运行器) 是一个可执行的 Java 类,可以从命令行运行。
java io.cucumber.core.cli.Main
请注意,您需要将 cucumber-core
jar 及其所有传递依赖项添加到您的类路径中,以及您的编译 .class 文件的位置。您可以在 Maven 中央仓库 中找到这些 jar 包。
您还需要通过 --glue
选项,后面跟其包名,以及功能文件(s)的文件路径,向 CLI 提供您的步骤定义。
例如
java -cp "path/to/each/jar:path/to/compiled/.class/files" io.cucumber.core.cli.Main /path/to/your/feature/files --glue hellocucumber --glue anotherpackage
或者,如果您使用的是 Maven 项目,则可以使用 Exec Maven 插件运行 CLI
mvn exec:java \
-Dexec.classpathScope=test \
-Dexec.mainClass=io.cucumber.core.cli.Main \
-Dexec.args="/path/to/your/feature/files --glue hellocucumber --glue anotherpackage"
命令行界面运行器 (CLI 运行器) 是一个可执行的 Java 类,可以从命令行运行。
java io.cucumber.core.cli.Main
请注意,您需要将 cucumber-core
jar 及其所有传递依赖项添加到您的类路径中,以及您的编译 .class 文件的位置。您可以在 Maven 中央仓库 中找到这些 jar 包。
您还需要通过 --glue
选项,后面跟其包名,以及功能文件(s)的文件路径,向 CLI 提供您的步骤定义。
例如
java -cp "path/to/each/jar:path/to/compiled/.class/files" io.cucumber.core.cli.Main /path/to/your/feature/files --glue hellocucumber --glue anotherpackage
或者,如果您使用的是 Maven 项目,则可以使用 Exec Maven 插件运行 CLI
mvn exec:java \
-Dexec.classpathScope=test \
-Dexec.mainClass=io.cucumber.core.cli.Main \
-Dexec.args="/path/to/your/feature/files --glue hellocucumber --glue anotherpackage"
Cucumber.js 包含一个可执行文件来运行功能。在项目中安装 Cucumber 后,您可以使用以下命令运行它
$ ./node_modules/.bin/cucumber.js
可执行文件也被别名为 cucumber-js
和 cucumberjs
。
有关更多信息,请参阅 cucumber-junit-platform-engine 文档。
有关更多信息,请参阅 cucumber-junit-platform-engine 文档。
有关更多信息,请参阅 cucumber-junit-platform-engine 文档。
Ruby 无法通过 JUnit 5 运行。
Javascript 无法通过 JUnit 5 运行。
要使用 JUnit 执行 cucumber 场景,请将 cucumber-junit
依赖项添加到您的 pom 中。
<dependencies>
[...]
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-junit</artifactId>
<version>${cucumber.version}</version>
<scope>test</scope>
</dependency>
[...]
</dependencies>
请注意,cucumber-junit
基于 JUnit 4。如果您使用的是 JUnit 5,请使用 cucumber-junit-platform-engine 或包含 junit-vintage-engine
依赖项。有关更多信息,请参阅 JUnit 5 文档
创建一个使用 Cucumber JUnit 运行器的空类。
package com.example;
import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
import org.junit.runner.RunWith;
@RunWith(Cucumber.class)
@CucumberOptions()
public class RunCucumberTest {
}
package com.example
import io.cucumber.junit.Cucumber
import io.cucumber.junit.CucumberOptions
import org.junit.runner.RunWith
@RunWith(Cucumber::class)
@CucumberOptions()
class RunCucumberTest {
}
package com.example
import io.cucumber.junit.Cucumber
import io.cucumber.junit.CucumberOptions
import org.junit.runner.RunWith
@RunWith(classOf[Cucumber])
@CucumberOptions()
class RunCucumberTest {
}
默认情况下,这将执行与运行器相同包中的所有场景,粘合代码也被认为在同一个包中。
@CucumberOptions
可用于为运行器提供 其他配置。
使用插件
例如,如果您想告诉 Cucumber 使用 pretty
和 html
这两个格式化程序插件,可以这样指定
要使用 JUnit 执行 cucumber 场景,请将 cucumber-junit
依赖项添加到您的 pom 中。
<dependencies>
[...]
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-junit</artifactId>
<version>${cucumber.version}</version>
<scope>test</scope>
</dependency>
[...]
</dependencies>
请注意,cucumber-junit
基于 JUnit 4。如果您使用的是 JUnit 5,请使用 cucumber-junit-platform-engine 或包含 junit-vintage-engine
依赖项。有关更多信息,请参阅 JUnit 5 文档
创建一个使用 Cucumber JUnit 运行器的空类。
package com.example;
import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
import org.junit.runner.RunWith;
@RunWith(Cucumber.class)
@CucumberOptions()
public class RunCucumberTest {
}
package com.example
import io.cucumber.junit.Cucumber
import io.cucumber.junit.CucumberOptions
import org.junit.runner.RunWith
@RunWith(Cucumber::class)
@CucumberOptions()
class RunCucumberTest {
}
package com.example
import io.cucumber.junit.Cucumber
import io.cucumber.junit.CucumberOptions
import org.junit.runner.RunWith
@RunWith(classOf[Cucumber])
@CucumberOptions()
class RunCucumberTest {
}
默认情况下,这将执行与运行器相同包中的所有场景,粘合代码也被认为在同一个包中。
@CucumberOptions
可用于为运行器提供 其他配置。
使用插件
例如,如果您想告诉 Cucumber 使用 pretty
和 html
这两个格式化程序插件,可以这样指定
要使用 JUnit 执行 cucumber 场景,请将 cucumber-junit
依赖项添加到您的 pom 中。
<dependencies>
[...]
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-junit</artifactId>
<version>${cucumber.version}</version>
<scope>test</scope>
</dependency>
[...]
</dependencies>
请注意,cucumber-junit
基于 JUnit 4。如果您使用的是 JUnit 5,请使用 cucumber-junit-platform-engine 或包含 junit-vintage-engine
依赖项。有关更多信息,请参阅 JUnit 5 文档
创建一个使用 Cucumber JUnit 运行器的空类。
package com.example;
import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
import org.junit.runner.RunWith;
@RunWith(Cucumber.class)
@CucumberOptions()
public class RunCucumberTest {
}
package com.example
import io.cucumber.junit.Cucumber
import io.cucumber.junit.CucumberOptions
import org.junit.runner.RunWith
@RunWith(Cucumber::class)
@CucumberOptions()
class RunCucumberTest {
}
package com.example
import io.cucumber.junit.Cucumber
import io.cucumber.junit.CucumberOptions
import org.junit.runner.RunWith
@RunWith(classOf[Cucumber])
@CucumberOptions()
class RunCucumberTest {
}
默认情况下,这将执行与运行器相同包中的所有场景,粘合代码也被认为在同一个包中。
@CucumberOptions
可用于为运行器提供 其他配置。
使用插件
例如,如果您想告诉 Cucumber 使用 pretty
和 html
这两个格式化程序插件,可以这样指定
package com.example;
import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
import org.junit.runner.RunWith;
@RunWith(Cucumber.class)
@CucumberOptions(plugin = {"pretty", "html:target/cucumber.html"})
public class RunCucumberTest {
}
package com.example
import io.cucumber.junit.Cucumber
import io.cucumber.junit.CucumberOptions
import org.junit.runner.RunWith
@RunWith(Cucumber.class)
@CucumberOptions(plugin = {"pretty", "html:target/cucumber.html"})
class RunCucumberTest
package com.example;
import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
import org.junit.runner.RunWith;
@RunWith(classOf[Cucumber])
@CucumberOptions(plugin = Seq("pretty", "html:target/cucumber.html"))
class RunCucumberTest {
}
例如,如果您想告诉 Cucumber 打印缺少步骤定义的代码片段,可以使用 summary
插件,可以这样指定
例如,如果您想告诉 Cucumber 打印缺少步骤定义的代码片段,可以使用 summary
插件,可以这样指定
例如,如果您想告诉 Cucumber 打印缺少步骤定义的代码片段,可以使用 summary
插件,可以这样指定
package com.example;
import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
import org.junit.runner.RunWith;
@RunWith(Cucumber.class)
@CucumberOptions(plugin = {"pretty", "summary"}, snippets = SnippetType.CAMELCASE)
public class RunCucumberTest {
}
package com.example
import io.cucumber.junit.Cucumber
import io.cucumber.junit.CucumberOptions
import org.junit.runner.RunWith
@RunWith(Cucumber.class)
@CucumberOptions(plugin = {"pretty", "summary"}, snippets = CAMELCASE)
class RunCucumberTest
package com.example;
import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
import org.junit.runner.RunWith;
@RunWith(classOf[Cucumber])
@CucumberOptions(plugin = Seq("pretty", "summary"), snippets = CAMELCASE)
class RunCucumberTest {
}
snippets
的默认选项是 UNDERSCORE
。此设置可用于指定 Cucumber 创建代码片段的方式。
执行干运行
例如,如果您想检查所有功能文件步骤是否都有相应的步骤定义,可以这样指定
snippets
的默认选项是 UNDERSCORE
。此设置可用于指定 Cucumber 创建代码片段的方式。
执行干运行
例如,如果您想检查所有功能文件步骤是否都有相应的步骤定义,可以这样指定
snippets
的默认选项是 UNDERSCORE
。此设置可用于指定 Cucumber 创建代码片段的方式。
执行干运行
例如,如果您想检查所有功能文件步骤是否都有相应的步骤定义,可以这样指定
package com.example;
import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
import org.junit.runner.RunWith;
@RunWith(Cucumber.class)
@CucumberOptions(dryRun=true)
public class RunCucumberTest {
}
package com.example
import io.cucumber.junit.Cucumber
import io.cucumber.junit.CucumberOptions
import org.junit.runner.RunWith
@RunWith(Cucumber.class)
@CucumberOptions(dryRun=true)
class RunCucumberTest
package com.example;
import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
import org.junit.runner.RunWith;
@RunWith(classOf[Cucumber])
@CucumberOptions(dryRun=true)
class RunCucumberTest {
}
dryRun
的默认选项是 false
。
格式化控制台输出
例如,如果您希望 Cucumber 的控制台输出以可读的格式显示,可以这样指定
dryRun
的默认选项是 false
。
格式化控制台输出
例如,如果您希望 Cucumber 的控制台输出以可读的格式显示,可以这样指定
dryRun
的默认选项是 false
。
格式化控制台输出
例如,如果您希望 Cucumber 的控制台输出以可读的格式显示,可以这样指定
package com.example;
import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
import org.junit.runner.RunWith;
@RunWith(Cucumber.class)
@CucumberOptions(monochrome=true)
public class RunCucumberTest {
}
package com.example
import io.cucumber.junit.Cucumber
import io.cucumber.junit.CucumberOptions
import org.junit.runner.RunWith
@RunWith(Cucumber.class)
@CucumberOptions(monochrome=true)
class RunCucumberTest
package com.example;
import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
import org.junit.runner.RunWith;
@RunWith(classOf[Cucumber])
@CucumberOptions(monochrome=true)
class RunCucumberTest {
}
monochrome
的默认选项是 false
。
使用标签选择场景
例如,如果您想告诉 Cucumber 只运行使用特定标签指定的场景,可以这样指定
monochrome
的默认选项是 false
。
使用标签选择场景
例如,如果您想告诉 Cucumber 只运行使用特定标签指定的场景,可以这样指定
monochrome
的默认选项是 false
。
使用标签选择场景
例如,如果您想告诉 Cucumber 只运行使用特定标签指定的场景,可以这样指定
package com.example;
import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
import org.junit.runner.RunWith;
@RunWith(Cucumber.class)
@CucumberOptions(tags = "@foo and not @bar")
public class RunCucumberTest {
}
package com.example
import io.cucumber.junit.Cucumber
import io.cucumber.junit.CucumberOptions
import org.junit.runner.RunWith
@RunWith(Cucumber.class)
@CucumberOptions(tags = "@foo and not @bar")
class RunCucumberTest
package com.example;
import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
import org.junit.runner.RunWith;
@RunWith(classOf[Cucumber])
@CucumberOptions(tags = Seq("@foo and not @bar"))
public class RunCucumberTest {
}
指定对象工厂
例如,如果您将 Cucumber 与 DI 框架一起使用,并且想要使用自定义对象工厂,可以这样指定
指定对象工厂
例如,如果您将 Cucumber 与 DI 框架一起使用,并且想要使用自定义对象工厂,可以这样指定
指定对象工厂
例如,如果您将 Cucumber 与 DI 框架一起使用,并且想要使用自定义对象工厂,可以这样指定
package com.example;
import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
import org.junit.runner.RunWith;
@RunWith(Cucumber.class)
@CucumberOptions(objectFactory = FooFactory.class)
public class RunCucumberTest {
}
package com.example
import io.cucumber.junit.Cucumber
import io.cucumber.junit.CucumberOptions
import org.junit.runner.RunWith
@RunWith(Cucumber.class)
@CucumberOptions(objectFactory = FooFactory.class)
class RunCucumberTest
package com.example;
import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
import org.junit.runner.RunWith;
@RunWith(classOf[Cucumber])
@CucumberOptions(objectFactory = FooFactory.class)
public class RunCucumberTest {
}
objectFactory
的默认选项是使用默认对象工厂。有关使用自定义对象工厂的更多信息,请参阅 此处
@CucumberOptions
注解中还有其他可用选项。
通常,测试类将为空。但是,您可以指定几个 JUnit 规则。
Cucumber 运行器就像 JUnit 测试套件一样。因此,可以预期其他 JUnit 功能(例如类别、自定义 JUnit 监听器和报告器)都能正常工作。
有关 JUnit 的更多信息,请参阅 JUnit 网站
objectFactory
的默认选项是使用默认对象工厂。有关使用自定义对象工厂的更多信息,请参阅 此处
@CucumberOptions
注解中还有其他可用选项。
通常,测试类将为空。但是,您可以指定几个 JUnit 规则。
Cucumber 运行器就像 JUnit 测试套件一样。因此,可以预期其他 JUnit 功能(例如类别、自定义 JUnit 监听器和报告器)都能正常工作。
有关 JUnit 的更多信息,请参阅 JUnit 网站
objectFactory
的默认选项是使用默认对象工厂。有关使用自定义对象工厂的更多信息,请参阅 此处
@CucumberOptions
注解中还有其他可用选项。
通常,测试类将为空。但是,您可以指定几个 JUnit 规则。
Cucumber 运行器就像 JUnit 测试套件一样。因此,可以预期其他 JUnit 功能(例如类别、自定义 JUnit 监听器和报告器)都能正常工作。
有关 JUnit 的更多信息,请参阅 JUnit 网站
Ruby 无法通过 JUnit 运行。
Javascript 无法通过 JUnit 运行。
Cucumber 提供了多个选项,可以传递到命令行。
例如
要运行 authenticate_user
功能第 44 行定义的场景,将其格式化为 HTML,并将其管道传输到 features.html
文件以在浏览器中查看
cucumber features/authenticate_user.feature:44 --format html > features.html
要运行名为 "Failed login"
的场景(s)
cucumber features --name "Failed login"
您可以列出您正在使用的 Cucumber 版本可用的选项。
假设您已将 Cucumber 作为 gem 安装,请在命令提示符下运行此命令以查看运行功能的选项
cucumber --help
传递 --help
选项以打印出所有可用的配置选项
java io.cucumber.core.cli.Main --help
传递 --help
选项以打印出所有可用的配置选项
java io.cucumber.core.cli.Main --help
传递 --help
选项以打印出所有可用的配置选项
java io.cucumber.core.cli.Main --help
使用 cucumber-js --help
命令查看可以传递给可执行文件的参数。
您也可以使用 标签 指定要运行的内容。
Cucumber 将按照优先级顺序从系统属性、环境变量和 cucumber.properties
文件中解析属性。
请注意,@CucumberOptions
提供的选项优先于属性文件,而 CLI 参数优先于所有选项。
请注意,cucumber-junit-platform-engine
由 Junit Platform 而不是 Cucumber 提供属性。有关更多信息,请参阅 junit-platform-engine 配置选项。
例如,如果您使用的是 Maven,并且想要运行用 @smoke
标签标记的一组场景
mvn test -Dcucumber.filter.tags="@smoke"
支持的属性如下
cucumber.ansi-colors.disabled= # true or false. default: false
cucumber.execution.dry-run= # true or false. default: false
cucumber.execution.limit= # number of scenarios to execute (CLI only).
cucumber.execution.order= # lexical, reverse, random or random:[seed] (CLI only). default: lexical
cucumber.execution.wip= # true or false. default: false.
cucumber.features= # comma separated paths to feature files. example: path/to/example.feature, path/to/other.feature
cucumber.filter.name= # regex. example: .*Hello.*
cucumber.filter.tags= # tag expression. example: @smoke and not @slow
cucumber.glue= # comma separated package names. example: com.example.glue
cucumber.plugin= # comma separated plugin strings. example: pretty, json:path/to/report.json
cucumber.object-factory= # object factory class name. example: com.example.MyObjectFactory
cucumber.snippet-type= # underscore or camelcase. default: underscore
请注意,过滤器选项 cucumber.filter.name
和 cucumber.filter.tags
使用 and
运算符组合在一起。换句话说,两个表达式都需要匹配。
Cucumber 将按照优先级顺序从系统属性、环境变量和 cucumber.properties
文件中解析属性。
请注意,@CucumberOptions
提供的选项优先于属性文件,而 CLI 参数优先于所有选项。
请注意,cucumber-junit-platform-engine
由 Junit Platform 而不是 Cucumber 提供属性。有关更多信息,请参阅 junit-platform-engine 配置选项。
例如,如果您使用的是 Maven,并且想要运行用 @smoke
标签标记的一组场景
mvn test -Dcucumber.filter.tags="@smoke"
支持的属性如下
cucumber.ansi-colors.disabled= # true or false. default: false
cucumber.execution.dry-run= # true or false. default: false
cucumber.execution.limit= # number of scenarios to execute (CLI only).
cucumber.execution.order= # lexical, reverse, random or random:[seed] (CLI only). default: lexical
cucumber.execution.wip= # true or false. default: false.
cucumber.features= # comma separated paths to feature files. example: path/to/example.feature, path/to/other.feature
cucumber.filter.name= # regex. example: .*Hello.*
cucumber.filter.tags= # tag expression. example: @smoke and not @slow
cucumber.glue= # comma separated package names. example: com.example.glue
cucumber.plugin= # comma separated plugin strings. example: pretty, json:path/to/report.json
cucumber.object-factory= # object factory class name. example: com.example.MyObjectFactory
cucumber.snippet-type= # underscore or camelcase. default: underscore
请注意,过滤器选项 cucumber.filter.name
和 cucumber.filter.tags
使用 and
运算符组合在一起。换句话说,两个表达式都需要匹配。
Cucumber 将按照优先级顺序从系统属性、环境变量和 cucumber.properties
文件中解析属性。
请注意,@CucumberOptions
提供的选项优先于属性文件,而 CLI 参数优先于所有选项。
请注意,cucumber-junit-platform-engine
由 Junit Platform 而不是 Cucumber 提供属性。有关更多信息,请参阅 junit-platform-engine 配置选项。
例如,如果您使用的是 Maven,并且想要运行用 @smoke
标签标记的一组场景
mvn test -Dcucumber.filter.tags="@smoke"
支持的属性如下
cucumber.ansi-colors.disabled= # true or false. default: false
cucumber.execution.dry-run= # true or false. default: false
cucumber.execution.limit= # number of scenarios to execute (CLI only).
cucumber.execution.order= # lexical, reverse, random or random:[seed] (CLI only). default: lexical
cucumber.execution.wip= # true or false. default: false.
cucumber.features= # comma separated paths to feature files. example: path/to/example.feature, path/to/other.feature
cucumber.filter.name= # regex. example: .*Hello.*
cucumber.filter.tags= # tag expression. example: @smoke and not @slow
cucumber.glue= # comma separated package names. example: com.example.glue
cucumber.plugin= # comma separated plugin strings. example: pretty, json:path/to/report.json
cucumber.object-factory= # object factory class name. example: com.example.MyObjectFactory
cucumber.snippet-type= # underscore or camelcase. default: underscore
请注意,过滤器选项 cucumber.filter.name
和 cucumber.filter.tags
使用 and
运算符组合在一起。换句话说,两个表达式都需要匹配。
您也可以在 cucumber.yml
文件中定义常见的命令行选项。
有关如何配置选项的更多信息,请查看 GitHub 上的 cucumber-js 文档
您可以帮助我们改进此文档。编辑此页面.