![](/img/trans.png)
[英]why does onStart() method run before onCreate in my android project?
[英]How to pass a parameter to @onStart method in MyListener Class or to run a method before @onStart
我有一個參數化方法( readConfig_1(String path)
)在TestNG Suite的MyListener類的@onStart方法中被調用
這是我編寫的參數化方法,實際上需要一個存儲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批注,該批注需要在Suite的開頭運行配置文件。 正如您在下面看到的,我的偵聽器類具有來自配置文件的變量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() 在偵聽器類之前或與之一起運行,並且無法向onStart(ISuite arg0)添加參數。 我也不能在@BeforeClass中運行readConfig方法
通過以下方式嘗試了一些方法:
即使在調用偵聽器類之前,也要以第一種方法運行TestNG.XML中的readConfig_1()。
使用參數化的readConfig_1()
方法在偵聽器類中添加@BeforeClass批注-希望在執行onStart()之前調用readConfig。
public class MyListener2 implements ITestListener, ISuiteListener{
ReportLib report = new 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); } }
但是沒有一個有效。 現在有辦法解決嗎?
---從我以前的問題轉貼此問題-
將您的public static void readConfig_1(String configXmlPath)
放在一個類中,進行測試並在<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
調用它
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.