TestNG-自动化测试框架

一、TestNG简介

TestNG是一套开源的单元测试框架,它的灵感来源于JUnit,但其功能比JUnit强大,它支持更多的注解、并行测试、更多的参数化方法等。TestNG和JUnit都是java中常用的单元测试框架,二者的共同点有:

  • 都是基于注解的测试框架
  • 都可以对java代码进行单元测试
  • 都支持断言机制

TestNG相较于JUnit有如下特点:

  • TestNG支持更多的注解;
  • TestNG支持并行测试,在测试大量数据时运行速度更快
  • TestNG可以在xml文件中配置测试用例,并且可以实现测试用例的分组执行、批量执行等功能
  • TestNG支持更多的参数化方法,比如@DataProvider
  • TestNG可以在报告中生成时间轴图表,方便测试结果的分析

TestNG依赖

        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.14.3</version>
            <scope>test</scope>
        </dependency>

二、TestNG注解

注解 描述
@BeforeSuite 标记的方法会在当前测试套件(Suite)中的所有测试用例开始运行之前执行,仅运行一次
@AfterSuite 标记的方法会在当前测试套件中的所有测试用例运行结束后执行,仅运行一次。
@BeforeClass 在调用当前类的第一个测试方法之前运行,注释方法仅运行一次
@AfterClass 在调用当前类的所有方法之后运行,注释方法仅运行一次
@BeforeTest 注解的方法将在属于test标签内的类的所有测试方法运行之前运行
@AfterTest 注解的方法将在属于test标签内的类的所有测试方法运行之后运行
@BeforeMethod 注解方法将在每个测试方法之前运行
@AfterMethod 注解方法将在每个测试方法之后运行
@DataProvider 标记一个提供测试数据的方法。 注解方法必须返回一个Object [] [],其中每个Object []可以被分配给测试方法的参数列表。 要从该DataProvider接收数据的@Test方法需要使用与此注解名称相同的dataProvider名称
@Factory 将一个方法标记为工厂,返回TestNG将被用作测试类的对象。 该方法必须返回Object []
@Listeners 定义测试类上的侦听器
@Parameters 描述如何将参数传递给@Test方法
@Test 将类或方法标记为测试的一部分,此标记若放在类上,则该类所有公共方法都将被作为测试方法。属性有:alwaysRun、DataProvider、DataProviderClass、dependsOnGroups、dependsOnMethods、description、enabled、expectedException、groups、invocationCount、invocationTimeOut、priority、successPercentage、singleThreaded、timeOut、threadPoolSize

执行顺序:@BeforeSuite >@BeforeTest >@BeforeClass >@BeforeMethod

注解的执行顺序

@BeforeSuite
    public  void beforeSuite(){
        System.out.println("Suite-最先执行");
    }
    @AfterSuite
    public  void afterSuite(){
        System.out.println("Suite-最后执行");
    }
    @BeforeTest
    public  void beforeTest(){
        System.out.println("Test-最先执行");
    }
    @AfterTest
    public  void afterTest(){
        System.out.println("Test-最后执行");
    }
    @BeforeClass
    public static void beforeClass(){
        System.out.println("Class-最先执行");
    }
    @AfterClass
    public static void afterClass(){
        System.out.println("Class-最后执行");
    }
    @BeforeMethod
    public static void before(){
        System.out.println("method-方法之前");
    }
    @AfterMethod
    public static void after(){
        System.out.println("method-方法之后");
    }
    @Test
    public void test1(){
        System.out.println("方法001");
    }
    @Test
    public void test2(){
        System.out.println("方法002");
    }
    @Test
    public void test3(){
        System.out.println("方法003");
    }

运行结果
TestNG-自动化测试框架_第1张图片

TestNG断言

用于对测试结果进行验证的方法,可以判断测试是否通过

1.assertEquals判断两个对象是否相等,如果步行等则抛出异常AssertionError

2.assertTrue判断给定条件是否为true,如果不为true则抛出异常AssertionError

示例

    @Test
    public void test01(){
        System.out.println("用例001");
        Assert.assertEquals(1,2,"期望的是2,实际是1");
    }
    @Test
    public void test02(){
        System.out.println("用例002");
        Assert.assertEquals("test","test");
    }
    @Test
    public void test03(){
        System.out.println("用例003");
        Assert.assertTrue(1==2);
    }
    @Test
    public void test04(){
        System.out.println("用例004");
        Assert.assertTrue(1==1);
    }

忽略测试

测试过程中,遇到还没解决的问题,可以先忽略,使用注解@Ignore标注不执行该方法。

    @Test
    @Ignore
    public void test01(){
        System.out.println("用例001");
        Assert.assertEquals(1,2,"期望的是2,实际是1");
    }

参数化测试

@DataProvider,@Test和@DataProvider必须一起使用,DataProvider的作用:

  • 在执行用例的时候DataProvider迭代的每组数据都是作为一个用例执行
  • 在测试数据有规律的情况下,免去了添加testXML测试数据的烦恼,直接将测试数据按个或者组,放到DataProvider中即可。

实现步骤

1.定义一个函数,使用@DataProvider注解,给@DataProvider定义一个名称,该函数返回一个二维对象数组

2.使用这个参数的方法,在@Test中指定dataProvider的名称

@DataProvider(name="test")
    Object[][] parmas(){
       return new Object[][]{
               {"tom",10},
               {"jerry",11}
       };
    }
    @Test(dataProvider = "test")
    public void test(String name,int age){
        System.out.println(name+","+age);
    }

Test注解属性

执行顺序:priority,设置用例执行顺序

    @Test(priority = 2)
    public void test01(){
        System.out.println("用例001");
        Assert.assertTrue(1==1);
    }
@Test(priority = 1)
    public void test02(){
        System.out.println("用例002");
        Assert.assertEquals("test","test");
    }

超时:timeOut,超时设置,超过设定时间则执行失败,报异常ThreadTimeoutException

@Test(timeOut = 1000)
    public void test01() throws InterruptedException {
        Thread.sleep(2000);
        System.out.println("用例001");
    }

依赖:dpendsOnMethods,如果被依赖方法执行失败,有依赖关系的方法不会被执行,比如上传失败,就不会执行下载操作。

dpendsOnMethods和@BeforeMethod的区别:BeforeMethod在每个方法执行前都要执行,而dpendsOnMethods只在依赖的方法前执行

    @Test
    public void test01(){
        System.out.println("被依赖的方法001");
        Assert.assertTrue(false);
    }
    @Test(dependsOnMethods = {"test01","test03"})
    public void test02(){
        System.out.println("依赖test01和test03方法");
    }
    @Test
    public void test03(){
        System.out.println("被依赖的方法002");
    }

你可能感兴趣的:(TestNG-自动化测试框架)