testng里边的注释是如何应用的?
举最简单的两个例子:
@Test 这个注解
AnnotationHelper.findMethodsWithAnnotation
{
这里做最基本的判断:
1、先把有注解的找出来
2、有注解的方法不能有返回值,只能是void
3、给所有的测试方法编号
}
TestNGMethodFinder.getTestMethods–>
TestClass.initMethods()–>
Testrunner.initMethods() –>testRunner的构造函数
@Dataprovoider 这个注解
findDataProvider()–>
{
通过反射获取类中有@Dataprovider的类名跟方法名
}
Parameters.handleParameters();
这里就是按照传过来的dataprovider来初始化整个testmethod的执行的参数
if (null != dataProviderHolder) {
int parameterCount = testMethod.getConstructorOrMethod().getParameterTypes().length;
for (int i = 0; i < parameterCount; i++) {
String n = "param" + i;
allParameterNames.put(n, n);
}
parameters = MethodInvocationHelper.invokeDataProvider(
instance, /* a test instance or null if the dataprovider is static*/
dataProviderHolder.method,
testMethod,
methodParams.context,
fedInstance,
annotationFinder);
Iterator<Object[]> filteredParameters = filterParameters(parameters,
testMethod.getInvocationNumbers());
result = new ParameterHolder(filteredParameters, ParameterOrigin.ORIGIN_DATA_PROVIDER,
dataProviderHolder);
}
MethodInvocationHelper.invokeDataProvider
这里就是最基本的调用dataprovider的返回实现。也是通过注释实现的。
1、先做错误的判断处理
2、根据指定的分割符。来封装返回的参数列表
3、这里有个数据结构,是testng重写了的:internal.collections.Pair
protected static Iterator<Object[]> invokeDataProvider(Object instance, Method dataProvider,
ITestNGMethod method, ITestContext testContext, Object fedInstance,
IAnnotationFinder annotationFinder) {
Iterator<Object[]> result = null;
final ConstructorOrMethod com = method.getConstructorOrMethod();
// If it returns an Object[][], convert it to an Iterable<Object[]>
try {
List<Object> lParameters = Lists.newArrayList();
// Go through all the parameters declared on this Data Provider and
// make sure we have at most one Method and one ITestCont