可以在 TestNG XML 套件中调用参数化方法吗?
Can a Parameterized method be called in a TestNG XML Suite?
我在 class 中有一个参数化方法 (readConfig_1(String path)
),我需要在 TestNG 套件中进行测试之前 运行。有没有一种方法可以调用此方法并在 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 套件中,我需要调用上面的方法并向它传递一个参数,然后才能继续 运行 其他 classes 中编写的测试。
<?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、浏览器等,在测试之前设置执行。有什么办法可以做到这一点?
----2017 年 11 月 24 日添加-----
---- 我认为将 readConfig_1 添加到 @BeforeClass 注释中可以解决问题。但还有更多内容-----
我的监听器 Class 有 **@onStart**
注释,需要配置文件在套件启动时为 运行。正如您在下面看到的,我的监听器 Class 具有来自配置文件的变量 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);
}
但是如果我把它放在测试中的@BeforeClass中Class,这些变量(Config.release_1)将返回 null因为他们会 运行 在测试 class 之前。所以我需要 readconfig_1 到 运行 before or with the Listener class 并且无法向 onStart(ISuite arg0)
添加参数。
通过 :
尝试了一些东西
运行 TestNG.XML 中的 readConfig_1()
作为第一个方法,甚至在可以调用侦听器 class 之前。
在 Listener class 中放置一个 @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);
}
}
但是 none 有效。
现在有办法解决这个问题吗?
提前致谢。
是的,你可以做到。首先,将 @Parameters("configXmlPath")
注释添加到您的测试 class。 configXmlPath
参数也必须像 <parameter name = "configXmlPath" value="Whateverthevalueis"/>
这样在 testng.xml
文件中定义。这是一个例子。
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 方法中,使用 @BeforeClass 和 @Parameters 注释,
@BeforeClass
@Parameters({"configXlsPath"})
public static void readConfig_1(@Optional("addaDefaultPathValue") String configXlsPath)
在您的 xml 中,在测试标签后添加一个参数标签。
<test name="Purchaser Tests">
<parameter name="configXlsPath" value="target/path/to/xmlFile">
您需要在 @BeforeClass
注释下定义您的参数化方法,并且应该在测试 class 内或从其他 class 继承。
我也在处理同样的问题,并通过以下方式解决了这个问题:
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
我在 class 中有一个参数化方法 (readConfig_1(String path)
),我需要在 TestNG 套件中进行测试之前 运行。有没有一种方法可以调用此方法并在 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 套件中,我需要调用上面的方法并向它传递一个参数,然后才能继续 运行 其他 classes 中编写的测试。
<?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、浏览器等,在测试之前设置执行。有什么办法可以做到这一点?
----2017 年 11 月 24 日添加-----
---- 我认为将 readConfig_1 添加到 @BeforeClass 注释中可以解决问题。但还有更多内容-----
我的监听器 Class 有 **@onStart**
注释,需要配置文件在套件启动时为 运行。正如您在下面看到的,我的监听器 Class 具有来自配置文件的变量 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);
}
但是如果我把它放在测试中的@BeforeClass中Class,这些变量(Config.release_1)将返回 null因为他们会 运行 在测试 class 之前。所以我需要 readconfig_1 到 运行 before or with the Listener class 并且无法向 onStart(ISuite arg0)
添加参数。
通过 :
尝试了一些东西运行 TestNG.XML 中的
readConfig_1()
作为第一个方法,甚至在可以调用侦听器 class 之前。在 Listener class 中放置一个
@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); }
}
但是 none 有效。 现在有办法解决这个问题吗?
提前致谢。
是的,你可以做到。首先,将 @Parameters("configXmlPath")
注释添加到您的测试 class。 configXmlPath
参数也必须像 <parameter name = "configXmlPath" value="Whateverthevalueis"/>
这样在 testng.xml
文件中定义。这是一个例子。
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 方法中,使用 @BeforeClass 和 @Parameters 注释,
@BeforeClass
@Parameters({"configXlsPath"})
public static void readConfig_1(@Optional("addaDefaultPathValue") String configXlsPath)
在您的 xml 中,在测试标签后添加一个参数标签。
<test name="Purchaser Tests">
<parameter name="configXlsPath" value="target/path/to/xmlFile">
您需要在 @BeforeClass
注释下定义您的参数化方法,并且应该在测试 class 内或从其他 class 继承。
我也在处理同样的问题,并通过以下方式解决了这个问题:
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