TestNG源码分析07-初始化03

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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值