我在TestNG Suite的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 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,浏览器等,在执行测试之前设置。有没有办法实现这个目标?
- 通过其他帖子的建议,我认为将readConfig_1添加到@BeforeClass注释可以解决问题。但还有更多内容-----
我的监听器类具有 @onStart 注释,需要在套件的开头运行配置文件。如下所示,我的监听器类具有来自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)添加参数。我也不能在@BeforeClass
通过以下方式尝试了一些事情:
在调用侦听器类之前,在TestNG.XML中运行readConfig_1()作为第一个方法。
在Listener类中放入一个@BeforeClass注释,其中参数化了readConfig_1()
方法 - 希望在执行onStart()之前调用readConfig。
public class MyListener2 implements ITestListener, ISuiteListener{
ReportLib报告=新的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);
}
}
但都没有效果。现在有办法吗?
---重新提出我以前的问题---
答案 0 :(得分:0)
将你的<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 class
下面的是readConfig_1
,类似于您的package firsttestngpackage;
public class customParameter {
public static String getParams() {
return new String ("testParam1");
}
}
listener class
和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);
}
the method gotoURL passed and custom parameter is testParam1
以上打印
gotoURL
readConfig_1
是我测试类中的一个方法,我在这里没有显示。您应该可以使用yourClass.readConfig_1
方法执行上述操作,并在您的监听器类中调用{{1}}