在Java自動化測試中,面試官經常會出關於TestNg問題,本篇將分析面試中高頻問題:
TestNg概念:
-
testNG代表”測試下一代”。它是用於Java編程語言的自動化測試框架, 是從JUnit框架得到啟發而來的。TestNG不僅包含JUnit框架的所有功能, 還包含一些其他功能, 這些功能使TestNG更加強大。
-
常用注解
-
BeforeTest
表示注釋下的方法將在屬於該文件夾的任何測試之前首先執行,一般用於初 始化數據,准備測試環境等操作
@BeforeTest public void Before() { System.out.println("測試之前"); }
-
AfterTest
表示帶注釋的方法下的測試方法是在所有可用類的測試方法執行后執行,用於結束驅動,銷毀驅動等操作
@AfterTest public void After() { System.out.println("測試結束"); }
-
AfterMethod
表示在測試前運行
-
@AfterMethod public void After() { System.out.println("測試結束");
-
BeforeMethod
表示在測試后運行
@BeforeMethod public void Before() { System.out.println("測試之前"); }
-
注意:與AfterTest、BeforeTest不同,Method作用於測試方法,所以運行了兩次。
-
BeforeSuite
在test suite中的所有test運行之前運行,只運行一次;
@BeforeSuite public void Before() { System.out.println("測試套件之前"); }
-
AfterSuite
在test suite中的所有test運行之后運行,只運行一次。
套件代碼:
-
//方法
-
@BeforeSuite public void Before() { System.out.println("測試套件之前"); } @AfterSuite public void After() { System.out.println("測試套件結束"); }
xml文件
<suite name="Suite1" parallel="tests" > <test name="test12"> <classes> <class name="part_2.Test_01"/> </classes> </test> <test name="test13"> <classes> <class name="part_2.Test_9"/> </classes> </test> </suite> 運行后:
-
Test
具體的測試方法
@Test public void test_01() { Assert.assertEquals("測試", "大牛測試", "比較值"); //實際值、預期的 // Assert.assertEquals(actual, expected); } @Test public void test_02() { Assert.assertEquals("大牛測試開發", "大牛測試開發", "比較值"); } @Test public void test_03() { //true,false Assert.assertTrue(true); }
Test中還可增加參數,如
@Test(invocationCount=5)其中invocationCount為執行次數 @Test(enabled=false) false為不可用
-
運行方式
通過testng test運行,右鍵->TestNG Test
通過test.xml運行
選中所需運行的testng.xml文件,右鍵TestNg Suite運行
-
依賴執行 如下執行test_01之前需先執行test_02
例:
-
String i="c"; //執行條件 @Test(dependsOnMethods= {"test_02"}) public void test_01() { System.out.println(i); System.out.println("test01"); } @Test public void test_02() { i="d"; System.out.println(i); System.out.println("test02"); }
-
多線程執行
多線程執行時,需現在testng文件中配置線程,以下配置實現:一個腳本同時並發執行
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="Suite1" parallel="tests" thread-count="2"> <test name="test12"> <parameter name="webdriver" value="webdriver.chrome.driver"/> <parameter name="path" value="C:/Python3/chromedriver.exe"/> <classes> <class name="part_2.Test_05"/> </classes> </test> <test name="test13"> <parameter name="webdriver" value="webdriver.gecko.driver"/> <parameter name="path" value="D:\se\\dr\\geckodriver.exe"/> <classes> <class name="part_2.Test_05"/> </classes> </test> </suite>
-
測試代碼:
@Test @Parameters({"webdriver","path"}) public void test_02(String webdriver,String path) throws InterruptedException { System.setProperty(webdriver, path);
if(webdriver.contains("chrome")) { driver = new ChromeDriver(); } else {
driver = new FirefoxDriver(); }
driver.get("https://www.baidu.com/");
driver.findElement(By.id("kw")).sendKeys("test"); }
-
DataProvider參數化
@DataProvider() public Object[][] user() { //Object數組可以存儲不同類型數據 return new Object[][]{ {"timtest", "timtest"}, {"tim2", "1234"}, {"tim3", "tim3"} }; } @BeforeTest public void Before() { System.out.println("測試之前"); } @Test(dataProvider="user") public void test_01(String username,String passwd) { Assert.assertEquals(username, passwd, "比較tim的值"); }
-
冒煙測試 僅運行標記為smoke用例
-
代碼如下:
xml文件配置
<suite name="Suite1"> <groups> <run> <include name="smoke"/> </run> </groups> <test name="test12"> <classes> <class name="part_2.Test_03"/> </classes> </test></suite>
代碼如下:
@Test public void test_01() { Assert.assertEquals("測試開發", "高薪必備", "比較值"); } //冒煙測試 @Test(groups= {"smoke"}) public void test_02() { Assert.assertEquals("大牛測試", "大牛測試", "比較值"); }
-
-
以上列舉方法,面試中經常問,更多請關注公眾號號“大牛測試”,有免費視頻