initializeConfiguration
我们知道TestNG先执行了初始化,即执行了initializeEverything方法,这个方法内部有6个小方法,前面两节我们已经讲完了 initializeSuitesAndJarFile 方法,现在我们开始讲说下第二个方法initializeConfiguration
private void initializeConfiguration() {
//通过-objectfactory参数命令传入 不传此参数为null
ITestObjectFactory factory = m_objectFactory;
//
// Install the listeners found in ServiceLoader (or use the class
// loader for tests, if specified).
// 注册jar包中 ITestNGListener监听器 此方法主要是通过SPI方式查找
addServiceLoaderListeners();
//
// Install the listeners found in the suites
// 遍历注册XmlSuite中的监听器
for (XmlSuite s : m_suites) {
addListeners(s);
//
// Install the method selectors
// m_methodSelectors 这个属性在xml解析中完成 这里获取的是Suite节点的<method-selectors>
for (XmlMethodSelector methodSelector : s.getMethodSelectors()) {
//注册方法选择器
addMethodSelector(methodSelector.getClassName(), methodSelector.getPriority());
addMethodSelector(methodSelector);
}
//
// Find if we have an object factory
//
if (s.getObjectFactory() != null) {
if (factory == null) {
factory = s.getObjectFactory();
} else {
throw new TestNGException("Found more than one object-factory tag in your suites");
}
}
}
//设置IConfiguration的值
m_configuration.setAnnotationFinder(new JDK15AnnotationFinder(getAnnotationTransformer()));
m_configuration.setHookable(m_hookable);
m_configuration.setConfigurable(m_configurable);
m_configuration.setObjectFactory(factory);
m_configuration.setAlwaysRunListeners(this.m_alwaysRun);
m_configuration.setExecutorFactory(getExecutorFactory());
}
addServiceLoaderListeners
addServiceLoaderListeners方法主要是通过SPI方式查找监听器
此方法内部有1个方法 需要重点关注 addListener
/** Using reflection to remain Java 5 compliant. */
private void addServiceLoaderListeners() {
//ServiceLoader 加载所有配置监听器
Iterable<ITestNGListener> loader =
m_serviceLoaderClassLoader != null
? ServiceLoader.load(ITestNGListener.class, m_serviceLoaderClassLoader)
: ServiceLoader.load(ITestNGListener.class);
for (ITestNGListener l : loader) {
Utils.log("[TestNG]", 2, "Adding ServiceLoader listener:" + l);
addListener(l);
//此方法内部比较简单 就是把监听放到一个Map中,key为监听对应的class value为自己本身
addServiceLoaderListener(l);
}
}
先看addListener方法
//
/**
* 方法比较简单就是判断是不是内部监听器 然后调用maybeAddListener方法
*/
public void addListener(ITestNGListener listener) {
if (listener == null) {
return;
}
if (listener instanceof IExecutionVisualiser) {
IExecutionVisualiser visualiser = (IExecutionVisualiser) listener;
maybeAddListener(m_executionVisualisers, visualiser);
}
if (listener instanceof ISuiteListener) {
ISuiteListener suite = (ISuiteListener) listener;
maybeAddListener(m_suiteListeners, suite);
}
if (listener instanceof ITestListener) {
ITestListener test = (ITestListener) listener;
maybeAddListener(m_testListeners, test);
}
if (listener instanceof IClassListener) {
IClassListener clazz = (IClassListener) listener;
maybeAddListener(m_classListeners, clazz);
}
if (listener instanceof IReporter) {
IReporter reporter = (IReporter) listener;
maybeAddListener(m_reporters, reporter);
}
//IAnnotationTransformer 只能设置一次
if (listener instanceof IAnnotationTransformer) {
setAnnotationTransformer((IAnnotationTransformer) listener);
}
//m_methodInterceptors为一个List
if (listener instanceof IMethodInterceptor) {
m_methodInterceptors.add((IMethodInterceptor) listener);
}
if (listener instanceof IInvokedMethodListener) {
IInvokedMethodListener method = (IInvokedMethodListener) listener;
maybeAddListener(m_invokedMethodListeners, method);
}
//IHookable只有一个
if (listener instanceof IHookable) {
setHookable((IHookable) listener);
}
//IConfigurable只有一个
if (listener instanceof IConfigurable) {
setConfigurable((IConfigurable) listener);
}
//根据具体IConfigurable实例决定 默认IExecutionListener默认是只有一个
if (listener instanceof IExecutionListener) {
m_configuration.addExecutionListenerIfAbsent((IExecutionListener) listener);
}
//根据具体IConfigurable实例决定 默认 IConfigurationListener可以有多个
if (listener instanceof IConfigurationListener) {
m_configuration.addConfigurationListener((IConfigurationListener) listener);
}
if (listener instanceof IAlterSuiteListener) {
IAlterSuiteListener alter = (IAlterSuiteListener) listener;
maybeAddListener(m_alterSuiteListeners, alter);
}
if (listener instanceof IDataProviderListener) {
IDataProviderListener dataProvider = (IDataProviderListener) listener;
maybeAddListener(m_dataProviderListeners, dataProvider);
}
if (listener instanceof IDataProviderInterceptor) {
IDataProviderInterceptor interceptor = (IDataProviderInterceptor) listener;
maybeAddListener(m_dataProviderInterceptors, interceptor);
}
}
//把value放入Map中 注意最后一个参数的值
private static <E> void maybeAddListener(Map<Class<? extends E>, E> map, E value) {
maybeAddListener(map, (Class<? extends E>) value.getClass(), value, false);
}
//从上面有参数可以看出来 如果map中没有就添加 重复添加时 如果为false时会打印日志
private static <E> void maybeAddListener(
Map<Class<? extends E>, E> map, Class<? extends E> type, E value, boolean quiet) {
if (map.containsKey(type)) {
if (!quiet) {
LOGGER.warn("Ignoring duplicate listener : " + type.getName());
}
} else {
map.put(type, value);
}
}
addListeners(XmlSuite s)
addListeners入参是XmlSuite 此方法最终也会调用 addListener(ITestNGListener listener)
private void addListeners(XmlSuite s) {
//suite中的listener是从xml配置的 从上节课可以知道 存放在一个m_listeners的List中
for (String listenerName : s.getListeners()) {
//通过类加载器加载listener
Class<?> listenerClass = ClassHelper.forName(listenerName);
// If specified listener does not exist, a TestNGException will be thrown
if (listenerClass == null) {
throw new TestNGException(
"Listener " + listenerName + " was not found in project's classpath");
}
//实例化 并调用 重载方法
ITestNGListener listener = (ITestNGListener) InstanceCreator.newInstance(listenerClass);
addListener(listener);
}
// Add the child suite listeners
//如果有子suite则递归调用此方法
List<XmlSuite> childSuites = s.getChildSuites();
for (XmlSuite c : childSuites) {
addListeners(c);
}
}
addMethodSelector
private Map<String, Integer> m_methodDescriptors = Maps.newHashMap();
private Set<XmlMethodSelector> m_selectors = Sets.newLinkedHashSet();
//下面的方法很简单
public void addMethodSelector(String className, int priority) {
if (Strings.isNotNullAndNotEmpty(className)) {
m_methodDescriptors.put(className, priority);
}
}
public void addMethodSelector(XmlMethodSelector selector) {
m_selectors.add(selector);
}