Ethon

为什么要有方法,因为懒惰是一种美德。

   :: 首页  :: 新随笔  ::  ::  :: 管理

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
===============================================

 

posted on 2019-03-30 16:48  Ethon  阅读(716)  评论(0编辑  收藏  举报