TestNg框架源码解析

TestNG是一个测试框架,其灵感来自JUnit和NUnit,但引入了一些新的功能,使其功能更强大,使用更方便。
TestNG是一个开源自动化测试框架;TestNG表示下一代(Next Generation的首字母)。 TestNG类似于JUnit(特别是JUnit 4),但它不是JUnit框架的扩展。它的灵感来源于JUnit。它的目的是优于JUnit,尤其是在用于测试集成多类时。TestNG消除了大部分的旧框架的限制,使开发人员能够编写更加灵活和强大的测试。 因为它在很大程度上借鉴了Java注解(JDK5.0引入的)来定义测试,它也可以显示如何使用这个新功能在真实的Java语言生产环境中。

TestNG的特点

l 注解
l TestNG使用Java和面向对象的功能
l 支持综合类测试(例如,默认情况下,不用创建一个新的测试每个测试方法的类的实例)
l 独立的编译时测试代码和运行时配置/数据信息
l 灵活的运行时配置
l 主要介绍“测试组”。当编译测试,只要要求TestNG运行所有的“前端”的测试,或“快”,“慢”,“数据库”等
l 支持依赖测试方法,并行测试,负载测试,局部故障
l 灵活的插件API
l 支持多线程测试

org.testng
testng
6.8
test

运行示例
TestNg框架源码解析_第1张图片
TestNg的对象注入
需要继承AbstractTestNGSpringContextTests类。
TestNg框架源码解析_第2张图片
四个元注解 @Target,@Retention,@Documented,@Inherited,是专门用来定义注解的注解

@Target 表示该注解用于什么地方,可能的值在枚举类 ElemenetType 中,包括:
ElemenetType.CONSTRUCTOR-----------构造器声明
ElemenetType.FIELD -----------------------域声明(包括 enum 实例)
ElemenetType.LOCAL_VARIABLE------- 局部变量声明
ElemenetType.METHOD ------------------方法声明
ElemenetType.PACKAGE --------------------------------- 包声明
ElemenetType.PARAMETER ------------------------------参数声明
ElemenetType.TYPE------------------------ 类,接口(包括注解类型)或enum声明
@Retention 表示在什么级别保存该注解信息。可选的参数值在枚举类型 RetentionPolicy 中:
RetentionPolicy.SOURCE ------------------注解将被编译器丢弃
RetentionPolicy.CLASS ----------- ---------注解在class文件中可用,但会被VM丢弃
RetentionPolicy.RUNTIME -------将在运行期也保留注释,因此可以通过反射机制读取注解的信息。
@Documented 将此注解包含在 javadoc 中 ,它代表着此注解会被javadoc工具提取成文档。在doc文档中的内容会因为此注解的信息内容不同而不同。相当与@see,@param 等。
@Inherited 允许子类继承父类中的注解。

TestNG的常用注解
@BeforeSuite
@AfterSuite
@BeforeTest
@AfterTest
@BeforeClass
@AfterClass
@BeforeMethod
@AfterMethod
@Test alwaysRun控制是否每次都执行,dependsOnMethods是一种依赖,依赖某个方法执行,dataProvider可以指定测试数据。
自定义注解
TestNg框架源码解析_第3张图片
实现ITestListener接口
在这里插入图片描述
ITestListener接口定义
TestNg框架源码解析_第4张图片
调用方式,加注解,通过@Listeners注解嵌入自己的处理逻辑
TestNg框架源码解析_第5张图片
AbstractTestNGSpringContextTests的实现

对集成了spring TestContext Framework与TestNG环境中的ApplicationContext测试支持的基础测试类进行了抽象。当你继承AbstractTestNGSpringContextTests时,就可以访问到下列protected的成员变量:applicationContext:使用它进行显式的bean查找或者测试整个上下文的状态。
在这里插入图片描述
ApplicationContextAware示例,调用方自身也要被容器实例化,才能拿到实例化的上下文ApplicationContext
TestNg框架源码解析_第6张图片
WebApplicationContext也是对ApplicationContext的一种扩展
TestNg框架源码解析_第7张图片
BeanFactory是根本。DefaultListableBeanFactory是基本实现。XmlBeanFactory是扩展。
在这里插入图片描述
TestNg框架源码解析_第8张图片
资源的定位,加载以及注册。

AbstractTestNGSpringContextTests的初始化以及监听的注册
在这里插入图片描述
委派模式(Delegate)

委派模式(Delegate)是面向对象设计模式中常用的一种模式。这种模式的原理为类B和类A是两个互相没有任何关系的类,B具有和A一模一样的方法和属性;并且调用B中的方法,属性就是调用A中同名的方法和属性。B好像就是一个受A授权委托的中介。第三方的代码不需要知道A的存在,也不需要和A发生直接的联系,通过B就可以直接使用A的功能,这样既能够使用到A的各种公能,又能够很好的将A保护起来了。一举两得,岂不很好!

通过DependencyInjectionTestExecutionListener创建测试类对象
TestNg框架源码解析_第9张图片
在这里插入图片描述
AbstractTransactionalTestNGSpringContextTests

继承该类的测试用例在spring管理的事务中进行,测试完后对数据库的记录不会造成任何影响。你对数据库进行一些操作后,它会自动把数据库回滚,这样就保证了你的测试对于环境没有任何影响。

IHookable

IHookable 监听器提供了类似与面向方面编程(AOP)中的Around Advice 的功能。它在测试方法执行前后提供了切入点,从而使用户能够在测试方法运行前后注入特定的功能。例如,用户可以在当前测试方法运行前加入特定的验证逻辑以决定测试方法是否运行或者跳过,甚至覆盖测试方法的逻辑。下面是 IHookable 监听器要求实现的方法签名。

void run(IHookCallBack callBack, ITestResult testResult)

如要运行原始测试方法逻辑,需要调用 runTestMethod 方法。

callBack.runTestMethod(testResult);

TestNg多线程示例
支持方法依赖调用
TestNg框架源码解析_第10张图片

你可能感兴趣的:(debug,源码,框架)