代码之家  ›  专栏  ›  技术社区  ›  MarcelHodan

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

  •  2
  • MarcelHodan  · 技术社区  · 9 年前

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

    我想将cucumber与selenium结合起来(到目前为止还不错),并使用标记优化测试执行。在我的梦中,我可以用String标记我的szenarios,它代表一个数据库szenari。例如:

    @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=>@无数据
    2. @无数据=>场景:烤面包

    3. 在数据库中设置Szenario=>@一块面包
    4. @一块面包=>@仅查看场景查看面包

    5. @一块面包=>@仅查看场景闻到面包味

    6. 在数据库中设置Szenario=>@一块面包
    7. @一块面包=>场景将面包切成两半

    8. 在数据库中设置Szenario=>@一块面包
    9. @一块面包=>场景黄油面包

    有一次,我与JUnit跑步者一起玩,尝试自己处理创建的JUnit测试。我必须再次编写自己的JUnit runner吗?或者有可能用黄瓜的特性来满足我的要求吗?

    有人能帮我吗?

    2 回复  |  直到 9 年前
        1
  •  1
  •   MarcelT    9 年前

    您可以通过对每个数据库场景运行单独的测试来实现这一点。为此,请使用 --标签 此处解释的参数 https://github.com/cucumber/cucumber/wiki/Tags#running-a-subset-of-scenarios

    我更喜欢的另一种方法是将类似的数据库场景放到功能文件中。例如,用于更改数据的要素文件。使用@Before获取场景的标记。

    @Before
    public void beforeTest(Scenario scenario){
    
    }
    

    希望能有所帮助!

        2
  •  1
  •   Grasshopper    9 年前

    您必须设置Before hooks,它只在标记匹配时运行,并为仅查看的数据设置一个静态标志。对于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....   
    }