我在一个类中有一个参数化的方法(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 套件中,我需要调用上面的方法,然后将参数传递给它,然后它才能继续运行在其他类中编写的测试。
<?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 注释可以解决问题。但还有更多-----
我的侦听器类有**@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)
.
通过以下方式尝试了一些事情:
readConfig_1()
甚至在可以调用侦听器类之前,在 TestNG.XML 中作为第一个方法运行。@BeforeClass
在 Listener 类中添加一个注解,并在其中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); }
}
但没有一个奏效。 现在有办法解决这个问题吗?
提前致谢。