接口自动化测试框架TestNg

什么是TestNG

TestNG,即Testing Next Generation,它派生自JUnit和NUnit,除了继承了两者的优势之外,又额外的发展出了一些新的功能,在参数化测试,依赖测试和套件测试(分组概念)方面更加突出。 TestNG用于高级测试和复杂集成测试。

为什么用TestNG

TestNG有以下优点:

  • 生成美观易读的测试报告

  • 注解 使测试变得更加方便

  • 可以更轻松地对测试用例进行分组和指定执行顺序

  • 支持并发测试

  • 生成日志

  • 数据驱动测试

  • 主流工具的成熟集成

分组测试

相比junit的TestCase/TestSuite,TestNG有suite/test/test method三个级别,即将test/test method明确区分开了。

  • suite由xml文件描述。它包含一个或多个测试并被定义为标签
  • test由描述幷包含一个或者多个TestNG类
  • TestNG类是包含至少一个TestNG annotation的java类,由标签描述幷包含一个或多个测试方法

测试类:

public class Testng {
    @Test(groups = { "functest", "checkintest" })
    public void testMethod1() {
        System.out.println("testMethod1");
    }

    @Test(groups = {"functest", "checkintest"} )
    public void testMethod2() {
        System.out.println("testMethod2");
    }

    @Test(groups = { "functest" })
    public void testMethod3() {
        System.out.println("testMethod3");
    }
}

testng.xml文件:

<?xml version="1.0" encoding="UTF-8" ?>
<suite name="TestNG">
    <test name="Test1">
        <groups>
            <run>
                <include name="checkintest"/>
            </run>
        </groups>
        <classes>
            <class name="com.example.testng_demo.Testng"/>
        </classes>
    </test>
</suite>

意思就是执行Testng类中groups包含checkintest的方法,testMethod3这个方法的groups不含checkintest,所以不会执行;

依赖执行

用例间依赖关系,按序执行:

public class DependsTest {
    @Test
    public void setupEnv(){
        System.out.println("this is setup Env");
    }
    //setupEnv()方法会在testMessage()方法前执行
    @Test(dependsOnMethods = {"setupEnv"})
    public void testMessage(){
        System.out.println("this is test message");
    }
}

说到按序执行,我们也可以把一些初始化/ 收尾工作的测试方法用@BeforeSuite/@AfterSuite,@BeforeGroups/@AfterGroups, @BeforeTest/@AfterTest等标记。

参数化测试

TestNG提供了2种传递参数的方式。

第一种: testng.xml 方式使代码和测试数据分离,方便维护,适用于一个用例,需要多个相同参数(值不同)来验证的情况。
第二种:@DataProvider能够提供比较复杂的参数。

如下例:

第一种,@Parameters({ “merchantNo” }) 会去testng.xml里取到这个merchantNo对应的value,放到传参merchant中。

public class TestParameter {
    // @Parameters注解内对应的参数名称和配置文件中的merchantNo必须是相同
    // 如果在配置文件中找不到参数名称为“merchantNo”的参数,则测试方法将接收@Optional注解中指定的默认值:“chen001”
    @Parameters({ "merchantNo" })
    @Test
    public void testString(@Optional("chen001")String merchant) {
        System.out.println("Invoked testString " + merchant);
        assert "chen001".equals(merchant);
    }
} 

对应的testng.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<suite name="TestNg">
    <parameter name="merchantNo"  value="chen001"/>
    <test name="TestParameter">
        <classes>
            <class name="com.example.testng_demo.TestParameter"/>
        </classes>
    </test>
</suite>

第二种,注解@DataProvider在参数化测试中起到重要的作用,该注解下的函数返回数据类型有两种,一种返回类型是Iterator<Object[]>,还一种返回类型是 Object[][],看例子如何实现:

@DataProvider函数,需要定义属性name

	@DataProvider(name = "testcase")
    public Iterator <Object[]> createData2() {
        List <Object[]> datas = new ArrayList <Object[]>();
        datas.add(new Object[]{"payment"});
        datas.add(new Object[]{"refund"});
        datas.add(new Object[]{"check"});
        return datas.iterator();
    }
 	@DataProvider(name = "testcase2")
    public Object[][] createData1() {
        return new Object[][] {
                { "Cedric", new Integer(36) },
                { "Anne", new Integer(37)},
        };
    }

@Test测试用例,属性dataProvider需要指定对应的@DataProvider名称

    @Test(dataProvider = "testcase")
    public void verifyData2(String type) {
        System.out.println(type);
    }
	@Test(dataProvider = "testcase2")
    public void verifyData1(String n1, Integer n2) {
        System.out.println(n1 + " " + n2);
    }

输出:

Cedric : 36
Anne : 37
payment
refund
check

提供数据方式

在这里插入图片描述

异常处理

TestNG通过 @Test(expectedExceptions) 来判断期待的异常, 也可以判断Error Message

@Test(expectedExceptions = IllegalArgumentException.class,expectedExceptionsMessageRegExp = "非法参数")
public void testException(){
    throw new IllegalArgumentException("非法参数");
}

多线程运行

// 共3个线程调用了10次该方法
@Test(threadPoolSize = 3, invocationCount = 10,timeOut = 3000)
public void testThread(){
    System.out.println(Thread.currentThread().getId());
}
invocationCount——-表示执行的次数 
threadPoolSize——-表示线程池内线程的个数 
timeOut——-超时时间-毫秒

测试报告及自定义日志

在这里插入图片描述

TestNG中的测试用例编写过程

在TestNG中编写测试非常简单,基本上包括以下步骤:

  • 第1步 - 编写测试的业务逻辑
  • 第2步 - 在代码中插入TestNG注解
  • 第3步 - 在testng.xml文件中添加有关测试的信息(例如,类名,方法名,组名等)
  • 第4步 - 运行TestNG

TestNG 常用注解

  • @BeforeSuite:在此套件中的所有测试运行之前,将运行带注释的方法。

  • @AfterSuite:在此套件中的所有测试运行后,将运行带注释的方法。

  • @BeforeTest:在运行属于标记内的类的任何测试方法之前,将运行带注释的方法。

  • @AfterTest:在标记内的类的所有测试方法都运行之后,将运行带注释的方法。

  • @BeforeGroups:此配置方法之前将运行的组列表。保证在调用属于任何这些组的第一个测试方法之前不久运行此方法。

  • @AfterGroups:此配置方法将在之后运行的组列表。保证在调用属于任何这些组的最后一个测试方法后不久运行此方法。

  • @BeforeClass:在调用当前类中的第一个测试方法之前,将运行带注释的方法。

  • @AfterClass:在运行当前类中的所有测试方法之后,将运行带注释的方法。

  • @BeforeMethod:带注释的方法将在每个测试方法之前运行。

  • @AfterMethod:带注释的方法将在每个测试方法之后运行。

  • @Test:带注释的方法是测试用例的一部分。

生命周期:

@BeforeSuite->@BeforeTest->@BeforeClass->{@BeforeMethod->@Test->@AfterMethod}->@AfterClass->@AfterTest->@AfterSuite

TestNG常用断言:

导入Assert包:
import static org.testng.Assert.*;

  • assertTrue:判断是否为True。

  • assertFalse:判断是否为false。

  • assertSame:判断引用地址是否相同。

  • assertNotSame:判断引用地址是否不相同。

  • assertNull:判断是否为null。

  • assertNotNull:判断是否不为null。

  • assertEquals:判断是否相等,Object类型的对象需要实现haseCode及equals方法。

  • assertNotEquals:判断是否不相等。

  • assertEqualsNoOrder:判断忽略顺序是否相等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章