无法为场景步骤创建黄瓜表达式

Posted

技术标签:

【中文标题】无法为场景步骤创建黄瓜表达式【英文标题】:Could not create a cucumber expression for scenario step 【发布时间】:2021-12-28 10:45:47 【问题描述】:

我遇到了一个问题,我的自定义黄瓜配置在同一个测试项目中工作,但在其他测试项目中不能作为依赖项

CustomTypeRegistry 类:

public class CustomTypeRegistry 

    @ParameterType("customEx\\([0-9]+\\)")
    public Integer custom(String original) 
        return new Random().nextInt();
    

Java 粘合步骤:

@When("generate custom for test")
public void testStep(int randomNumber) 
    System.out.println(randomNumber);

场景步骤:

When generate customEx(5) for test

当我在存在黄瓜配置的同一个项目中创建测试时,这非常有效。

当我将项目打包到 jar 并将其作为依赖项添加到另一个测试项目时,它会识别该步骤,但在运行时出现错误:

17-11-2021 14:15:55.592 [main] 错误 io.cucumber.core.runtime.Runtime.log - 异常时 执行泡菜 java.util.concurrent.ExecutionException:io.cucumber.core.exception.CucumberException:可以 不为“为测试生成 custom”创建黄瓜表达式。 看来您没有注册参数类型。 在 java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122) 在 java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191) 在 io.cucumber.core.runtime.Runtime.run(Runtime.java:93) 在 io.cucumber.core.cli.Main.run(Main.java:92) 在 io.cucumber.core.cli.Main.main(Main.java:34) 引起:io.cucumber.core.exception.CucumberException:无法创建黄瓜 “为测试生成 custom”的表达式。 看来您没有注册参数类型。 在 io.cucumber.core.stepexpression.StepExpressionFactory.registerTypeInConfiguration(StepExpressionFactory.java:101) 在 io.cucumber.core.stepexpression.StepExpressionFactory.crateExpression(StepExpressionFactory.java:95) 在 io.cucumber.core.stepexpression.StepExpressionFactory.createExpression(StepExpressionFactory.java:61) 在 io.cucumber.core.stepexpression.StepExpressionFactory.createExpression(StepExpressionFactory.java:49) 在 io.cucumber.core.runner.CachingGlue.lambda$prepareGlue$3(CachingGlue.java:244) 在 java.base/java.util.ArrayList.forEach(ArrayList.java:1540) 在 io.cucumber.core.runner.CachingGlue.prepareGlue(CachingGlue.java:243) 在 io.cucumber.core.runner.Runner.runPickle(Runner.java:68) 在 io.cucumber.core.runtime.Runtime.lambda$execute$5(Runtime.java:110) 在 io.cucumber.core.runtime.CucumberExecutionContext.runTestCase(CucumberExecutionContext.java:117) 在 io.cucumber.core.runtime.Runtime.lambda$execute$6(Runtime.java:110) 在 java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) 在 java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) 在 io.cucumber.core.runtime.Runtime$SameThreadExecutorService.execute(Runtime.java:233) 在 java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:118) 在 io.cucumber.core.runtime.Runtime.lambda$run$2(Runtime.java:86) 在 java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195) 在 java.base/java.util.stream.SliceOps$1$1.accept(SliceOps.java:199) 在 java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1631) 在 java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:127) 在 java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:502) 在 java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:488) 在 java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) 在 java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) 在 java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) 在 java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578) 在 io.cucumber.core.runtime.Runtime.run(Runtime.java:87) ...省略了2个常用框架 引起:io.cucumber.cucumberexpressions.UndefinedParameterTypeException:未定义的参数类型custom。请为 custom 注册一个 ParameterType。 在 io.cucumber.cucumberexpressions.CucumberExpression.processParameters(CucumberExpression.java:103) 在 io.cucumber.cucumberexpressions.CucumberExpression.(CucumberExpression.java:35) 在 io.cucumber.cucumberexpressions.ExpressionFactory.createExpression(ExpressionFactory.java:34) 在 io.cucumber.core.stepexpression.StepExpressionFactory.crateExpression(StepExpressionFactory.java:88)

黄瓜版本: 6.8.1

构建工具:Maven

什么可能导致问题?

【问题讨论】:

【参考方案1】:

您可以观察到这种行为的可能原因是有一种叫做“胶水路径”的东西,它基本上是 Cucumber 查找代码的包(包括自定义参数定义)。

默认情况下,黄瓜使用胶水路径作为包含您的跑步者类的包。因此,我假设当您在原始项目中使用代码时,该条件已满足。

但是当您创建一个库并将其用作另一个项目中的依赖项时,Cucumber 不再看到它,因为条件不再满足。

您需要像黄瓜文档中提到的那样手动指定粘合路径

默认情况下,Cucumber-JVM 会在 runner 类的包(或子包)中进行搜索。您还可以明确告诉 Cucumber-JVM 要搜索哪些包(和子包):

 @CucumberOptions(glue = "<package>", "<package>", "<etc>")
 public class RunCucumberTest

【讨论】:

以上是关于无法为场景步骤创建黄瓜表达式的主要内容,如果未能解决你的问题,请参考以下文章

在黄瓜测试中切换功能标志值

黄瓜不会根据大纲场景找到我的步骤

如何在每个场景之后执行拆除以释放资源在使用黄瓜的宁静BDD中

我如何刻意说黄瓜跳过当前场景中的其余步骤(java)

自动运行黄瓜表

黄瓜特征文件不识别步骤