我很困惑在testNG中使用注释@ beforeClass,afterClass,beforeSuite,afterSuite。
我理解下面的测试结构:
package mytestNG.learning.it ;
public class sample_not_working {
@Test
//take action - click on links, input data etc
public void main() {
}
@BeforeMethod
//do stuff like setup browser etc
public void beforeMethod() {
}
@AfterMethod
//close browser
public void afterMethod() {
}
}
但是你在beforeclass,afterClass和test中做了什么?它是什么文件的? 它是一个运行其他类的类吗?
接下来,afterSuite,beforeSuite和 @test :
public class sample_not_working {
@Test
public void main() {
//WHAT KINDA CODE YOU PUT HERE?
}
@BeforeSuite
//WHAT KINDA CODE YOU PUT HERE?
public void beforeMethod() {
}
@AfterSuite
public void afterMethod() {
//WHAT KINDA CODE YOU PUT HERE?
}
}
我的问题是关于语义,意义,而不是实际的代码。我阅读了testNG文档 - 没有帮助。
答案 0 :(得分:0)
如果您有以下testng.xml:
<suite name="MySuite">
<test name="MyBigTest">
<classes>
<class name="test.sample.firstTestClass"/>
<methods>
<include name="a" />
<include name="b" />
</methods>
<class name="test.sample.secondTestClass"/>
<methods>
<include name="c" />
<include name="d" />
</methods>
</classes>
</test>
</suite>
则...
例如,您可以在@BeforeSuite中设置您的环境,或者您可以使用@BeforeTest打开浏览器,在测试方法结束时,您可以使用@AfterTest等关闭它...
答案 1 :(得分:0)
这真的取决于你在测试什么以及你是如何做到的。我通常把驱动程序放在@BeforeSuite中,然后我在@AfterSuite中退出它们。
@AfterClass中的(如果我正在使用它)我会为全班[关于字段]放置日志,例如更改某些变量的值。
@BeforeClass中的我有时会初始化变量/字段。
但最后,thoes注释是为了帮助你而创建它们是为了轻松执行你的想法。
答案 2 :(得分:0)
您可能希望使用以下示例来理解它。它没有@AfterClass / @BeforeClass。但它有助于理解结构。
package com.kagrana.base;
import java.io.IOException;
import org.openqa.selenium.WebDriver;
import org.testng.ITestContext;
import org.testng.ITestResult;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Optional;
import org.testng.annotations.Parameters;
import com.kagrana.DTO.TestCase;
import com.kagrana.DTO.WebDriverConfig;
import com.kagrana.util.Log;
public abstract class BaseActions {
protected WebDriver driver;
protected static Log log;
protected WebDriverConfig config;
protected String baseURL;
protected TestCase testCase;
private static int testCaseCount = 1;
/**
* This gets invoked even before suite starts.
* @param ReportLocation
*/
@Parameters({"ReportLocation"})
@BeforeSuite
public void beforeSuite(@Optional String ReportLocation){
log = new Log();
}
@BeforeMethod
@Parameters({ "remoteURL", "baseURL", "OS", "browser",
"version", "internal" })
public void beforeTest(String remoteURL, String baseURL,
String OS, String browser, String version, String internal)
throws IOException {
this.testCase = new TestCase();
this.testCase.setExecutionEnvironment("{browser:"+browser+",browserVersion:"+version+",OperatingSystem:"+OS+"}");
this.testCase.setParentURL(baseURL);
this.testCase.setTestCaseId("KT"+testCaseCount++);
this.testCase.setScreenshotDirectory(log.getReportDirectory()+"\\images");
config = new WebDriverConfig();
config.setRemoteURL(remoteURL);
this.baseURL = baseURL;
config.setOS(OS);
config.setBrowserName(browser);
config.setBrowserVersion(version);
config.setIntenal(Boolean.parseBoolean(internal));
driver = xRemoteWebDriver.getInstance(config, log);
driver.manage().window().maximize();
driver.get(this.baseURL);
}
@AfterMethod
public void afterTest(ITestResult itr) {
testCase.setExecutionTime((itr.getEndMillis() - itr.getStartMillis()));
testCase.setTestCaseName(itr.getName());
log.addTestCase(testCase);
try {
driver.close();
} catch (Exception ignore) {
}
try {
driver.quit();
} catch (Exception ignore) {
}
}
@AfterSuite
public void afterSuite(ITestContext itc) throws IOException{
log.setTestSuiteName(itc.getSuite().getName());
log.writeReport();
log.zipAndEmailFile();
}
}
答案 3 :(得分:0)
大多数情况下,人们使用@BeforeMethod
和@AfterMethod
进行设置并拆除驱动程序。
对于这个和其他常见的自动化需求,use Selenium可以通过TestNG使用TestNG扩展,它可以提供内置的实现。例如,其中一个框架抽象driver management outside the code,因此您测试和相关代码整洁干净,您不必担心驱动程序管理和Web或移动自动化的其他常见自动化需求。