如何在testNG中使用beforeClass,afterClass,afterSuite来组织testSuite的结构?

时间:2015-02-26 05:38:20

标签: unit-testing testing webdriver testng

我很困惑在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文档 - 没有帮助。

4 个答案:

答案 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和@AfterSuite将在 MySuite 之前/之后运行
  • @BeforeTest和@AfterTest将在 MyBigTest
  • 之前/之后运行
  • @BeforeClass和@AfterClass将在 firstTestClass secondTestClass
  • 之前/之后运行
  • @BeforeMethod和@AfterMethod将在 a,b,c d 方法之前/之后运行

例如,您可以在@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();
    }

}

来源:https://github.com/selenium-webdriver-software-testing/kspl-selenium-helper/blob/master/src/main/java/in/mayurshah/base/BaseActions.java

答案 3 :(得分:0)

大多数情况下,人们使用@BeforeMethod@AfterMethod进行设置并拆除驱动程序。

对于这个和其他常见的自动化需求,use Selenium可以通过TestNG使用TestNG扩展,它可以提供内置的实现。例如,其中一个框架抽象driver management outside the code,因此您测试和相关代码整洁干净,您不必担心驱动程序管理和Web或移动自动化的其他常见自动化需求。