【问题标题】:Executing Java Cucumber feature files one by one from bash script and continue execution of feature files after first one has completed从 bash 脚本中逐个执行 Java Cucumber 功能文件,并在第一个完成后继续执行功能文件
【发布时间】:2018-10-09 14:42:31
【问题描述】:

我需要在 MacOS High Sierra 上使用 bash 脚本一个一个地运行一堆 Java 黄瓜功能文件。我遇到的问题是,一旦第一个功能文件执行完毕(成功或失败),Cucumber 框架就会对该功能文件进行报告,而我的脚本不会执行剩余的功能文件。它“返回”到命令行。

这是一个一个运行黄瓜文件的脚本的一部分:

function run_cucumber_features {
  for file in $(find ./src/test  -name '*Steps.feature' -print0 | xargs -0);
    do gradle cucumberTest -Dcucumber.options="$file" DmutationTesting="false" -DmutationParameter="$parameter";
  done
}

例如,假设我执行我的脚本:

./mutation_testing.sh 

脚本然后调用 Cucumber 并执行脚本找到的第一个功能,然后它以该特定功能的状态代码“退出”:

BUILD Success in 18s
7 actionable tasks: 5 executed, 5 succeeded

但是,它不会继续执行下一个功能文件,而是返回到命令行:

username$ 

我的问题是,一旦 Cucumber 在每个已执行的功能文件完成报告后,是否有办法让我的脚本不停止执行?

【问题讨论】:

  • 作为第一个快速检查,将脚本从 ... do gradle ... 修改为 ... do echo gradle ... 以检查 loo 是否找到所有预期的文件。当这返回您期望的内容时,您可能会在脚本开头添加 set -x 以查看 Bash 脚本执行哪些步骤,这可能已经揭示了它在第一次迭代后退出的原因。
  • 谢谢,我添加了“do echo gradle”,并返回了所有预期的文件。
  • 添加“set -x”,表明它一直执行到:do gradle cucumberTest -Dcucumber.options="$file" DmutationTesting="false" -DmutationParameter="$parameter",之后它调用 Cucumber,然后它永远不会返回到脚本。
  • 请看我的回答,因为它是一个评论。您可能会调查自己的 Bash 脚本/Gradle 构建文件或将其发布在此处。最好是发布MCVE 所需的尽可能多的代码。
  • SubOptimal 建议从脚本中删除“set -e”,从而解决了该问题。现在不返回控制,所有功能文件都按预期执行。

标签: java bash cucumber


【解决方案1】:

该错误似乎与您的 build.gradle 文件中的步骤或您在 Bash 脚本中调用该函数的方式有关。

一个小型测试设置。假设如下结构#!/bin/bash

run-gradle-loop.sh                    # executable script
gradle                                # executable script, as simple replacement
src/test/subdir/file2_Steps.feature   # a dummy file
src/test/file1_Steps.feature          # a dummy file

run-gradle-loop.sh

#!/bin/bash

function run_cucumber_features {
  for file in $(find ./src/test  -name '*Steps.feature' -print0 | xargs -0);
  do
    gradle cucumberTest -Dcucumber.options="$file" DmutationTesting="false" -DmutationParameter="$parameter";
    echo "return code = $?"
  done
}

# to run the gradle script in the current directory
export PATH=$(pwd):${PATH}

run_cucumber_features

分级

#!/bin/bash

echo
echo "running gradle dummy"
echo "passed parameters : $@"

# exit with an error code
exit 1

file1_Steps.featurefile2_Steps.feature 是两个空文件,仅用于满足循环条件。

测试的目的是检查gradle 退出并显示错误代码的行为。

运行主 Bash 脚本

./run-gradle-loop.sh

输出

running gradle dummy
passed parameters : cucumberTest -Dcucumber.options=./src/test/subdir/file2_Steps.feature DmutationTesting=false -DmutationParameter=
return code = 1

running gradle dummy
passed parameters : cucumberTest -Dcucumber.options=./src/test/file1_Steps.feature DmutationTesting=false -DmutationParameter=
return code = 1

这表明即使gradle 也会返回错误代码,循环处理所有.*Steps.feature 文件。

编辑在第一个错误后它可能会停止的一种方法可能是在run-gradle-loop.sh 脚本中有一个set -e 语句。

man bash

-e 如果管道(可能包含单个简单命令)、列表或复合命令,则立即退出

这意味着。当脚本gradle 因错误而失败时,控制不会返回给run-gradle-loop.sh。上述设置的输出将是

$ ./run-gradle-loop.sh

running gradle dummy
passed parameters : cucumberTest -Dcucumber.options=./src/test/subdir/file2_Steps.feature DmutationTesting=false -DmutationParameter=

【讨论】:

  • 感谢您的建议,我刚刚从脚本中删除了“set -e”,从而解决了问题。现在不返回控制,所有功能文件都按预期执行。谢谢!
  • PS,我认为“set -e”可能出现在我的脚本中做得很好,因为我从未发布过整个脚本。
  • @kosielr 看来我应该更频繁地使用我的水晶球。 ;-) 很高兴听到您的问题已解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多