Cucumber 如何使用前后记法?

Cucumber 如何使用前后记法?,cucumber,bdd,Cucumber,Bdd,我想在功能文件之前执行以下一些操作 public void beforeFeature() { File path = new File("D:\\AccelareWorkFitComplete\\ExtentsReports\\"); File[] filename =path.listFiles(); for(File fi:filename) { if (fi.toString().contains("Automation"))

我想在功能文件之前执行以下一些操作

public void beforeFeature() {
    File path = new File("D:\\AccelareWorkFitComplete\\ExtentsReports\\");

    File[] filename =path.listFiles();

    for(File fi:filename)
    {
        if (fi.toString().contains("Automation")) 
        {
            fi.delete();
        }
    }
}

之前的
和之后的
钩子用于整个cucumber套件,而不是每个特性

在以前的一些版本中,有
beforefeact
afterFeature
挂钩,但在较新的版本中已被删除

总之,您可以返回几个版本以利用before/after特性功能,也可以在before钩子中创建一个变通方法。

我将使用Background(或
@before
在后台执行)。官方文件是

在步骤定义文件中,我将执行以下操作:

private static boolean testsInitialized = false

@Given("^Given files are deleted;$")
public void deleteFiles() {

if (!testsInitialized) {
    initializetest();
    testInitialized = true;
}
从Cucumber 2.4.0开始,如果您绝对需要Junit@BeforeClass等效类,那么下面的类可以工作

您可以将其放在test/java/cucumber/runtime中

package cucumber.runtime; //cannot change.  can be under /test/java

import cucumber.runtime.io.ResourceLoader;
import cucumber.runtime.snippets.FunctionNameGenerator;
import gherkin.pickles.PickleStep;

import java.util.List;

public class NameThisClassWhatever implements Backend {
    private Glue glue;
    private List<String> gluePaths;

    @Override
    public void loadGlue(Glue glue, List<String> gluePaths) {
        this.glue = glue;
        this.gluePaths = gluePaths;

        //Any before steps here
    }

    @Override
    public void disposeWorld() {
        //any after steps here
    }

    @Override
    public void setUnreportedStepExecutor(UnreportedStepExecutor executor) { }

    @Override
    public void buildWorld() { }

    @Override
    public String getSnippet(PickleStep p, String s, FunctionNameGenerator fng) {
        return null;
    }

    public NameThisClassWhatever(ResourceLoader resourceLoader)  { }
}
package.runtime//不能改变。可以在/test/java下运行
导入cucumber.runtime.io.ResourceLoader;
导入cucumber.runtime.snippets.FunctionNameGenerator;
进口小黄瓜。泡菜。泡菜步骤;
导入java.util.List;
公共类名称ThisClassWhere实现后端{
私人胶水;
私有列表路径;
@凌驾
公共void loadGlue(Glue Glue,列出gluepath){
这个。胶水=胶水;
this.gluepath=gluepath;
//在这里走之前有什么事吗
}
@凌驾
公共无效处置rld(){
//在这里走完几步后还有什么
}
@凌驾
public void setUnreportedStepExecutor(UnreportedStepExecutor执行器){}
@凌驾
public void buildWorld(){}
@凌驾
公共字符串getSnippet(pickle步骤p、字符串s、FunctionNameGenerator fng){
返回null;
}
公共名称ThisClassWhere(ResourceLoader ResourceLoader){}
}

Background
部分本质上是一个
Before
钩子,用于任何特定功能文件中的所有场景,在
Before
钩子之后但在场景执行之前运行-本质上是使您的答案错误。在使用该功能之前,它不会运行一次。以这种格式运行的测试表明了这一点。如果您有一个登录并导航到某个页面的
Background
,它将登录并导航到功能文件中包含的每个
Scenario
。@KyleFairns您完全正确,我想我只记得执行一次Background。用一个布尔检查器更正。
package cucumber.runtime; //cannot change.  can be under /test/java

import cucumber.runtime.io.ResourceLoader;
import cucumber.runtime.snippets.FunctionNameGenerator;
import gherkin.pickles.PickleStep;

import java.util.List;

public class NameThisClassWhatever implements Backend {
    private Glue glue;
    private List<String> gluePaths;

    @Override
    public void loadGlue(Glue glue, List<String> gluePaths) {
        this.glue = glue;
        this.gluePaths = gluePaths;

        //Any before steps here
    }

    @Override
    public void disposeWorld() {
        //any after steps here
    }

    @Override
    public void setUnreportedStepExecutor(UnreportedStepExecutor executor) { }

    @Override
    public void buildWorld() { }

    @Override
    public String getSnippet(PickleStep p, String s, FunctionNameGenerator fng) {
        return null;
    }

    public NameThisClassWhatever(ResourceLoader resourceLoader)  { }
}