如何使用黄瓜标签和JUnit构建顺序测试?

时间:2016-09-05 14:25:47

标签: java junit cucumber cucumber-junit cucumber-java

我有一个梦想,我想与黄瓜一起实现。

我想将黄瓜与硒结合使用(< =到目前为止这么好)并用标签优化测试执行。在我的梦想中,我能够使用代表数据库szenario的Strings标记我的szenarios。例如:

@noData
Scenario: bake a bread

@oneBread
Scenario: look at bread

@tenBreads
Scenario: give multiple breads to the poor

我的一些测试会改变数据,有些则不会。所以我想,如何聚集所有"非改变"测试以并行访问给定数据

@viewOnly
Scenario: look at a bread

@viewOnly
Scenario: smell a bread

通过这种聚类,我的目标是尽可能实现最轻微的设置和并行工作。

@noData
@viewOnly
Scenario: bake a bread
          when i bake a bread
          then i see a bread

@oneBread
@viewOnly
Scenario: look at a bread
          then i see a bread

@oneBread
@viewOnly
Scenario: smell a bread
          then i see a bread

@oneBread
Scenario: slice a bread in half
          when i slice my bread
          then i got two parts of the bread

@oneBread
Scenario: butter a bread
          when i butter my bread
          then i got one bread covered in butter

使用此功能文件,我希望此解决方案将按以下顺序处理功能:

  1. 在数据库中设置Szenario => @noData
  2.   

    @noData =>场景:烤面包

  3. 在数据库中设置Szenario => @oneBread
  4.   

    @oneBread => @viewOnly Scenario看面包

  5.   

    @oneBread => @viewOnly Scenario闻到面包

  6. 在数据库中设置Szenario => @oneBread
  7.   

    @oneBread =>场景将面包切成两半

  8. 在数据库中设置Szenario => @oneBread
  9.   

    @oneBread =>情景黄油面包

  10. 一旦我玩JUnit跑步者并试图自己处理创建的JUnit测试。我是否必须再次编写自己的JUnit跑步者?或者是否可以用Cucumber功能满足我的要求?

    有人可以帮我吗?

2 个答案:

答案 0 :(得分:1)

您可以通过为每个数据库方案运行单独的测试来实现。为此,请使用 - tags 参数,如https://github.com/cucumber/cucumber/wiki/Tags#running-a-subset-of-scenarios

中所述

我更喜欢的另一种方法是将类似的数据库场景放入要素文件中。例如,用于改变数据的那些特征文件。使用@Before获取方案的标签。

@Before
public void beforeTest(Scenario scenario){

}
希望有所帮助!

答案 1 :(得分:1)

您必须设置挂钩,只有在标签匹配时才会运行,并且只能为viewonly数据设置静态标志。对于noData,您可以添加一个类似于onebread标签的功能,即重置标志。 我不清楚oneBread标签,它是否意味着设置一个面包。那多个面包怎么样?猜猜你将不得不修改逻辑。 以下内容适用于您提到的功能文件流程。

private static boolean dbSetupReq = true;

//Only get called if both tags are present
@Before(value={"oneBread","viewOnly"})
public void oneBreadViewOnly() {

     if(dbSetupReq ) {
          addData();
          dbSetupReq = false;
     }
}

//Only get called if oneBread tag is present
@Before(value={"oneBread"})
public void oneBreadViewOnly() {

     dbSetupReq = true;
     addData();
}


public void addData() {
    // Add logic to add data to database
}

你可以尝试这样的事情。有一个通用的Before钩子,它一直运行并将Scenario对象作为参数接收。您可以使用Scenario方法访问getSourceTagNames()上的所有标记,该方法返回标记名的字符串集合。然后,您可以根据存在的标签应用逻辑。也许您可以在Before挂钩上放置一个标签,以便在需要进行数据设置时调用它。

@Before
public void dataSetup(Scenario sce) {

    List<String> tags = sce.getSourceTagNames();  
    //Do your thing with the tag names....   
}