如何将参数传递给MyListener类中的@onStart方法或在@onStart

时间:2017-11-25 22:19:41

标签: java xml selenium selenium-webdriver testng

我在TestNG Suite的MyListener类的@onStart方法中调用了参数化方法(readConfig_1(String path)

这里是参数化方法,我写的实际上需要一条路径来存储XML文件。

public static void readConfig_1(String configXmlPath) 
{

            browser = CoreLib.fGetNodeText(configXmlPath, "config",
                    "browser");
             env = CoreLib.fGetNodeText(configXmlPath, "config", "env");
             release = CoreLib.fGetNodeText(configXmlPath, "config", "release");
            serverName = CoreLib.fGetNodeText(configXmlPath, env,
                    "serverName");
             host = CoreLib.fGetNodeText(configXmlPath, env, "host");
            userName = CoreLib.fGetNodeText(configXmlPath, env, "userName");
            passWord = CoreLib.fGetNodeText(configXmlPath, env, "passWord");
            portNumber = CoreLib.fGetNodeText(configXmlPath, env,
                    "portNumber");
            schema = CoreLib.fGetNodeText(configXmlPath, env, "schema");
            url = CoreLib.fGetNodeText(configXmlPath, env, "url");
            screenShotForPass=CoreLib.fGetNodeText(configXmlPath, env, "SCreenShotForPass");

            screenShotForFail=CoreLib.fGetNodeText(configXmlPath, env, "SCreenShotForFail");


            CoreLib.LOGGER.info("****************************************************");
            CoreLib.LOGGER.info("           Configuration Details                    ");
            CoreLib.LOGGER.info("****************************************************");

            CoreLib.LOGGER.info("Browser ::" + browser);
            CoreLib.LOGGER.info("env ::" + env);
            CoreLib.LOGGER.info("serverName ::" + serverName);
            CoreLib.LOGGER.info("host ::" + host);
            CoreLib.LOGGER.info("userName ::" + userName);
            CoreLib.LOGGER.info("passWord ::" + passWord);
            CoreLib.LOGGER.info("portNumber ::" + portNumber);
            CoreLib.LOGGER.info("schema ::" + schema);
            CoreLib.LOGGER.info("url::" + url);
            CoreLib.LOGGER.info("ScreenSnapShotForPass::"+screenShotForPass );
            CoreLib.LOGGER.info("ScreenSnapShotForFail::"+screenShotForFail );

        }

在下面看到的这个TestNG Suite中,我需要调用上面的方法向它传递一个参数,然后才能继续运行并运行其他类中编写的测试。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Smoke Suite" parallel="false" preserve-order="true">

    <listeners>
        <listener class-name="com.healthcare.reports.MyListener"></listener>
    </listeners>



    <test name="XYZ Tests">
        <classes>

            <class name="com.healthcare.utility.Config">
                <methods>
                    <include name="readConfig_1"></include>
                </methods>
            </class>

            <class name="com.healthcare.businessLib.xyz.AddUserTests" />

        </classes>

    </test>


</suite> 

由此我打算限制TestNG Suite读取一个特定的Config.XML文件,该文件具有自己的值,如Env,URL,浏览器等,在执行测试之前设置。有没有办法实现这个目标?

- 通过其他帖子的建议,我认为将readConfig_1添加到@BeforeClass注释可以解决问题。但还有更多内容-----

我的监听器类具有 @onStart 注释,需要在套件的开头运行配置文件。如下所示,我的监听器类具有来自Config文件的变量 release_1

 public class MyListener implements ITestListener, ISuiteListener {

        // This belongs to ISuiteListener and will execute before the Suite start

        ReportLib report=new ReportLib();

        @Override
        public void onStart(ISuite arg0) {

            Config.readConfig_1(configXlsPath);
            ExportTestResults export = new ExportTestResults();
            export.exportExcelHeader(Config.release_1);
            CoreLib.fCreateLogger(Config.release_1);

        }

但是如果我把它放在TestClass中的@BeforeClass中,这些变量(Config.release_1)将返回null,因为它们将在测试类之前运行。所以我需要readconfig_1()来在Listener类之前或之后运行并且无法向onStart(ISuite arg0)添加参数。我也不能在@BeforeClass

中运行readConfig方法

通过以下方式尝试了一些事情:

  1. 在调用侦听器类之前,在TestNG.XML中运行readConfig_1()作为第一个方法。

  2. 在Listener类中放入一个@BeforeClass注释,其中参数化了readConfig_1()方法 - 希望在执行onStart()之前调用readConfig。

    public class MyListener2 implements ITestListener, ISuiteListener{
    

    ReportLib报告=新的ReportLib();

        @BeforeClass
        @Parameters("configXlsPath")
        public void beforeSuite(String configXlsPath)
        {
            Config.readConfig_1(configXlsPath);
        }
    
    
        @Override
        public void onStart(ISuite arg0) {
            ExportTestResults export = new ExportTestResults();
            System.out.println("In onStart(Listener_2)"+ Config.release_1);
            export.exportExcelHeader(Config.release_1);
            CoreLib.fCreateLogger(Config.release_1);
    
        }
    }
    
  3. 但都没有效果。现在有办法吗?

    ---重新提出我以前的问题---

1 个答案:

答案 0 :(得分:0)

将你的<listener>放入一个班级,进行测试并在<suite name="Default suite" thread-count="5" group-by-instances="false" verbose="1" allow-return-values="false" parallel="false" data-provider-thread-count="10" junit="false" configfailurepolicy="skip" preserve-order="true" skipfailedinvocationcounts="false"> <test verbose="2" name="pTest"> <classes> <class name="firsttestngpackage.customParameter"> <methods> <include name="getParams"/> </methods> </class> </classes> </test> <listeners> <listener class-name = "firsttestngpackage.myListener1" /> </listeners> ... ... 之前调用测试,然后在这样的监听器类中读取该方法

customeParameter class
下面的

readConfig_1,类似于您的package firsttestngpackage; public class customParameter { public static String getParams() { return new String ("testParam1"); } }

listener class

package firsttestngpackage; import org.testng.ITestContext; import org.testng.ITestListener; import org.testng.ITestResult; import firsttestngpackage.customParameter; public class myListener1 implements ITestListener { String tParam = customParameter.getParams(); @Override public void onTestSuccess(ITestResult result) { System.out.println("the method" + " "+result.getMethod().getMethodName() +" "+ "passed and custom parameter is " + tParam); }

the method  gotoURL  passed and custom parameter is testParam1

以上打印

gotoURL

readConfig_1是我测试类中的一个方法,我在这里没有显示。您应该可以使用yourClass.readConfig_1方法执行上述操作,并在您的监听器类中调用{{1}}