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

时间:2017-11-22 02:48:03

标签: 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**注释,需要在套件的开头运行配置文件。如下所示,我的Listener类具有来自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)添加参数。

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

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

    }

  3. 但都没有效果。 现在有办法吗?

    提前致谢。

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

在java方法中,使用@BeforeClass和@Parameters注释

@BeforeClass
@Parameters({"configXlsPath"})
public static void readConfig_1(@Optional("addaDefaultPathValue") String configXlsPath)

在xml中,在tests标记后添加参数标记。

<test name="Purchaser Tests">
 <parameter name="configXlsPath" value="target/path/to/xmlFile">

答案 2 :(得分:1)

您需要在@BeforeClass注释下定义参数化方法,并且应该在测试类中或从其他类继承。

我也在处理同样的问题,并通过以下方式解决了这个问题:

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

public class AddUserTests {

    @BeforeClass(alwaysRun = true)
    @Parameters("configXmlPath")
    public void readConfig_1(String configXmlPath){
      System.out.println("File path : "+ configXmlPath);

       /*
            You can use the configXmlPath value to 
            your code that goes here
       */      
    }

    @Test
    public void test_1(){
        //Test Code 
    }

    @Test
    public void test_2(){
        //Test Code     
    }       
}

您需要在xml文件中定义和设置参数值,如

<?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">
      <parameter name="configXmlPath" value="USE_ABSOLUTE_PATH_HERE"/> 
        <classes>
            <class name="com.healthcare.businessLib.xyz.AddUserTests" />
        </classes>

    </test>

</suite>

请使用配置文件的绝对路径[即C://Config.XML],而不是USE_ABSOLUTE_PATH_HERE