SWTBot运行参数跟踪

        在swtbot的单元测试中需要设置Run to Product的参数制,本来想通过参数配置,不用每次手动设置.运行研究结果.首先上图:

 SWTBot运行参数跟踪

 

可以发现:

1.首先线程调用的Test的测试工作台WorkbenchTestable

  /**
     * Initializes the workbench testable with the display and workbench,
     * and notifies all listeners that the tests can be run.
     * 
     * @param display the display
     * @param workbench the workbench
     */
    public void init(Display display, IWorkbench workbench) {
        Assert.isNotNull(display);
        Assert.isNotNull(workbench);
        this.display = display;
        this.workbench = workbench;
        if (getTestHarness() != null) {
        	// don't use a job, since tests often wait for all jobs to complete before proceeding
            Runnable runnable = new Runnable() {
                public void run() {
                	// Some tests (notably the startup performance tests) do not want to wait for early startup.
                	// Allow this to be disabled by specifying the system property: org.eclipse.ui.testsWaitForEarlyStartup=false
                	// For details, see bug 94129 [Workbench] Performance test regression caused by workbench harness change
                	if (!"false".equalsIgnoreCase(System.getProperty(PlatformUI.PLUGIN_ID + ".testsWaitForEarlyStartup"))) {  //$NON-NLS-1$ //$NON-NLS-2$
                		waitForEarlyStartup();
                	}
                    getTestHarness().runTests();
                }
            };
            new Thread(runnable, "WorkbenchTestable").start(); //$NON-NLS-1$
        }
    }

 

2.然后调用UITestApplication类的runTests方法.

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.ui.testing.ITestHarness#runTests()
	 */
	public void runTests() {
		fTestableObject.testingStarting();
		RemotePluginTestRunner.main(Platform.getCommandLineArgs());
		fTestableObject.testingFinished();
	}

 Platform.getCommandLineArgs()的参数值如下:

[-version, 3, -port, 60193, -testLoaderClass, org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader, -loaderpluginname, org.eclipse.jdt.junit4.runtime, -classNames, easyway.tbs.app.swtbot.st.SellSingleTicketEditorTest, -application, org.eclipse.swtbot.eclipse.core.swtbottestapplication, -product, org.eclipse.platform.ide, -testpluginname, easyway.tbs.app.swtbot]

 

 

-version, 3,  描述版本

-port, 60193, 描述端口

-testLoaderClass, org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader, 描述类加载器

-loaderpluginname, org.eclipse.jdt.junit4.runtime,  描述加载插件名称

-classNames, easyway.tbs.app.swtbot.st.SellSingleTicketEditorTest, 描述junit测试类

-application, org.eclipse.swtbot.eclipse.core.swtbottestapplication,   描述测试应用的类型为swtbot test

-product, org.eclipse.platform.ide,  描述具体swtbot测试的product对象

-testpluginname, easyway.tbs.app.swtbot]   描述当前 swtbot 的 junit所在的插件的名称

 

3.紧接着调用RemotePluginTestRunner的main方法通过类加载器调用特定类的特定方法.

 

/**
	 * The main entry point. Supported arguments in addition
	 * to the ones supported by RemoteTestRunner:
	 * <pre>
	 * -testpluginname: the name of the plugin containing the tests.
	  * </pre>
	 * @see RemoteTestRunner
	 */

	public static void main(String[] args) {
		RemotePluginTestRunner testRunner = new RemotePluginTestRunner();
		testRunner.init(args);
		testRunner.run();
	}

	/**
	 * Returns the Plugin class loader of the plugin containing the test.
	 * @see RemoteTestRunner#getTestClassLoader()
	 */
	protected ClassLoader getTestClassLoader() {
		final String pluginId = fTestPluginName;
		return getClassLoader(pluginId);
	}

	public ClassLoader getClassLoader(final String pluginId) {
		Bundle bundle = Platform.getBundle(pluginId);
		if (bundle == null)
			throw new IllegalArgumentException("No Classloader found for plug-in " + pluginId); //$NON-NLS-1$
		return new BundleClassLoader(bundle);
	}

	public void init(String[] args) {
		readPluginArgs(args);
		defaultInit(args);
	}

	public void readPluginArgs(String[] args) {
		for (int i = 0; i < args.length; i++) {
			if (isFlag(args, i, "-testpluginname")) //$NON-NLS-1$
				fTestPluginName = args[i + 1];

			if (isFlag(args, i, "-loaderpluginname")) //$NON-NLS-1$
				fLoaderClassLoader = getClassLoader(args[i + 1]);
		}

		if (fTestPluginName == null)
			throw new IllegalArgumentException("Parameter -testpluginnname not specified."); //$NON-NLS-1$

		if (fLoaderClassLoader == null)
			fLoaderClassLoader = getClass().getClassLoader();
	}

	protected Class loadTestLoaderClass(String className) throws ClassNotFoundException {
		return fLoaderClassLoader.loadClass(className);
	}

 

	

 

 综上所述:

        只需要调整RemotePluginTestRunner.main(Platform.getCommandLineArgs());的main方法的参数即可.但是由于RemoteTestRunner为eclipse 限制访问类org.eclipse.jdt.internal.junit.runner.RemoteTestRunner所以停止研究.

 

你可能感兴趣的:(RCP,SWT,swtbot)