我在一个类中有一个参数化方法(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)
添加参数。
通过以下方式尝试了一些事情:
在调用侦听器类之前,在TestNG.XML中运行readConfig_1()
作为第一种方法。
在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);
}
}
但都没有效果。 现在有办法吗?
提前致谢。
答案 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