1. 程式人生 > >測試框架TestNG

測試框架TestNG

一.TestNG介紹

1.適合測試人員使用的原因

  • 比Junit涵蓋功能更全面的測試框架
  • Junit更適合隔離性比較強的單元測試
  • TestNG更適合複雜的整合測試

2.TestNG的使用

  • maven引入

    <dependencies>
    	<dependency>
        	<groupId>org.testing</groupId>
            <artifactId>testing</artifactId>
            <version>release</
    version
    >
    </dependency> </dependencies>

3.TestNG基本註解與執行順序實戰

  • 建立maven的工程檔案

  • 使用最基本的@Test註解,用來把方法標記為測試的一部分

    package com.course.testng;
    import org.testng.annotations.Test;
    public class BasicAnnotation {
        //最基本的註解,用來把方法標記為測試的一部分
        @Test
        public void testCase1() {
            System.
    out.println("這是測試用例1"); } }
  • 註解實戰@BeforeMethod和@AfterMethod

    package com.course.testng;
    import org.testng.annotations.AfterMethod;
    import org.testng.annotations.BeforeMethod;
    import org.testng.annotations.Test;
    public class BasicAnnotation {
        //最基本的註解,用來把方法標記為測試的一部分
        @Test
        public void
    testCase1() { System.out.println("這是測試用例1"); } //BeforeMethod是在測試方法之前執行的 @BeforeMethod public void beforeMethod(){ System.out.println("BeforeMethod是在測試方法之前執行的"); } //AfterMethod是在測試方法之後執行的 @AfterMethod public void afterMethod(){ System.out.println("AfterMethod是在測試方法之後執行的"); } } //執行結果 //BeforeMethod是在測試方法之前執行的 //這是測試用例1 //AfterMethod是在測試方法之後執行的
    • 當在類中新增case方法時,執行類則可以發現每個Test方法的前後都有BeforeMethod和AfterMethod方法
    package com.course.testng;
    import org.testng.annotations.AfterMethod;
    import org.testng.annotations.BeforeMethod;
    import org.testng.annotations.Test;
    public class BasicAnnotation {
        //最基本的註解,用來把方法標記為測試的一部分
        @Test
        public void testCase1() {
            System.out.println("這是測試用例1");
        }
        @Test
        public void testCase2() {
            System.out.println("這是測試用例2");
        }
        //BeforeMethod是在測試方法之前執行的
        @BeforeMethod
        public void beforeMethod(){
            System.out.println("BeforeMethod是在測試方法之前執行的");
        }
        //AfterMethod是在測試方法之後執行的
        @AfterMethod
        public void afterMethod(){
            System.out.println("AfterMethod是在測試方法之後執行的");
        }
    }
    //執行類結果
    //BeforeMethod是在測試方法之前執行的
    //這是測試用例1
    //AfterMethod是在測試方法之後執行的
    //BeforeMethod是在測試方法之前執行的
    //這是測試用例2
    //AfterMethod是在測試方法之後執行的
    
  • 註解實戰@BeforeClass和@AfterClass,在類執行之前和之後執行的方法

    package com.course.testng;
    import org.testng.annotations.*;
    public class BasicAnnotation {
        //最基本的註解,用來把方法標記為測試的一部分
        @Test
        public void testCase1() {
            System.out.println("這是測試用例1");
        }
        @Test
        public void testCase2() {
            System.out.println("這是測試用例2");
        }
        //BeforeMethod是在測試方法之前執行的
        @BeforeMethod
        public void beforeMethod(){
            System.out.println("BeforeMethod是在測試方法之前執行的");
        }
        //AfterMethod是在測試方法之後執行的
        @AfterMethod
        public void afterMethod(){
            System.out.println("AfterMethod是在測試方法之後執行的");
        }
        //BeforeClass是在類執行之前執行的方法
        @BeforeClass
        public void beforeClass(){
            System.out.println("BeforeClass是在類執行之前執行的方法");
        }
        //AfterClass是在類執行之後執行的方法
        @AfterClass
        public void afterClass(){
            System.out.println("AfterClass是在類執行之後執行的方法");
        }
    }
    //執行結果
    //BeforeClass是在類執行之前執行的方法
    //BeforeMethod是在測試方法之前執行的
    //這是測試用例1
    //AfterMethod是在測試方法之後執行的
    //BeforeMethod是在測試方法之前執行的
    //這是測試用例2
    //AfterMethod是在測試方法之後執行的
    //AfterClass是在類執行之後執行的方法
    
  • 註解實戰BeforeSuite和AfterSuite測試套件,在類執行之前的前面執行和在類執行之後的後面執行

    package com.course.testng;
    import org.testng.annotations.*;
    public class BasicAnnotation {
        //最基本的註解,用來把方法標記為測試的一部分
        @Test
        public void testCase1() {
            System.out.println("這是測試用例1");
        }
        @Test
        public void testCase2() {
            System.out.println("這是測試用例2");
        }
        //BeforeMethod是在測試方法之前執行的
        @BeforeMethod
        public void beforeMethod(){
            System.out.println("BeforeMethod是在測試方法之前執行的");
        }
        //AfterMethod是在測試方法之後執行的
        @AfterMethod
        public void afterMethod(){
            System.out.println("AfterMethod是在測試方法之後執行的");
        }
        //BeforeClass是在類執行之前執行的方法
        @BeforeClass
        public void beforeClass(){
            System.out.println("BeforeClass是在類執行之前執行的方法");
        }
        //AfterClass是在類執行之後執行的方法
        @AfterClass
        public void afterClass(){
            System.out.println("AfterClass是在類執行之後執行的方法");
        }
        //beforeSuite在beforeClass之前執行
        @BeforeSuite
        public void beforeSuite(){
            System.out.println("beforeSuite測試套件");
        }
        //afterSuite在afterClass之後執行
        @AfterSuite
        public void afterSuite(){
            System.out.println("afterSuite測試套件");
        }
    }
    //執行結果
    //beforeSuite測試套件
    //BeforeClass是在類執行之前執行的方法
    //BeforeMethod是在測試方法之前執行的
    //這是測試用例1
    //AfterMethod是在測試方法之後執行的
    //BeforeMethod是在測試方法之前執行的
    //這是測試用例2
    //AfterMethod是在測試方法之後執行的
    //AfterClass是在類執行之後執行的方法
    //afterSuite測試套件
    

4.TestNG套件測試

  • 編寫SuiteConfig.java檔案(檔名可以自定義,主要用於配置套件的相關方法編寫)

    package com.course.testng.suite;
    
    import org.testng.annotations.AfterSuite;
    import org.testng.annotations.AfterTest;
    import org.testng.annotations.BeforeSuite;
    import org.testng.annotations.BeforeTest;
    
    public class SuiteConfig {
        @BeforeSuite
        public void beforeSuite(){
            System.out.println("before suite執行啦");
        }
        @AfterSuite
        public void afterSuite(){
            System.out.println("after suite執行啦");
        }
    
        @BeforeTest
        public void beforeTest(){
            System.out.println("beforeTest");
        }
    
        @AfterTest
        public void afterTest(){
            System.out.println("afterTest");
        }
    }
    
  • 編寫LoginTest.java檔案和PayTest.java檔案(檔名可以自定義,主要編寫固定的測試用例)

    //PayTest.java
    package com.course.testng.suite;
    import org.testng.annotations.Test;
    public class PayTest {
        @Test
        public void paySuccess(){
            System.out.println("支付寶支付成功");
        }
    }
    //LoginTest.java
    package com.course.testng.suite;
    import org.testng.annotations.Test;
    public class LoginTest {
        @Test
        public void loginTaoBao(){
            System.out.println("淘寶登入成功");
        }
    }
    
  • 編寫suite.xml檔案(檔名可以自定義,主要用於將配置套件檔案與用例檔案整合)

    <?xml version="1.0" encoding="UTF-8" ?><!-- 標準xml檔案頭 -->
    <suite name="test">
        <test name="login">
            <classes>
                <class name="com.course.testng.suite.SuiteConfig"/>
                <class name="com.course.testng.suite.LoginTest"/>
            </classes>
        </test>
        <test name="pay">
            <classes>
                <class name="com.course.testng.suite.SuiteConfig"/>
                <class name="com.course.testng.suite.PayTest"/>
            </classes>
        </test>
    </suite>
    
  • 執行suite.xml檔案

    before suite執行啦
    beforeTest
    淘寶登入成功
    afterTest
    beforeTest
    支付寶支付成功
    afterTest
    after suite執行啦
    

5.TestNG忽略測試

  • 建立檔案IgnoreTest.java檔案

  • 忽略測試:指的是當前不執行某個測試用例,將@Test的enabled屬性設定為false即可(預設enabled屬性值為true)

    package com.course.testng;
    import org.testng.annotations.Test;
    public class IgnoreTest {
        @Test
        public void ignore1(){
            System.out.println("ignore1 執行!");
        }
        @Test(enabled = false)
        public void ignore2(){
            System.out.println("ignore2 執行!");
        }
        @Test(enabled = true)
        public void ignore3(){
            System.out.println("ignore3 執行!");
        }
    }
    //執行結果
    //ignore1 執行!
    //ignore3 執行!
    

二.TestNG組測試

1.組測試中的方法分組測試

  • 建立GroupsOnMethod.java檔案

  • 方法分組測試:利用@BeforeGroups和@AfterGroups篩選在對應groups的前後執行的內容

  • 例項程式碼

    package com.course.testng.groups;
    import org.testng.annotations.AfterGroups;
    import org.testng.annotations.BeforeGroups;
    import org.testng.annotations.Test;
    public class GroupsOnMethod {
        @Test(groups = "server")
        public void test1(){
            System.out.println("這是服務端組的測試方法11111");
        }
        @Test(groups = "server")
        public void test2(){
            System.out.println("這是服務端組的測試方法22222");
        }
        @Test(groups = "client")
        public void test3(){
            System.out.println("這是客戶端組的測試方法33333");
        }
        @Test(groups = "client")
        public void test4(){
            System.out.println("這是客戶端組的測試方法44444");
        }
        @BeforeGroups("server")
        public void beforeGroupsOnServer(){
            System.out.println("這是服務端組執行之前執行的方法");
        }
        @AfterGroups("server")
        public void afterGroupsOnServer(){
            System.out.println("這是服務端組執行之後執行的方法");
        }
        @BeforeGroups("client")
        public void beforeGroupsOnClient(){
            System.out.println("這是客戶端組執行之前執行的方法");
        }
        @AfterGroups("client")
        public void afterGroupsOnClient(){
            System.out.println("這是客戶端組執行之後執行的方法");
        }
    }
    //執行結果
    //這是服務端組執行之前執行的方法
    //這是服務端組的測試方法11111
    //這是服務端組的測試方法22222
    //這是服務端組執行之後執行的方法
    //這是客戶端組執行之前執行的方法
    //這是客戶端組的測試方法33333
    //這是客戶端組的測試方法44444
    //這是客戶端組執行之後執行的方法
    

2.組測試中的類分組測試

  • 建立GroupsOnClass1.java檔案

    package com.course.testng.groups;
    import org.testng.annotations.Test;
    @Test(groups = "stu")//給類命名groups
    public class GroupsOnClass1 {
        public void stu1(){
            System.out.println("GroupsOnClass1中的stu1執行");
        }
        public void stu2(){
            System.out.println("GroupsOnClass1中的stu2執行");
        }
    }
    
  • 建立GroupsOnClass2.java檔案

    package com.course.testng.groups;
    import org.testng.annotations.Test;
    @Test(groups = "stu")//給類命名groups
    public class GroupsOnClass2 {
        public void stu1(){
            System.out.println("GroupsOnClass2中的stu1執行");
        }
        public void stu2(){
            System.out.println("GroupsOnClass2中的stu2執行");
        }
    }
    
  • 建立GroupsOnClass3.java檔案

    package com.course.testng.groups;
    import org.testng.annotations.Test;
    @Test(groups = "teacher")//給類命名groups
    public class GroupsOnClass3 {
        public void teacher1(){
            System.out.println("GroupsOnClass3中的teacher1執行");
        }
        public void teacher2(){
            System.out.println("GroupsOnClass3中的teacher2執行");
        }
    }
    
  • 建立groupsOnClass.xml檔案

    <?xml version="1.0" encoding="UTF-8" ?>
    <suite name="suitename">
        <test name="runAll"><!-- 執行所有的組 -->
            <classes>
                <class name="com.course.testng.groups.GroupsOnClass1"/>
                <class name="com.course.testng.groups.GroupsOnClass2"/>
                <class name="com.course.testng.groups.GroupsOnClass3"/>
            </classes>
        </test>
        <test name="onlyRunStu">
            <groups>
                <run>
                    <include name="stu"/><!-- 只執行groups為stu的類組的方法 -->
                </run>
            </groups>
            <classes>
                <class name="com.course.testng.groups.GroupsOnClass1"/>
                <class name="com.course.testng.groups.GroupsOnClass2"/>
                <class name="com.course.testng.groups.GroupsOnClass3"/>
            </classes>
        </test>
    </suite>
    
    • 利用阻塞式配置groups->run->include,設定執行哪組的類

    • 執行xml結果(前六條因為沒有指定設定則執行所有的組,後四條因為利用阻塞式配置只執行groups為stu的組中的類的方法)

      GroupsOnClass1中的stu1執行
      GroupsOnClass1中的stu2執行
      GroupsOnClass2中的stu1執行
      GroupsOnClass2中的stu2執行
      GroupsOnClass3中的teacher1執行
      GroupsOnClass3中的teacher2執行
      GroupsOnClass1中的stu1執行
      GroupsOnClass1中的stu2執行
      GroupsOnClass2中的stu1執行
      GroupsOnClass2中的stu2執行
      

三.TestNG異常測試

1.什麼時候使用異常測試

  • 在我們期望結果為某一個異常的時候(系統丟擲的異常或顯式丟擲的異常)

  • 比如:我們傳入了某些不合法的引數,程式丟擲異常

  • 也就是我的預期結果就是這個異常

2.異常測試舉例

  • 失敗的異常測試(下述程式碼因為沒有異常,所以異常測試失敗)

    //這是一個測試結果會失敗的異常測試
    @Test(expectedExceptions = RuntimeException.class)
    public void runTimeExceptionFailed(){
        System.out.println("這是一個失敗的異常測試");
    }
    
  • 成功的異常測試(下述程式碼因為有異常,所以異常測試成功)

    //這是一個成功的異常測試
    @Test(expectedExceptions = RuntimeException.class)
    public void