当前位置: 首页 > 知识库问答 >
问题:

如何向MyListener类中的@OnStart方法传递参数或在@OnStart之前运行方法

晋弘义
2023-03-14

我在TestNG套件中的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套件中,我需要调用上面的方法传递一个参数,然后它才能继续运行在其他类中编写的测试。

<?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套件读取特定的config.xml文件,该文件将在执行测试之前设置自己的值,如Env、URL、browser等。我有什么办法可以做到这一点吗?

--根据其他帖子的建议,我认为将readConfig_1添加到@BeforeClass注释中可以解决这个问题。但还有更多的----

我的侦听器类有@onstart注释,它需要配置文件在套件开始时运行。如下所示,我的侦听器类具有来自配置文件的变量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类之前或与Listener类一起运行,并且无法向onStart(isuitearg0)添加参数。我也不能在@BeforeClass中运行readConfig方法

尝试了几件事:

>

  • 甚至在可以调用侦听器类之前,就在testng.xml中运行readConfig_1()作为第一个方法。

    在侦听器类中添加一个@BeforeClass注释,其中参数化了readconfig_1()方法-希望在执行onStart()之前调用readConfig。

    public class MyListener2 implements ITestListener, ISuiteListener{
    

    ReportLib report=new 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);
    
        }
    }
    

    但没有一个奏效。现在有办法解决这个问题吗?

    ---把我以前的问题转过来---

  • 共有1个答案

    路伟
    2023-03-14

    将您的公共静态void readConfig_1(String configXmlPath)放入类中,在 <listener>之前进行测试并调用测试,然后在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类,它类似于您的ReadConfig_1

    package firsttestngpackage;
    
    
    
    public class customParameter {
    
        public static String getParams()  {
    
            return new String ("testParam1");
          }
    }
    

    侦听器类

    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);
        }
    

    上面的指纹

    gotoURL传递的方法和自定义参数是testParam1

    gotourl是我的测试类中的一个方法,这里没有展示。您应该能够使用readconfig_1方法执行上述操作,并在您的侦听器类中调用它,如YourClass.readconfig_1

     类似资料:
    • 为了实现BrowserStack自动化,我已经将testNG与cucumber集成在一起,我希望在初始化浏览器之前为其设置功能。因此,当我通过testing.xml文件将功能作为参数传递给@before方法时,我会得到以下错误- *io.cucumber.java.invalidMethodSignatureException:用Before、After、BeforeStep或AfterStep注

    • onStart: Function 当动画开始渲染时执行此事件函数,有可能会被执行多次,因为动画是可以重复开始的。 TweenMax.to('.box', 2, { x: 500, onStart:function(){ ... } }); onStart适用于TweenMaxTweenLite onStart的参数 onStart 示例 .box

    • onStart: Function 当时间轴开始时执行的回调函数。 当前时间轴设置的delay会影响onStart的执行,但时间轴内的动画的delay不会影响动画在时间轴的开始时间。 new TimelineMax({onStart: myFunction}); onStart适用于TimelineMaxTimelineLite onStart的参数 onStart 示例 .box {

    • 方法调用'get view().findviewbyid(r.id.datePurchased)'可能会生成'java.lang.NullPointerException'

    • 错误:不兼容的类型:DrawerListItem不能转换为Cap#1,其中Cap#1是一个新的类型变量:Cap#1从capture的capture扩展了BaseListItem?扩展基线 我不明白为什么这是错误的。,。我试着阅读了其他关于泛型类型和类型参数的文章,但它们似乎都没有解决这个问题。

    • 问题内容: 我正在尝试在RMI方法中添加参数。当我添加例如一切正常。但是我不确定是否可以传递我创建的对象。我是RMI的新手,所以我的代码非常简单: HelloIF 你好 RMI服务器 RMI客户端 最后是我的课堂上下文 我应该怎么做才能使传递上下文成为可能? 问题答案: 您的对象应实现。如我所见,这将是一个问题。之所以需要这样做是因为两个部分之间的通信是使用序列化完成的,因此需要发送给另一部分的每