【问题标题】:Cucumber @Before hook runs twice @After once黄瓜 @Before 钩子运行两次 @After 一次
【发布时间】:2019-02-21 22:32:04
【问题描述】:

对所有人。 目前在写一个小小的BDD Test自动化框架,使用Java11+Junit5+Cucumber+Selenium,构建工具:Graddle。为验证 Google 标题创建了一个小测试。开始测试时,在 Gradle 中使用Test task 或运行CucumberRunner 类,在两种情况下都得到相同的结果:两次@Before 方法被执行,一次@After 方法被执行并且一个浏览器窗口保持打开状态。再添加一个测试后,同样的情况,只打开了 4 个浏览器,其中 2 个正在关闭。任何人都可以帮助解决这种情况吗?

Link to repository

看了一些日志后发现,@Before 似乎没有被执行两次,但Driver 类被初始化了两次,但为什么会发生现在不知道......

我现在的代码: CucumberRunner.java:

@RunWith(Cucumber.class )
@CucumberOptions(
        features = "src\\test\\java\\features",
        glue = {"steps", "utils"},
        tags = "@smoke")
public class CucumberRunner {
}

Driver.java:

public class Driver {
    private WebDriver driver;

    public Driver(){
        driverInitialization();
    }

    private void driverInitialization(){
        System.setProperty("webdriver.chrome.driver", "D:\\Soft\\selenium-drivers\\chromedriver.exe");
        System.out.println("Starting driver.");
        var browserName = "chrome";
        switch (browserName.toLowerCase()){
            case "chrome":
                System.out.println("Starting chrome");
                driver = new ChromeDriver();
                System.out.println("Before break.");
                break;
            case "firefox":
                driver = new FirefoxDriver();
                break;
            default:
                throw new NotFoundException("Browser not found: " + browserName);
        }
    }

    public WebDriver getDriver(){
        return driver;
    }

    public WebDriverWait getWebDriverWait(){
        return new WebDriverWait(driver, 120);
    }

    public void terminateDriver(){
        System.out.println("Terminating driver.");
        if (driver != null) {
            driver.close();
            driver.quit();
        }
    }
}

Hooks.java:

public class Hooks {
    private Driver driver;

    @Before
    public void setup(){
        System.out.println("In the Setup method.");
        driver = new Driver();
    }

    @After
    public void tearDown(){
        System.out.println("In the TearDown method.");
        driver.terminateDriver();
    }
}

【问题讨论】:

  • 我也对此感兴趣。同样的事情发生在我身上,由于我是 Cucumber 的初学者,我怀疑我可能做错了什么。
  • 伙计们,您应该在任何 Git 平台(Github)上分享您的项目,以便其他人可以看到有助于他们理解和解决您的问题的完整代码。完成后,请在上面的问题中添加您的项目链接。
  • @ABD,添加到存储库的链接。

标签: selenium-webdriver cucumber selenium-chromedriver junit5 cucumber-junit


【解决方案1】:

我认为你的 Hook 类应该是这样的,因为你正在使用 selenium-picocontainer DI。

public class Hooks {

private Driver driver;

public Hooks(Driver driver) {
    this.driver = driver;
   }

@Before
public void setup(){
    System.out.println("In the Setup method.");
   }

@After
public void tearDown(){
    System.out.println("In the TearDown method.");
    driver.terminateDriver();
   }
}

【讨论】:

  • 谢谢。看来,我现在需要在 Driver 类中进行一些更改以选择要运行的浏览器:)
  • 您可以根据自己的要求进行增强。
  • 我没有要求。我在 C# 上有一个类似的框架,现在尝试使用 Java 创建自己的框架。哪个使用起来很方便:)
【解决方案2】:

确保为每个功能指定了带有标签的前后挂钩,为什么?好的,例如,您有两个称为 UsersFeature 和 ProductsFeature 的功能,并且您为 UsersFeature 和 ProductsFeature 制作了一些钩子,例如之前的 initBrowser 和之后的 closeBrowser ,当您在没有任何标签的情况下运行该测试时会发生什么?让我告诉你,对于该测试的每个功能,钩子将运行两次或(并行 N 次)并且 N =“该测试中的功能数”,因此该测试中的所有 before 钩子将首先运行,即使有数百万个功能以及所有后挂钩,因此请确保在那个时候使用 @Before('@users_feature') @After('@users_feature') 之类的标签,只有在测试使用 @ 执行功能场景时才会运行挂钩users_feature 标签

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多