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

How to structure sequential test with cucumber tags and JUnit?

我有一个梦想,我想用 Cucumber 来实现。

我想将 Cucumber 与 selenium 结合使用(<= 到目前为止还不错)并使用标签优化测试执行。在我的梦中,我能够用代表数据库场景的字符串标记我的场景。例如:

@noData
Scenario: bake a bread

@oneBread
Scenario: look at bread

@tenBreads
Scenario: give multiple breads to the poor

我的一些测试改变了数据,有些则没有。所以我想,如何将所有 "non-altering" 测试聚类以并行访问给定数据

@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 => Scenario: bake a bread

  3. 在数据库中设置 Szenario => @oneBread
  4. @oneBread => @viewOnly Scenario look at a bread

  5. @oneBread => @viewOnly Scenario smell a bread

  6. 在数据库中设置 Szenario => @oneBread
  7. @oneBread => Scenario slice a bread in half

  8. 在数据库中设置 Szenario => @oneBread
  9. @oneBread => Scenario butter a bread

有一次我玩过 JUnit runners 并尝试自己处理创建的 JUnit 测试。我是否必须再次编写自己的 JUnit 运行程序?或者是否可以使用 Cucumber 功能来满足我的要求?

有人可以帮我吗?

您可以通过 运行 对每个数据库场景进行单独测试来做到这一点。为此,请使用 --tags 参数,如此处所述 https://github.com/cucumber/cucumber/wiki/Tags#running-a-subset-of-scenarios

我更喜欢的另一种方法是将类似的数据库场景放入功能文件中。例如,那些如何更改数据的功能文件。使用@Before 获取场景的标签。

@Before
public void beforeTest(Scenario scenario){

}

希望对您有所帮助!

您必须设置 Before 挂钩,只有 运行 如果标签匹配,以及 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 挂钩,它始终 运行s 并将 Scenario 对象作为参数。您可以使用 getSourceTagNames() 方法访问 Scenario 上的所有标记,其中 returns 标记名的字符串集合。然后,您可以根据存在的标签应用逻辑。也许您可以在 Before 挂钩上放置一个标记,以便在需要数据设置时调用它。

@Before
public void dataSetup(Scenario sce) {

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