在不同的类中访问@BeforeTest和@AfterClass(TestNG)中的变量?

时间:2017-02-01 19:53:04

标签: java selenium testng

我正在使用Java和TestNG框架为我的公司编写一些selenium自动化UI测试。我在Base类中定义驱动程序,我想在@BeforeTest中实际初始化驱动程序并以@AfterTest方法退出。 Java的方法是什么,假设它们在不同的类中?我知道如何让它在同一个类中工作,但不能在单独的类中工作。这是我的Base.java文件:

public class Base {

        public static WebDriver driver = null;
        public WebDriver getDriver() {
            driver = new ChromeDriver();
            return driver;
        }
}

现在,我想要一个单独的Setup类和一个单独的Teardown类。如果我要在同一个@Test中定义所有这些,我会这样做:

@Test
public void testOne() {

    Base b = new Base();
    WebDriver driver = b.getDriver();

    // Do test-y things here. 

    driver.quit();
}

我该如何设置?试图学习正确的方法,而不是一起破解。如果需要,我还可以提供更多信息。谢谢!

2 个答案:

答案 0 :(得分:3)

使用继承。

public class TestBase {

    protected WebDriver driver;

    @BeforeClass
    public void setUp(){
        System.out.println("I am in setUp method.");

        //WebDriver instantiation etc.
        System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--start-maximized", "--disable-cache");
        driver = new ChromeDriver(options);
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    }

    @AfterClass
    public void tearDown(){
        System.out.println("I am in tearDown method.");

        //You can clean up after tests.
        driver.close();
    }
}

然后可以使用继承。请注意extends关键字:

public class ParticularTest extends TestBase {

   @Test
   public void testMethod() {
       System.out.println("I am in testMethod.");

       //Your driver from TestBase is accessible here.
       //Your assertions come here.
   }
}

稍后您可以执行ParticularTest.java。 输出:

I am in setUp method.
I am in testMethod.
I am in tearDown method.

答案 1 :(得分:1)

我建议你请尝试在你的测试中使用这种实例化webdrivers的机制。根据定义,np.argmax(sess.run(predictions), 1)预计会按@BeforeTest标记调用 ONLY ONCE 。因此,如果您的TestNG套件xml文件具有类似的内容

<test>

如果<test name="MyTests"> <classes> <class name="com.foo.Test1"/> <class name="com.foo.Test2"/> </classes> </test> com.foo.Test1都扩展了com.foo.Test2类,则TestBase类中的@Test方法必然会达到{{1}访问com.foo.Test2对象时,因为NullPointerException中的driver带注释的@BeforeTest方法只会执行一次(对于setup()),它会 NOT TestBase执行,因为这两个类都是从同一个基类扩展而来的。

我建议您使用this(这是我的博客)来进行网络驱动程序实例化。