简介
~~注解 以及XML文件testng.xml配置 commandLine~~
一、写case的常规步骤:
1. 编写测试逻辑代码,并注入testng的注解(如@Test)
2. 在testng.xml或者build.xml中添加test信息(如class name-TestClass , the groups等你希望执行的Test信息)
3. Run TestNG
二、xml文件定义
before/after 钩子函数
包含一个或多个tests
包含一个或多个TestNG classes
包含一个或多个test methods TestNG class 包含至少一个TestNG annotation
TestMethod java method配置了@Test注解
三、Test NG常用注解及其属性参数
-
测试集注解
before/after [Suite | Test | Groups | Class | Method]
属性:
a. alwaysRun
b. dependsOnGroups :@Test() 依赖的组 测试method级别
c. dependsOnMethods: @Test() 依赖的方法组 测试method级别
d. enabled
E. groups: class级别 及 method级别
F. inheritGroups: class级别
G. onlyForGroups
-
数据集注解
@DataProvider:必须返回一个二维数组,一维数组指定参数list For test method(测试方法调用次数与这个大小相同),二维为参数具体值(和测试方法中的参数类型和个数相匹配)
并在method级别,@Test(dataProvider = "",dataProviderClass=xxx.class)
@DataProvider(name=' ', parallel=True)被标记的方法也可接收参数(如java.lang.reflect.Method),可以根据不同的方法返回不同的数据;
a. 如果name没有指定,默认采用被dataProvider注解标注的方法名
b. 如果设置为True,为并行
-
@Factory
确保只调用一次 在所有的@Factory方法调用之后,testng才会开始执行配置和测试方法 允许运行时,动态测试 标记一个方法为工厂方法会被用在Test classes,必须返回一个一维数组 eg. 比如说,在方法中调用被执行的测试类。TESTNG会自动执行标记@Test的测试类 最大好处是可以在初始化的时候将参数传给测试类
-
@Listeners
属性:value
-
@Parameters
属性: value
-
@Test
数据 + 依赖 + 可执行?+ 预期异常 + 预期通过率 + 超时控制 + 优先级 +并发
属性:
alwaysRun
dataProvider
dataProviderClass
dependsOnGroups
dependsOnMethods
description
enabled
expectException
groups
invocationCount
invocationTimeOut
priority
successPercentage :预期通过率
singleThreaded
TimeOut
threadPoolSize
五、 Test Methods 、 Test classes 、 Test groups
5.1 Test methods -如果方法想返回值return
标记了@Test 的方法如果有返回值,会被忽略,除非allow-return-value=true in testng.xml
5.2 Test groups
如果在不同的系统,如Linux,windows上执行的case不同
@Test(groups={"windows.checkintest"})
@Test(groups={"linux.checkintest"})
5.3 Method groups
5.4 Groups of groups
5.5 Exclusion groups
5.6 Partial groups
属于类级别一个组,不属于方法级别另一个组
5.7 Parameters
@Parameters({"first-name"})
@Test
@public void testNonExistentParameters(@Optional("mysql") String db){...}
在XML文件中在指定具体的value值
对于before method也可以使用此方法
如果没有在XML文件中找到value值,就取optional标记的默认值
应用范围:
1. @Test 、 @Before/@after 、@Factory
2. On at most one constructor of your test class
5.8 Paramters with Dataprovider
如果需要把 data provider 应用在不同的class中,他应该是一个static 方法或者 class 只有无参构造器,并指定dataProviderClass
5.9 Parameters in reports
6.0 Dependencies
以一个固定顺序,执行test case
在执行更多case之前,确保test methods完成或者通过率达到目标值
6.0.1 Dependencies with annotations
可以使用方法依赖或者组依赖的注解,接受.*表达式;
Hard dependencies:前置方法必须都跑了而且成功,后续方法不再调用,并在报告中标记跳过
Soft dependencies: alwaysRun = True
XML文件中配置,
6.1 Factories
应该使用@Factory 需要取了解取
六 Class level annotations
@Test 可用在类级别 --> 类中所有public方法(当然方法中标记了@Test也可)-->test method
7.1 Ignore Testing
@Ignore -》class
@ignore -》 pacakge 包名上,其继承类也被ignore
7.2 Parallelism and time-outs
you can instruct TestNG to run you tests in separate threads in various ways.
线程并发处理,加快case处理速度
1. Parallel suites
开启3个线程,不同的测试集走不同的线程
命令行:java org.testng.TestNG -suitethreadpoolsize 3 testng1.xml testng2.xml testng3.xml
parallel = "methods" : TestNG 是让每一个test method都在独立的线程运行,有依赖方法也是
parallel = "tests" : tag下的所有方法在同一线程中跑,但是每一个tag会在独立的线程跑
parallel = "classes" : 在同一个class下methods会在同一个线程跑,但每一个class会在不同的线程跑
parallel = " instances ":
timeOut:在并发或者不并发的情况下都会生效
@Test(threadPoolSize = 3, invocationCount = 10 , timeOut=10000)
public void testServer(){}
//这个例子中,testServer会在三个线程中完成10次的调用,超时时间设置为10s,防止线程block住
8.2 Rerunning failed tests
在suite中如果case失败了,TestNG会创建一个 testng-failed.xml
当case失败后,如何重跑?
1. bind a retry analyzer -》 实现这个接口org.testng.IRetryAnalyzer
@overrider
public boolean retry(ITestResult result){
....
return true;
}
2. 在@Test(retryAnalyzer = LocalRetry.class)
9.2 Running TestNG programmatically
从代码中运行,而不是通过testng.xml
TestListenerAdapter tla = new TestListenerAdapter();
TestNG testng = new TestNG();
testng.setTestClasses(new Class[] {Run2.class});
testng.addListener(tla);
testng.run();
// TestListenerAdapter
// 1. 创建TestNG object and runs the test class Run2
// 2. 加入TestListener
实现 ITestListener 接口,有丰富的钩子函数,对case开始,通过,失败,进行处理或者数据收集
从testng.xml调用,也可以通过创建虚拟的testng.xml来执行
XmlSuite suite = new XmlSuite();
suite.setName("TmpSuite");
XmlTest test = new XmlTest(suite);
List classes = new ArrayList();
classes.add(new XmlClass("test.failures.Child"));
test.setXmlClasses(classes);
9.3 Annotation Transformers
如果在运行时,动态的改变注解的value值
public interface IAnnotationTransformer{
//实现这个接口,运行时动态的改变所有注解的内容,比如setInvocationCount(5)
public void transform(ITest annotation,Class testClass,Constructor testConstructor , Method testMethod);
}
TestNG tng = new Test NG();
tng. setAnnotationTransformer(new MyTransformer());
IAnnotationTransformer only lets you modify a @Test annotation
modify another TestNG annotation (a configuration annotation, @Factory or @DataProvider), use an IAnnotationTransformer2
9.4 Method Interceptors
9.5 TestNG Listeners
There are several interfaces that allow you to modify TestNG's behavior
IAnnotationTransformer 注解转换器
IAnnotationTransformer2
IHookable 若测试类实现了这个接口,当@Test方法被发现时,它的run()方法将会调用来代替@Test方法
IMethodInterceptor 用于修改TestNG即将运行的测试方法列表
IReporter
ISuiteListener
ITestListener 测试运行监听器
IExecutionListener 监听TestNG运行的启动和停止
IAlterSuiteListener:Sometimes you may need to just want to alter a suite (or) a test tag in a suite xml in runtime without having to change the contents of a suite file.
1. 在xml文件中指定Listener
2. @Listeners({})
public class MyTest{
//...extends org.testng.ITestNGListener except IAnnotationTransformer and IAnnotationTransformer2
}
IExecutionListener、
ITestListerner、
IInvokeMethodListener、
IRetryAnalyzer、
ItestResult、
TestListenerAdapter 保存了所有数据
IReport
Dependency injection
- native (performed by TestNG itself)
比如说DataProvider就是DI的一种实现 :ITestContext java.lang.reflect.Method
ITestContext :@Before和@Test 装饰的方法可以传入这参数
ITestResult: @AfterMethod
XMLTest
java.lang.reflect.Method
- external (performed by a dependency injection framework such as Guice)
Test results
Logging and results
The results of test run are created in a file called index.html
1. Listeners : org.testng.ITestListener
2. Reporters : org.testng.IReporter
The IReporter instance receives a list of objects that describe the entire test run
实时报告:ITestListener
完成报告:use an IReporter
public void generateReport(List suites, String outputDirectory)
Reporter.log("M3 WAS CALLED"); 在报告中输出日志
XML Reports
十、 使用策略
该如何使用testng带来最高的产出?
- 如何保证测试结果准确化,数据化,可分析化,可视化
- 如何保证测试代码高效,可用,稳定,异常监控以及异常时的处理逻辑
- 保证测试代码不影响最终结果的判断
- 测试代码模板化,提高产出
- 当case数不断增加时,如何使得结构不臃肿
参考链接:https://testng.org/doc/index.html