0

语境

我想使用 qaf-cucumber 来利用 QAF 功能,同时仍将 Cucumber 与 JUnit 一起使用。主要是,我需要 QAF 的数据提供者功能,允许在 .csv 中外部化场景示例,以便在多个场景和功能中使用它们。

六月:4.12

黄瓜:5.0.0-RC2

QAF : 2.1.15

qaf-cucumber : 2.1.15-beta-3 (最新版本,因为还没有发布)


问题

当使用@dataFile场景上方的 QAF 标签来指定 .csv 的位置时:

  • 正如预期的那样,我得到了 INFO 跟踪“c.qmetry.qaf.automation.util.CSVUtil - 加载 csv 数据文件:src/test/resources/data/testdata.csv”。

  • 正如预期的那样,该场景的执行次数与 .csv 中示例的行数一样多。

  • 在这些步骤中,类似<column1>或的引用${column1}被视为字符串,而不是引用 .csv 中列的值

另外(但我不寻求任何解决方案):

  1. 关于 CSV的QAF 文档说这@dataFile:resources/data/logintestdata.csv相当于Examples: {"dataFile":"resources/data/logintestdata.csv"}BDD2,但第二个不会触发任何场景,好像没有给出示例一样。

  2. 关于 BDD2 语法的QAF 文档说Scenario在使用 QAF 标签时应该使用Gherkin 关键字@dataFile。尽管如此,这样做会给出下面的堆栈跟踪。相反,Scenario Outline必须使用关键字。

java.lang.NullPointerException
    at java.util.Collections$UnmodifiableCollection.<init>(Collections.java:1026)
    at java.util.Collections$UnmodifiableList.<init>(Collections.java:1302)
    at java.util.Collections.unmodifiableList(Collections.java:1287)
    at gherkin.ast.ScenarioOutline.<init>(ScenarioOutline.java:13)
    at com.qmetry.qaf.automation.cucumber.Bdd2Compiler.compile(Unknown Source)
    at io.cucumber.core.feature.FeatureParser.compilePickles(FeatureParser.java:59)
    at io.cucumber.core.feature.FeatureParser.parseResource(FeatureParser.java:37)
    at io.cucumber.core.runtime.FeaturePathFeatureSupplier.lambda$new$0(FeaturePathFeatureSupplier.java:39)
    at java.util.function.BiFunction.lambda$andThen$0(BiFunction.java:70)
    at io.cucumber.core.resource.ResourceScanner.lambda$null$2(ResourceScanner.java:128)
    at io.cucumber.core.resource.PathScanner$ResourceFileVisitor.visitFile(PathScanner.java:67)
    at io.cucumber.core.resource.PathScanner$ResourceFileVisitor.visitFile(PathScanner.java:52)
    at java.nio.file.Files.walkFileTree(Files.java:2670)
    at java.nio.file.Files.walkFileTree(Files.java:2742)
    at io.cucumber.core.resource.PathScanner.findResourcesForPath(PathScanner.java:46)
    at io.cucumber.core.resource.PathScanner.findResourcesForUri(PathScanner.java:26)
    at io.cucumber.core.resource.ResourceScanner.findResourcesForUri(ResourceScanner.java:111)
    at io.cucumber.core.resource.ResourceScanner.scanForResourcesUri(ResourceScanner.java:88)
    at io.cucumber.core.runtime.FeaturePathFeatureSupplier.loadFeatures(FeaturePathFeatureSupplier.java:62)
    at io.cucumber.core.runtime.FeaturePathFeatureSupplier.get(FeaturePathFeatureSupplier.java:46)
    at io.cucumber.junit.Cucumber.<init>(Cucumber.java:138)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
    at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:49)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

例子

黄瓜赛跑者在src/java/com

@RunWith(Cucumber.class)
@CucumberOptions(
        features = "src/test/resources/features",
        glue = "com.steps",
        plugin = {"com.qmetry.qaf.automation.cucumber.QAFCucumberPlugin", "pretty"})
public class RunCucumber {
}

特色在src/test/resources/features

Feature: Cucumber scenario with QAF data provider

  @dataFile:src/test/resources/data/testdata.csv
  Scenario Outline: Test
     Given my scenario works with the examples "<column1>" and "<column2>"

测试数据.csv 在src/test/resources/data

#col.seperator=|
column1|column2
example1_column1|example1_column2
example2_column1|example2_column2

踩在src/test/java/com/steps

public class TestSteps {

    @Given("my scenario works with the examples {string} and {string}")
    public void myScenarioWorks(String value1, String value2) {
         // value1 equals "<column1>" and value2 equals "<column2>" !
    }
}
4

1 回答 1

1

我尝试使用 2.1.15,它对我有用。我也得到了 qaf-cucumber 2.1.15-beta-3 的上述行为,但是当更新到 qaf-cucumber 2.1.15 时它运行良好。

于 2019-12-06T07:30:13.143 回答