Java 如何执行testng.xml文件,该文件包含具有相同@BeforeClass方法的测试类

Java 如何执行testng.xml文件,该文件包含具有相同@BeforeClass方法的测试类,java,selenium,testng,Java,Selenium,Testng,直到现在,我已经编写了页面特定的测试,这些测试只关注页面特定的场景。例如:LoginPageTest.java包含测试仅与登录页面相关的场景的测试 现在我已经自动化了更多的页面,我想将所有这些页面集成到我的testng.xml 问题是-假设我想测试3个测试类(LoginPageTest.java、ExercisePageTest.java和HomePageTest.java)&我已经在testng.xml文件中传递了这些类名。当我运行testng.xml文件时,发生的情况是3个浏览器实例一起打开

直到现在,我已经编写了页面特定的测试,这些测试只关注页面特定的场景。例如:LoginPageTest.java包含测试仅与登录页面相关的场景的测试

现在我已经自动化了更多的页面,我想将所有这些页面集成到我的
testng.xml

问题是-假设我想测试3个测试类(LoginPageTest.java、ExercisePageTest.java和HomePageTest.java)&我已经在
testng.xml
文件中传递了这些类名。当我运行
testng.xml
文件时,发生的情况是3个浏览器实例一起打开,因为在我的每个测试类中,我都有一个
@BeforeClass
方法来初始化浏览器

在我所有的测试课程中,我都遵循以下相同的程序-

--在
@BeforeClass
方法中,我正在初始化浏览器

@BeforeClass
    public void setUp() throws Exception {

        wte = new ReadWriteExcel();
        extent = new ExtentReports("D://myfitnesspal.html", true);
        extent.addSystemInfo("Environment", "Test Environment");
        test = extent.startTest("Login Functionality");
        driver = BrowserSettings.startBrowser("chrome","https://www.myfitnesspal.com");
        engineDriver=new EngineDriver(driver);
        test.log(LogStatus.PASS, "Executing on Firefox browser");

    }
--在
@Test
方法中,我从excel表格中读取来宾的电子邮件ID和密码,并登录到应用程序中

@Test(priority=0, groups={"regression"})
    //@Test(dependsOnMethods="setUp")
    public void existingUserLoginfromLandingPage() throws Exception{

        new WebDriverWait(driver,10).until(ExpectedConditions.titleContains("Free Calorie Counter, Diet & Exercise Journal"));
        test.log(LogStatus.INFO, "Title Detected : " + "Free Calorie Counter, Diet & Exercise Journal" );
        String emailIDFromExcel = ReadWriteExcel.fecthEmailID(0);
        String passwordFromExcel = ReadWriteExcel.fecthPassword(1);
        engineDriver.landingPage.existingUserLogin(emailIDFromExcel, passwordFromExcel);
        System.out.println("EmailID & Password are :" + emailIDFromExcel+passwordFromExcel);

    }
类似地,我还有其他测试页面相关场景的
@Test
方法

我想要达到的是-

我不想打开浏览器3次,而是希望浏览器运行一次&一旦LoginPageTest.java完成,我想执行其他测试类,而不需要打开新的浏览器实例&也不需要新用户登录

示例:我希望我的
testng.xml
文件如下所示-

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
    <test name="Test">
        <parameter name="typeOfCardio" value="Swimming" />
        <parameter name="typeOfStrengthExercise" value="Bench Press" />
        <classes>
            <class name="com.myfitnesspal.tests.LoginPageTest"/>
            <class name="com.myfitnesspal.tests.ExercisePageTest"/>
            <class name="com.myfitnesspal.tests.HomePageTest" />
        </classes>
    </test> <!-- Test -->
</suite> <!-- Suite -->

创建一个公共类,在其中提及您的设置方法,并在测试前用
@BeforeTest
对其进行注释,如下所示:

public class BrowserSetup 
{
  @BeforeTest
  public void setUp() throws Exception {

    wte = new ReadWriteExcel();
    extent = new ExtentReports("D://myfitnesspal.html", true);
    extent.addSystemInfo("Environment", "Test Environment");
    test = extent.startTest("Login Functionality");
    driver = BrowserSettings.startBrowser("chrome","https://www.myfitnesspal.com");
    engineDriver=new EngineDriver(driver);
    test.log(LogStatus.PASS, "Executing on Firefox browser");
    }
}
@BeforeTest:带注释的方法将在属于的任何测试方法之前运行 运行
标记内的类

在所需文件中提及您的
@Test
方法

testing.xml
中也包含此类

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
    <test name="Test">
        <parameter name="typeOfCardio" value="Swimming" />
        <parameter name="typeOfStrengthExercise" value="Bench Press" />
        <classes>
            <class name="com.myfitnesspal.tests.BrowserSetup"/>
            <class name="com.myfitnesspal.tests.LoginPageTest"/>
            <class name="com.myfitnesspal.tests.ExercisePageTest"/>
            <class name="com.myfitnesspal.tests.HomePageTest" />
        </classes>
    </test> <!-- Test -->
</suite> <!-- Suite -->

创建一个公共类,在其中提及您的设置方法,并在测试前用
@BeforeTest
对其进行注释,如下所示:

public class BrowserSetup 
{
  @BeforeTest
  public void setUp() throws Exception {

    wte = new ReadWriteExcel();
    extent = new ExtentReports("D://myfitnesspal.html", true);
    extent.addSystemInfo("Environment", "Test Environment");
    test = extent.startTest("Login Functionality");
    driver = BrowserSettings.startBrowser("chrome","https://www.myfitnesspal.com");
    engineDriver=new EngineDriver(driver);
    test.log(LogStatus.PASS, "Executing on Firefox browser");
    }
}
@BeforeTest:带注释的方法将在属于的任何测试方法之前运行 运行
标记内的类

在所需文件中提及您的
@Test
方法

testing.xml
中也包含此类

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
    <test name="Test">
        <parameter name="typeOfCardio" value="Swimming" />
        <parameter name="typeOfStrengthExercise" value="Bench Press" />
        <classes>
            <class name="com.myfitnesspal.tests.BrowserSetup"/>
            <class name="com.myfitnesspal.tests.LoginPageTest"/>
            <class name="com.myfitnesspal.tests.ExercisePageTest"/>
            <class name="com.myfitnesspal.tests.HomePageTest" />
        </classes>
    </test> <!-- Test -->
</suite> <!-- Suite -->


由于@BeforeMethod和@afterMethod基本上用作setup和teardown方法,因此最好将它们保留在基类中。因此,这两个方法中的每一个都只创建一个引用。

因为@BeforeMethod和@AfterMethods基本上用作setup和teardown方法,所以最好将它们保留在基类中。因此,这两种方法都只创建了一个引用。

使用
@BeforeTest
anotion而不是
@BeforeClass
使用
@BeforeTest
anotion而不是
@BeforeClass
,因为我在BeforeTest方法中传递浏览器初始化代码,它将继续打开许多浏览器实例,因为我有许多测试方法。如果我错了,请纠正我。您只需要在该设置方法中执行浏览器打开代码,并执行rest编码,例如登录功能-login.java类由于我在BeforeTest方法中传递浏览器初始化代码,它将继续打开许多浏览器实例,因为我有许多测试方法。如果我错了,请纠正我。您只需要在该设置方法中执行浏览器打开代码,并执行rest编码,例如登录功能-login.java类