TestNg常用注解介绍,先来张图:
先看一下,以上各个注释的运行次序:
@Test
表示的意义:
1.表示示该方法是一个测试方法,在运行时,会自动的运行有@Test注脚的方法。
示例:
@BeforeMethod/@ AfterMethod
表示的意义:
1.beforemethod这个注脚是指加了该注脚的方法在每个测试方法运行之前会自动的被调用运行
2.aftermethod该注脚的方法在每一个测试方法运行之后会自动的被调用运行示例:
@BeforeClass/@AfterClass
表示的意义:
1.@BeforeClass与@AfterClass,这两个注脚的方法,也就是在每个类运行之前与之后会自动的被调用
用处:
1.在自动化脚本运行时,一个类里面的所有测试方法设计的是在同一个浏览器里面运行,那么就是说在这个类对象产生之前,就要把浏览器给启动起来,这时候@BeforeClass可以启动浏览器,@AfterClass就可以关闭浏览器了
@BeforeSuite/@AfterSuite /@BeforeTest/@AfterTest
用处:
这四个注解是分别用在Suite与Test上的,Suite与Test是定义在XML中的,后面我们再详细介绍及代码示例。
TestNg的数据驱动
什么是数据驱动:
1.数据驱动是指在一个脚本固定的情况下,用数据来控制该脚本是否运行,以及运行的次数,还有每次运行时对应的参数.
数据驱动的应用场景:
1.比如我们在测试登录时,要测试用不同的帐户登录,难道我们需要针对每一个帐户去写一个脚本吗?这样显然是不明智的,于是,testng为我们提供了这样一个注脚,让我们只需要提供出数据,就可以控制脚本运行的次数及相应的参数.
TestNg数据驱动的实现
实现方式:
1.用注解@DataProvider.示例:
注意点:
1.@DataProvider注脚的方法的返回值是Object对象的二维数组
2.@DataProvider可以指定名称如@DataProvider(name="testData"),这样在测试方法中@Test(dataProvider="testData"),如果没有跟(name="testData"),则测试方法中的dataProvider的值就应该为@DataProvider注脚的方法名
TestNg用XML运行
以class为基本点
<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite" verbose="1" parallel="false" thread-count="1">
<test name="Test1">
<classes>
<class name="com.demo.Test2" />
</classes>
</test>
</suite>
以method为基本点
<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite" verbose="1" parallel="false" thread-count="1">
<test name="Test1" preserve-order="true">
<classes>
<class name="com.demo.Test2">
<methods>
<include name="test2" />
<include name="test1" />
</methods>
</class>
</classes>
</test>
</suite>
以package为基本点
<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite" verbose="1" parallel="false" thread-count="1">
<test name="Test1">
<packages>
<package name="com.demo" />
</packages>
</test>
</suite>
此外TestNg也可以用命令行运行,具体可参考:
http://www.cnblogs.com/zhangfei/archive/2012/11/26/2788946.html
亲自试过的,没有任何问题。结果会打印到cmd的窗口中,且在目录下会生成test-output文件夹,如下所示:
TestNg用例管理
遵循的原则是用例独立少依赖
具体代码如下:
testNg.java文件代码如下:
1 package com.selenium.test; 2 3 import org.openqa.selenium.By; 4 import org.openqa.selenium.WebDriver; 5 import org.openqa.selenium.firefox.FirefoxDriver; 6 import org.testng.annotations.AfterClass; 7 import org.testng.annotations.AfterMethod; 8 import org.testng.annotations.BeforeClass; 9 import org.testng.annotations.BeforeMethod; 10 import org.testng.annotations.DataProvider; 11 import org.testng.annotations.Test; 12 13 public class testNg { 14 public static WebDriver Driver; 15 16 @BeforeClass 17 public void beforeClass() { 18 System.out.println("beforeClass: open the browser."); 19 } 20 21 @AfterClass 22 public void afterClass() { 23 System.out.println("afterClass: close the browser."); 24 Driver.quit(); 25 } 26 27 @BeforeMethod 28 public void setUp() { 29 System.out.println("setUp"); 30 startFireFox("http://baidu.com"); 31 } 32 33 @AfterMethod 34 public void tearDown() { 35 System.out.println("tearDown"); 36 Driver.close(); 37 } 38 39 @Test(dataProvider = "user") 40 public void testBaidu(String text) { 41 System.out.println(text); 42 Driver.findElement(By.id("kw")).sendKeys(text); 43 } 44 45 // 由于user没有指定name,所以直接使用方法名user 46 @Test(dataProvider = "user") 47 public void testUser(String text) { 48 System.out.println(text); 49 } 50 51 // 由于score指定name=scoreForUser,所以使用scoreForUser 52 @Test(dataProvider = "scoreForUser") 53 public void testScore(String text) { 54 System.out.println(text); 55 } 56 57 // 虽然score指定name=scoreForUser, 但也可以直接使用方法名score 58 @Test(dataProvider = "score") 59 public void testScoreAgain(String text) { 60 System.out.println(text); 61 } 62 63 @DataProvider 64 public Object[][] user() { 65 return new Object[][] { { "zhangsan" }, { "lisi" } }; 66 } 67 68 // 这种方式是给DataProvider重命名为sourceForUser 69 @DataProvider(name = "scoreForUser") 70 public Object[][] score() { 71 return new Object[][] { { "90" }, { "100" } }; 72 } 73 74 public static void startFireFox(String url) { 75 Driver = new FirefoxDriver(); 76 Driver.manage().window().maximize(); 77 Driver.navigate().to(url); 78 } 79 80 // public static void closeFireFox() { 81 // Driver.close(); 82 // Driver.quit(); 83 // } 84 }
testPackage.xml具体代码如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <suite name="Suite" verbose="1" parallel="false" thread-count="1"> 3 <test name="Test1"> 4 <packages> 5 <package name="com.selenium.test" /> 6 </packages> 7 </test> 8 </suite>
testClass.xml具体代码如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <suite name="Suite" verbose="1" parallel="false" thread-count="1"> 3 <test name="Test1"> 4 <classes> 5 <class name="com.selenium.test.testNg" /> 6 </classes> 7 </test> 8 </suite>
testMethod.xml具体代码如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <suite name="Suite" verbose="1" parallel="false" thread-count="1"> 3 <test name="Test1"> 4 <classes> 5 <class name="com.selenium.test.testNg" /> 6 <methods> 7 <include name="testBaidu" /> 8 </methods> 9 </classes> 10 </test> 11 </suite>
最后打个广告,不要介意哦~
最近我在Dataguru学了《软件自动化测试Selenium2》网络课程,挺不错的,你可以来看看!要是想报名,可以用我的优惠码 G863,立减你50%的固定学费!
链接:http://www.dataguru.cn/invite.php?invitecode=G863