(二)TestNG学习之路—注解及属性概览

目录

(一)TestNG学习之路—HelloWorld入门
(二)TestNG学习之路—注解及属性概览
(三)TestNG学习之路—TestNG.xml/YAML
(四)TestNG学习之路—注解详述之@Test
(五)TestNG学习之路—注解详述之参数化
(六)TestNG学习之路—注解详述之@Factory
(七)TestNG学习之路—注解详述之忽略测试
(八)TestNG学习之路—注解详述之并发
(九)TestNG学习之路—失败测试重跑
(十)TestNG学习之路—编码执行TestNG
(十一)TestNG学习之路—BeanShell高级用法
(十二)TestNG学习之路—注解转换器
(十三)TestNG学习之路—方法拦截器
(十四)TestNG学习之路—TestNG监听器
(十五)TestNG学习之路—依赖注入
(十六)TestNG学习之路—测试报告
(十七)基于TestNG+Rest Assured+Allure的接口自动化测试框架

前言

TestNG提供了诸多注解,允许开发/测试人员灵活地组织强大的测试用例。

注解概览

注解/属性 描述
@BeforeSuite 带@BeforeSuite注释的方法将在本套件中所有测试运行之前运行。
@AfterSuite 带@AfterSuite注释的方法将在本套件中所有测试运行之后运行。
@BeforeTest @BeforeTest注解的方法将在testNG.xml文件test标签内的所有类方法运行前执行。
@AfterTest @AfterTest注解的方法将在testNG.xml文件test标签内的所有类方法运行后执行。
@BeforeGroups 被@BeforeGroups注解的方法会在组列表中之前被调用。
@AfterGroups 被@AfterGroups注解的方法会在组列表中之后被调用。
@BeforeClass 在调用当前类中的第一个测试方法之前,将运行带@BeforeClass注释的方法。
@AfterClass 在运行当前类中的所有测试方法之后,将运行带@AfterClass注释的方法。
@BeforeMethod @BeforeMethod注释的方法将在每个测试方法之前运行。
@AfterMethod @AfterMethod注释的方法将在每个测试方法之后运行。
alwaysRun 对于在方法之前的调用(BeforeSuite,...除了beforeGroups),若为true,这个配置方法无视其所属的组而运行.对于在方法之后的调用(afterSuite, afterClass, ...),若为true, 这个配置方法会运行,即使其之前一个或者多个被调用的方法失败或者被跳过。
dependsOnGroups 方法依赖的组列表。
dependsOnMethods 方法依赖的方法列表。
enabled 是否执行注解的测试。
groups 类/方法所属的组列表。
inheritGroups 默认是true,则此方法会从属于在类级由@Test注解中所指定的组。举例如下:
@Test(groups = "Tomandy")
public class TestNGHelloWorld {
@BeforeClass(inheritGroups = false) //如果xml文件配置按Tomandy组执行的话,@BeforeClass注解的方法不会被执行
public void setUp(){
System.out.println("setUp!");
}
@Test(groups = "Tom")
public void helloWorld(){
System.out.println("My first TestNG testCase!");
}
}
onlyForGroups 只适用于@BeforeMethod和@AfterMethod。如果指定了,那么只有当相应的测试方法属于所列的组之一时,才会调用这个setup/teardown方法。
@DataProvider 将方法标记为测试方法提供数据。带@DataProvider注释的方法必须返回一个对象[][]。想要从这个DataProvider接收数据的@Test方法需要使用dataProvider属性,此属性值必须与@DataProvider注解中的名字相同。
@DataProvider(name = "casesProvider")
@Test(dataProvider = "casesProvider")
name dataProvider的名称。如果没有提供,默认为@DataProvider标注方法的名称。
parallel 默认为false,如果为true,将并行执行测试,可大大提高用例执行效率。
@Factory 将方法标记为工厂,该工厂返回将被TestNG用作测试类的对象。方法必须返回对象[]。
@Listeners 定义监听器。
value 继承org.testng.ITestNGListener的classe数组。继承IAnnotationTransformer和IAnnotationTransformer2的类不允许使用@Listeners,可通过testNG.xml定义。
@Parameters 给一个@Test方法传参。
value 方法参数的变量列表。
@Test 把一个类或者方法标记为测试的一部分。
alwaysRun 如果为true,则该测试方法依然会被运行即使其所依赖的方法执行失败。为false的话,则该测试方法会被skip如果其所依赖的方法执行失败。
dataProvider 此测试方法的dataProvider的名称。
dataProviderClass 查找dataProvider的类。如果没有指定,则在当前测试方法所在的类或者它的基类中去查。如果指定了该属性,则@DataProvider注解的方法需在指定的类上保持静态(static),举例如下:
@DataProvider(name = "casesProvider")
public static Object[][] caseProvider(){}

--------------------------------------------------------
@Test(dataProvider = "casesProvider", dataProviderClass = CasesDataProvider.class)
public void runCases(){}
dependsOnGroups 方法依赖的组列表。
dependsOnMethods 方法依赖的方法列表。
description 方法描述。
enabled 是否执行@Test()注解的测试。
expectedExceptions 期望测试方法抛出的异常列表。如果没有异常或在此列表中没有异常,则此测试将被标记为失败。
groups 类/方法所属的组列表。
invocationCount 调用方法的次数。
invocationTimeOut 当前测试中所有调用累计时间的最大毫秒数。如果invocationCount属性没有指定,那么此属性会被忽略。
priority 标注测试方法的优先级。较低的优先级将优先执行。
successPercentage 当前方法执行所期望的成功率。
singleThreaded 如果设置为true,那么这个测试类中的所有方法都保证在同一个线程中运行,即使测试当前使用parallel="methods"运行。这个属性只能在类级别使用,如果在方法级别使用,它将被忽略
timeOut 当前测试需要的最大毫秒数,超过该时间则执行失败。
threadPoolSize 此方法的线程池的大小。该方法将根据invocationCount值,启用多个线程调用。如果没有指定invocationCount,则忽略此属性。

举例说明

1、@BeforeXXX @AfterXXX

根据testng.xml文件配置,可了解测试级别为:suite -> test -> class -> method。test指的是testng.xml中的test 标签,而不是测试类里的一个 @Test。测试类里的@Test实际上对应的是method。所以在使用 @BeforeSuite、 @BeforeTest、 @BeforeClass、 @BeforeMethod这些标签的时候,它们的实际执行顺序也是按照上述级别来的。

  • 关于上述的注解,举例如下:
import org.testng.annotations.*;

@Test(groups = "Tomandy")
public class TestNGHelloWorld {
    @BeforeSuite(groups = "bfSuite")
    public void bfSuite(){
        System.out.println("TestNGHelloWorld BeforeSuite!");
    }

    @BeforeClass(enabled = false)  //不可执行
    public void bfClass(){
        System.out.println("TestNGHelloWorld BeforeClass!");
    }

    @BeforeTest(dependsOnGroups = "bfSuite")  //依赖bfSuite组
    public void bfTest(){
        System.out.println("TestNGHelloWorld BeforeTest!");
    }

    @BeforeGroups(groups = {"Tom"})
    public void bfGroups(){
        System.out.println("TestNGHelloWorld BeforeGroups!");
    }

    @BeforeMethod(alwaysRun = true,dependsOnGroups = "bfSuite")//依赖bfSuite组,alwaysRun
    public void bfMethod(){
        System.out.println("TestNGHelloWorld BeforeMethod!");
    }

    @Test(groups = "Tom")
    public void helloWorldTest(){
        System.out.println("TestNGHelloWorld Test!");
    }

    @AfterSuite
    public void afSuite(){
        System.out.println("TestNGHelloWorld AfterSuite!");
    }

    @AfterClass()
    public void afClass(){
        System.out.println("TestNGHelloWorld AfterClass!");
    }

    @AfterTest
    public void afTest(){
        System.out.println("TestNGHelloWorld AfterTest!");
    }

    @AfterGroups(groups = "Tom")
    public void afGroups(){
        System.out.println("TestNGHelloWorld AfterGroups!");
    }

    @AfterMethod
    public void afMethod(){
        System.out.println("TestNGHelloWorld AfterMethod!");
    }

}

testNG.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Default Suite">  <!-- 可定义测试套件名称 -->
    <test name="TestNG">

        <groups>
            <run>
                <include name="Tomandy"/>
            </run>
        </groups>
        <classes >
            <class name="TestNGHelloWorld"/>
        </classes >
    </test> <!-- TestNG -->
</suite> <!-- Default Suite -->

运行结果如下:

TestNGHelloWorld BeforeSuite!
TestNGHelloWorld BeforeTest!
TestNGHelloWorld BeforeGroups!
TestNGHelloWorld BeforeMethod!
TestNGHelloWorld Test!
TestNGHelloWorld AfterMethod!
TestNGHelloWorld AfterGroups!
TestNGHelloWorld AfterClass!
TestNGHelloWorld AfterTest!
TestNGHelloWorld AfterSuite!

===============================================
Default Suite
Total tests run: 1, Failures: 0, Skips: 0
===============================================
  • 超类上的注解,子类也将得到继承。在这种情况下,TestNG保证“@Before”方法按照继承顺序执行(首先是最高的超类,然后向下继承链),以及“@After”方法按照相反的顺序执行(向上继承链)。
    父类:
import org.testng.annotations.*;

public class Car {
    @BeforeClass
    public void beforeClass() {
        System.out.println("Car BeforeClass");
    }

    @Test
    public void carTest() {
        System.out.println("Car Test");
    }

    @AfterClass
    public void afterClass() {
        System.out.println("Car AfterClass");
    }
}

子类:

import org.testng.annotations.*;

public class BMW extends Car{

    @Test
    public void BMWTest() {
        System.out.println("BMW Test");
    }

    @AfterClass
    public void afterClass() {
        System.out.println("BMW AfterClass");
    }
}

运行子类输出如下:

Car BeforeClass
BMW Test
Car Test
BMW AfterClass

===============================================
Default Suite
Total tests run: 2, Failures: 0, Skips: 0
===============================================

由于beforeClass方法未在子类实现,因此是子类调用父类中的beforeClass方法,AfterClass和Test也是一样,因此,一些公共操作,可以统一在父类中封装实现,子类只实现各自不同的方法。

2、@DataProvider @Factory @Listeners @Parameters @Test

该部分注解后续文章再做详述。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容

  • 感谢原作者的奉献,原作者博客地址:http://blog.csdn.net/zhu_ai_xin_520/arti...
    狼孩阅读 14,006评论 1 35
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,510评论 25 707
  • 1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?答:可以有多个类,但只能有一个publ...
    岳小川阅读 908评论 0 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,599评论 18 139
  • 村里有一户人家,孩子要结婚,我去帮忙写喜联。 有个打杂的后生很好奇,凑过脑袋来看我和一位老者写字,一边看一边不自觉...
    绣源河水清且浅阅读 953评论 0 1