有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

黄瓜中的java场景大纲挂钩

我正在使用Java和Cucumber。我需要在每个场景大纲之后做一些动作。我知道有@Before和@After钩子,但它们适用于场景大纲中的每个场景。是否有可能在大纲中的所有场景之后而不是在每个场景之后启动某些操作

例如:

   Scenario Outline: Some scenario
   Given given actions
   When when actions
   Then display <value>
Examples:
|value|
|a    |
|b    |

我想按以下方式执行:

@行动前

价值

b值

@行动后

@行动前

//另一个场景大纲输出

@行动后


共 (3) 个答案

  1. # 1 楼答案

    一种方法是为运行程序使用junit或testng的BeforeClass and AfterClass方法。问题是功能文件中只能有一个scenariooutline,它需要一个唯一的runner类


    让一个方法只在场景大纲的第一个场景中运行是非常容易的。使用静态标志创建只运行一次的before钩子。修改Before钩子以运行某些标记等

    private static boolean skipFlag = false;
    
    @Before
    public void beforeHook() {
    
        if(!skipFlag) {
            do stuff
            skipFlag=true;
        }
    }
    

    尽管这对于功能文件中的一个场景大纲很有效。否则,您将需要复制每个场景大纲的标志。对于并行运行,它可能会变得混乱


    这是一个更好但有点复杂的解决方案,需要将示例表拆分为3,并给出顶部和底部零件标记

    @AftBef
    Scenario Outline:
    When User Selects <Origin>, <Destination>
    
    @StartIt
    Examples:
        | Origin        | Destination        |
        | London        | New York           |
    
    Examples:
        | Origin        | Destination        |
        | Munich        | Moscow             |
        | Rome          | Shanghai           |
    
    @EndIt
    Examples:
        | Origin        | Destination        |
        | Miami         | San Francisco      |
    

    添加下面带有标记的钩子方法。也可以将标记添加到中间部分 如果有任何自定义逻辑

    @Before(value={"@StartIt"})
    public void startItAll() {
    
        System.out.println("  -START IT BIRTH BIRTH  ");
    }
    
    @After(value={"@EndIt"})
    public void endItAll() {
    
        System.out.println("  -END IT DIE DIE    -");
    }
    

    如果只有一个示例,只需将两个标记添加到下面的示例中即可

     @StartIt @EndIt
        Examples:
    

    创建表时需要小心,以确保@StartIt和@EndIt标记只存在一个示例行

  2. # 2 楼答案

    是的,你可以使用标签

       @tag1
       Scenario Outline: Some scenario
       Given given actions
       When when actions
       Then display <value>
    Examples:
    |value|
    |a    |
    |b    |
    

    这里我们将tag1指定为标记

    现在,在步骤定义中,您可以使用如下内容:

    @Before("@tag1")
    public void testSetup(){
        ...
    } 
    
    @After("@tag1")
    public void testEnd(){
        ...
    } 
    

    这些@before和@after是tag1 now特有的 我希望这有帮助

  3. # 3 楼答案

    这是一个困难且不被Cucumber支持的原因之一,因为这是一个非常糟糕的主意。良好的测试实践规定,在运行每个测试之前,您必须从头开始。如果您像现在这样将测试链接在一起,那么当出现问题时,您必须确定测试是否失败,或者之前测试中的某些内容是否导致了问题。这很快成为一个巨大的皮塔

    不要这样做,你会后悔的;)