语境
我想使用 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 中列的值。
另外(但我不寻求任何解决方案):
关于 CSV的QAF 文档说这
@dataFile:resources/data/logintestdata.csv
相当于Examples: {"dataFile":"resources/data/logintestdata.csv"}
BDD2,但第二个不会触发任何场景,好像没有给出示例一样。关于 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>" !
}
}