在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("大牛测试", "大牛测试", "比较值"); }
-
以上列举方法,面试中经常问,更多请关注公众号号“大牛测试”,有免费视频