Java 如何使用页面工厂在testng中运行多个测试类?

Java 如何使用页面工厂在testng中运行多个测试类?,java,selenium,Java,Selenium,我创建了两个页面类来定位一个包中两个网页的元素(名为LoginPage.java和AddEmployee.java)。在另一个包中,我为上述两个对应的类分别创建了两个测试类(名为VerifyloginpageTest.java和VerifyAddEmployeeTest.java),我还创建了另一个名为BrowserFactory.java的类来初始化浏览器并创建驱动程序实例。使用页面工厂,我想首先按优先级顺序运行登录页面测试用例,然后在成功登录到网站后,应该转到添加员工网页 ** Browse

我创建了两个页面类来定位一个包中两个网页的元素(名为LoginPage.javaAddEmployee.java)。在另一个包中,我为上述两个对应的类分别创建了两个测试类(名为VerifyloginpageTest.javaVerifyAddEmployeeTest.java),我还创建了另一个名为BrowserFactory.java的类来初始化浏览器并创建驱动程序实例。使用页面工厂,我想首先按优先级顺序运行登录页面测试用例,然后在成功登录到网站后,应该转到添加员工网页

**

BrowserFactory.java **

**

LoginPage.java **

AddEmployee.java **

VerifyloginpageTest.java **

VerifyAddEmployeeTest.java **


因此,当我运行VerifyloginpageTest.java类时,它成功地验证了所有6个登录测试用例并登录到了网站,但它没有执行AddEmployee页面。

根据TestNG文档,如果不存在,您应该创建
TestNG.xml
文件,然后您应该根据需要配置它

示例
testng.xml
文件:

<suite name="TestExample">

    <test name="Login">
        <classes>
            <class name="packageOfYourTest.VerifyloginpageTest" />
        </classes>
    </test>

    <test name="AddEmployee">  
        <classes>
            <class name="packageOfYourTests.AddEmployee" />
        </classes>
    </test>

</suite>

根据TestNG文档,如果文件不存在,则应创建
TestNG.xml
文件,然后根据需要对其进行配置

示例
testng.xml
文件:

<suite name="TestExample">

    <test name="Login">
        <classes>
            <class name="packageOfYourTest.VerifyloginpageTest" />
        </classes>
    </test>

    <test name="AddEmployee">  
        <classes>
            <class name="packageOfYourTests.AddEmployee" />
        </classes>
    </test>

</suite>

要使用TestNG使测试类并行运行,您应该创建TestNG配置xml文件

<suite name="SuiteName">
    <test name="TestName">
        <classes>
            <class name="path.to.your.test.class.goes.here" />
        </classes>
    </test>
</suite>

请注意,使用Before方法实际上创建了一个线程,为每个线程创建驱动程序的新实例是一个很好的实践

将并行属性添加到“套件”标记上的配置文件:

<suite name="SuiteName" parallel='classes'>
    <test name="TestName">
        <classes>
            <class name="path.to.your.test.class.goes.here" />
        </classes>
    </test>
</suite>

您可以并行“方法”、“测试”或“实例”。但由于您需要并行运行类,请使用适当的值

现在,您还可以在“suite”标记上添加一个属性“threadcount”,以设置并行运行的最大类数。如果未指定此属性的值,默认情况下,金额将等于5

现在非常重要:每当您在TestNG创建新线程之前调用@Before时,您都需要为每个线程创建驱动程序,并在确切的线程中使用它。为此,您必须将每个新的驱动程序实例放入ThreadLocal容器中

private static final ThreadLocal<WebDriver> DRIVER = new ThreadLocal<>();

public static WebDriver getDriver() {
    return DRIVER.get();
}

@BeforeMethod
public void setUp() {
    if (DRIVER.get() == null) {
        DRIVER.set(new FirefoxDriver());
    }
}

@AfterMethod
public void tearDown() {
    if (DRIVER.get() != null) {
        DRIVER.remove();
    }
}
private static final ThreadLocal DRIVER=new ThreadLocal();
公共静态WebDriver getDriver(){
返回驱动程序get();
}
@预处理法
公共作废设置(){
if(DRIVER.get()==null){
设置(新的FirefoxDriver());
}
}
@后置法
公共无效拆卸(){
if(DRIVER.get()!=null){
驱动程序。删除();
}
}
因此,您将使驱动程序线程安全。还要注意,如果在@BeforeClass中启动驱动程序,则需要在@AfterClass中启动driver.qiut()。如果在@BeforeSuite中启动@BeforeSuite-driver.qiut(),则在@AfterSuite中启动,依此类推。为了确保一切正常,您可以在创建或终止驱动程序时将其打印到日志线程id中

更多信息请点击此处:

要使用TestNG使测试类并行运行,您应该创建TestNG配置xml文件

<suite name="SuiteName">
    <test name="TestName">
        <classes>
            <class name="path.to.your.test.class.goes.here" />
        </classes>
    </test>
</suite>

请注意,使用Before方法实际上创建了一个线程,为每个线程创建驱动程序的新实例是一个很好的实践

将并行属性添加到“套件”标记上的配置文件:

<suite name="SuiteName" parallel='classes'>
    <test name="TestName">
        <classes>
            <class name="path.to.your.test.class.goes.here" />
        </classes>
    </test>
</suite>

您可以并行“方法”、“测试”或“实例”。但由于您需要并行运行类,请使用适当的值

现在,您还可以在“suite”标记上添加一个属性“threadcount”,以设置并行运行的最大类数。如果未指定此属性的值,默认情况下,金额将等于5

现在非常重要:每当您在TestNG创建新线程之前调用@Before时,您都需要为每个线程创建驱动程序,并在确切的线程中使用它。为此,您必须将每个新的驱动程序实例放入ThreadLocal容器中

private static final ThreadLocal<WebDriver> DRIVER = new ThreadLocal<>();

public static WebDriver getDriver() {
    return DRIVER.get();
}

@BeforeMethod
public void setUp() {
    if (DRIVER.get() == null) {
        DRIVER.set(new FirefoxDriver());
    }
}

@AfterMethod
public void tearDown() {
    if (DRIVER.get() != null) {
        DRIVER.remove();
    }
}
private static final ThreadLocal DRIVER=new ThreadLocal();
公共静态WebDriver getDriver(){
返回驱动程序get();
}
@预处理法
公共作废设置(){
if(DRIVER.get()==null){
设置(新的FirefoxDriver());
}
}
@后置法
公共无效拆卸(){
if(DRIVER.get()!=null){
驱动程序。删除();
}
}
因此,您将使驱动程序线程安全。还要注意,如果在@BeforeClass中启动驱动程序,则需要在@AfterClass中启动driver.qiut()。如果在@BeforeSuite中启动@BeforeSuite-driver.qiut(),则在@AfterSuite中启动,依此类推。为了确保一切正常,您可以在创建或终止驱动程序时将其打印到日志线程id中

更多信息请点击此处:

你得到的例外是什么?另外,AddEmp…Test类中的方法webPage()是否调用过?@Grasshopper我在通过VerifyloginpageTest.java类为登录页运行测试用例时没有遇到任何异常,主要问题是add_emp对象没有在这一行初始化…{add_emp=PageFactory.initElements(driver,AddEmployee.class);}在VerifyAddEmployeeTest.java类中。。。。。。所以AddEmployee.java类永远不会被访问你得到的异常是什么?另外,AddEmp…Test类中的方法webPage()是否调用过?@Grasshopper我在通过VerifyloginpageTest.java类为登录页运行测试用例时没有遇到任何异常,主要问题是add_emp对象没有在这一行初始化…{add_emp=PageFactory.initElements(driver,AddEmployee.class);}在VerifyAddEmployeeTest.java类中。。。。。。所以AddEmployee.java类永远不会被访问
<suite name="SuiteName" parallel='classes'>
    <test name="TestName">
        <classes>
            <class name="path.to.your.test.class.goes.here" />
        </classes>
    </test>
</suite>
private static final ThreadLocal<WebDriver> DRIVER = new ThreadLocal<>();

public static WebDriver getDriver() {
    return DRIVER.get();
}

@BeforeMethod
public void setUp() {
    if (DRIVER.get() == null) {
        DRIVER.set(new FirefoxDriver());
    }
}

@AfterMethod
public void tearDown() {
    if (DRIVER.get() != null) {
        DRIVER.remove();
    }
}