StepDefinition类中driver实例跨方法作用域生效原理
解答
你当前编写的Cucumber Step Definition类代码如下:
@Given("^user is already on Login Page$") public void user_already_on_login_page() { System.setProperty("webdriver.chrome.driver", "/Users/ss/Downloads/chromedriver.exe"); driver = new ChromeDriver(); driver.get("https://www.google.com/index.html"); } @When("^title of login page is Free CRM$") public void title_of_login_page_is_free_CRM() { String title = driver.getTitle(); System.out.println(title); Assert.assertEquals("Google", title); }
你提到的driver跨方法访问能力,本质是普通Java类的变量作用域规则+Cucumber的Step类生命周期机制共同作用的结果,不存在特殊的跨方法传参逻辑:
- 首先可以确定的是,你代码里的
driver不是user_already_on_login_page()方法内部声明的局部变量,而是定义在StepDefinition类层面的实例成员变量。如果是方法内部声明的局部变量,出了当前方法的作用域就无法被其他方法访问,你现在能在其他方法里直接引用driver,本身就说明它是类的成员属性。 - 其次Cucumber执行单条测试场景(Scenario)时,会为这个场景下的所有步骤创建同一个StepDefinition类的实例,所有@Given/@When/@Then注解标注的步骤方法,都是通过这同一个实例来调用的。整个单场景运行周期内,这个Step实例不会被重新创建,你在第一个@Given方法里给实例成员
driver完成赋值后,这个引用就会一直被当前实例持有,后续调用同实例下的其他步骤方法时,自然可以直接访问到已经初始化完成的driver对象。 - 需要注意这个作用域是单场景隔离的:每执行一条新的测试场景,Cucumber都会生成全新的StepDefinition类实例,上一个场景中初始化的
driver不会串到新场景里。不要为了方便把driver定义为static静态变量,静态变量属于类级别,会跨场景残留状态,多场景批量运行时很容易出现驱动实例混乱的问题。
内容的提问来源于stack exchange,提问作者Jackie M
相关产品推荐
相关产品推荐

