JUnit让开发人员了解测试的实用性,尤其是在单元测试这一模块上比任何其他测试框架都要简单明了。凭借一个相当简单,务实,严谨的架构,JUnit已经能够“感染”了一大批开发人员。TestNG是一个测试框架,其灵感来自JUnit和NUnit,但引入了一些新的功能,使其功能更强大,使用更方便。
一:注解的使用
import org.testng.annotations.AfterClass; import org.testng.annotations.AfterMethod; import org.testng.annotations.AfterSuite; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; import org.testng.annotations.BeforeSuite; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; public class Annotation { @Test public void testCase1(){ System.out.println("测试用例1被执行"); } @Test public void testCase2(){ System.out.println("测试用例2被执行"); } @BeforeMethod public void beforeMethod(){ System.out.println("@BeforeMethod:在每个测试方法开始运行前执行"); } @AfterMethod public void afterMethod(){ System.out.println("@AfterMethod:在每个测试方法开始运行结束后执行"); } @BeforeClass public void beforeClass(){ System.out.println("@BeforeClass:在当前测试类的第一个测试方法开始调用前执行"); } @AfterClass public void afterClass(){ System.out.println("@AfterClass:在当前测试类的最后一个测试方法结束运行后执行"); } @BeforeTest public void beforeTest(){ System.out.println("@BeforeTest:在测试类中的Test开始运行前执行"); } @AfterTest public void afterTest(){ System.out.println("@AfterTest:在测试类中的Test运行结束后执行"); } @BeforeSuite public void beforeSuite(){ System.out.println("@BeforeSuite:在当前测试集合(suite)中所有测试程序开始运行之前执行"); } @AfterSuite public void afterSuite(){ System.out.println("@AfterSuite:在当前测试集合(suite)中所有测试程序运行结束之后执行"); } }
运行结果:
@BeforeSuite:在当前测试集合(suite)中所有测试程序开始运行之前执行
@BeforeTest:在测试类中的Test开始运行前执行
@BeforeClass:在当前测试类的第一个测试方法开始调用前执行
@BeforeMethod:在每个测试方法开始运行前执行
测试用例1被执行
@AfterMethod:在每个测试方法开始运行结束后执行
@BeforeMethod:在每个测试方法开始运行前执行
测试用例2被执行
@AfterMethod:在每个测试方法开始运行结束后执行
@AfterClass:在当前测试类的最后一个测试方法结束运行后执行
@AfterTest:在测试类中的Test运行结束后执行
PASSED: testCase1
PASSED: testCase2
===============================================
Default test
Tests run: 2, Failures: 0, Skips: 0
===============================================
@AfterSuite:在当前测试集合(suite)中所有测试程序运行结束之后执行
===============================================
Default suite
Total tests run: 2, Failures: 0, Skips: 0
===============================================
二:依赖测试
import org.testng.annotations.Test; public class DependentTest { /** * TestNG 依赖测试(使用dependsOnMethods参数实现) * 有时候需要按顺序来调用测试用例, 那么测试用例之间就存在依赖关系 * 通过依赖测试,可以在不同的方法间共享数据和程序状态 */ // dependsOnMethods={"OpenBrowser"} 表示在OpenBrowser方法被调用后才能执行login方法 @Test(dependsOnMethods={"OpenBrowser"}) public void login(){ System.out.println("login方法被调用"); } @Test public void OpenBrowser(){ System.out.println("OpenBrowser方法被调用"); } // dependsOnMethods={"login"} 表示在login方法被调用后才能执行logout方法 @Test(dependsOnMethods={"login"}) public void logout(){ System.out.println("logout方法被调用"); } }
运行结果:
OpenBrowser方法被调用
login方法被调用
logout方法被调用
PASSED: OpenBrowser
PASSED: login
PASSED: logout
===============================================
Default test
Tests run: 3, Failures: 0, Skips: 0
===============================================
三:按特定顺序执行测试
import org.testng.annotations.Test; public class SequenceTest { /** * 使用priority参数,可以按特定顺序执行测试 */ @Test(priority=2) public void test3(){ System.out.println("test3方法被调用"); } // enabled=false 跳过这个测试方法 @Test(priority=1,enabled=false) public void test2(){ System.out.println("test2方法被调用"); } @Test(priority=0) public void test1(){ System.out.println("test1方法被调用"); } @Test(priority=3) public void test4(){ System.out.println("test4方法被调用"); } }
运行结果:
test1方法被调用
test3方法被调用
test4方法被调用
PASSED: test1
PASSED: test3
PASSED: test4
===============================================
Default test
Tests run: 3, Failures: 0, Skips: 0
===============================================
四:测试集合,通过testng.xml方式来执行测试用例
<suite name="Suite"> <test name="Test"> <classes> <!-- 测试集合,执行cn.testng包下的Annotation及test测试类 --> <class name="cn.testng.Annotation"/> <class name="cn.testng.test"/> </classes> </test> </suite>
五:测试用例的分组,通过testng.xml方式来执行测试用例
import org.testng.annotations.Test; public class Grouping { /** * 测试用例的分组,TestNG使用groups关键字进行分组,用来执行多个Test的测试用例 */ @Test(groups={"人"}) public void student(){ System.out.println("学生方法被调用"); } @Test(groups={"人"}) public void teacher(){ System.out.println("老师方法被调用"); } @Test(groups={"动物"}) public void cat(){ System.out.println("小猫方法被调用"); } @Test(groups={"动物"}) public void dog(){ System.out.println("小狗方法被调用"); } }
设置testng.xml
<suite name="Suite"> <test name="Grouping"> <groups> <run> <include name="动物"></include> </run> </groups> <classes> <class name="cn.testng.Grouping"/> </classes> </test> </suite>
通过testng.xml方式来执行测试用例,结果如下:
小猫方法被调用
小狗方法被调用
===============================================
Suite
Total tests run: 2, Failures: 0, Skips: 0
===============================================