java - 可以在 TestNG XML Suite 中调用参数化方法吗?

标签 java xml selenium-webdriver testng suite

我在一个类中有一个参数化方法(readConfig_1(String path)),我需要在 TestNG Suite 中的测试之前运行该方法。有没有办法可以调用此方法并在 TestNG.xml 文件中定义相同的参数?

这是我编写的参数化方法,它实际上需要 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、浏览器等,在执行测试之前设置。有什么方法可以实现这个目标吗?

<小时/>

----添加于 2017 年 11 月 24 日-----

---- 我认为将 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(ISuite arg0) 添加参数。

尝试了一些事情:

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

  2. 在 Listener 类中添加一个 @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);
            System.out.println("In Before Class(Listener_2)"+ Config.release_1);
        }
    
    
        @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);
    
        }
    

    }

但是没有一个起作用。 现在有办法解决这个问题吗?

提前致谢。

最佳答案

是的,你可以做到这一点。首先添加@Parameters("configXmlPath")您的测试类的注释。 configXmlPath参数还必须在 testng.xml 中定义文件如 <parameter name = "configXmlPath" value="Whateverthevalueis"/>这。这是一个例子。

import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class YourTest {
   @Test
   @Parameters("configXmlPath")
   public void test1(String configXmlPath) {
      System.out.println("Parameterized value is : " + configXmlPath);
   }
}

然后,在 testng.xml 中定义如下参数:

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name = "Suite1">
   <test name = "test1">

      <parameter name = "configXmlPath" value="Whateverthevalueis"/> 

     <classes>
         <class name = "YourTest" />
      </classes>

    </test>
</suite>

关于java - 可以在 TestNG XML Suite 中调用参数化方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47426005/

相关文章:

java - 在 Java 中使用模式匹配器拆分为 ArrayList

java - -accountId 无法解析或不是字段

xml - 带有 XML Twig 段错误的 Perl 脚本,子进程以信号 11 终止

html - 如何将 img 标签转换为 css 选择器

java - 使用 Webdriver 突出显示元素后等待几秒钟

java - 如何在 java web 中将项目名称添加到 url

xml - 如何使用 Perl 的 XML::Twig 将子元素添加到 XML?

java - 如何获取包含冒号的xml属性值?

selenium-webdriver - Selenium IEDriverServer.exe 在虚拟机上崩溃

java - 如何使用 Tor 结合 Java