在使用 Java 的 Selenium 中,是否可以在 testNG 中只编写一个测试方法并从中形成多个测试?

In Selenium using Java is it possible to write only one test method in testNG and form multiple tests from it?

我有一种情况,在我的 testNG 测试中我只有一个测试方法 class 我必须从中形成多个测试,因为我只写一个测试方法是因为我不我不知道我需要多少测试,因为这个数字取决于我从 excel sheet.

中获取的 URL 的数量

所以基本上我只有一种 testNG 测试方法,每次都会从 excel 中获取不同的 URL 并执行测试,根据测试结果,我的监听器会将测试标记为通过或失败。 例如,我的 excel sheet 中有 20 个 URL,那么一个 testNG 测试方法可以一个一个地执行这 20 个 URL 并给出 pass/fail 结果20次。意思是最后我应该看到执行了 20 个测试,结果是 pass/fail。 我怎样才能做到这一点?

基本上你想运行用不同的数据集进行测试,

为此,您可以实现 @Factory 带注释的构造函数并将此构造函数的 @Factory 注释绑定到 @DataProvider 带注释的数据提供程序方法

此外,您可以使用 Apache POI 从给定的 excel 文件中获取 url。

import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Factory;
import org.testng.annotations.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

import static org.testng.Assert.assertNotNull;

public class SampleTest {

  private final String url;

  @Factory(dataProvider = "getUrls")
  public SampleTest(String url) {
    this.url = url;
  }

  @DataProvider(name = "getUrls")
  public static Iterator<Object[]> loadUrls() throws IOException {
    InputStream inputStream =
        SampleTest.class.getClassLoader().getResourceAsStream("urls-sheet.xlsx");

    try (Workbook workbook = new XSSFWorkbook(inputStream)) {
      Iterable<Row> iterable = () -> workbook.getSheetAt(0).iterator();
      Stream<Row> rows = StreamSupport.stream(iterable.spliterator(), false);

      return rows.map(row -> new Object[] {row.getCell(0).getStringCellValue()}).iterator();
    }
  }

  @Test
  public void testProvidedUrl() {
    assertNotNull(url, "url should have a value");
  }
}

Demo source code

TestNG @DataProvider – Test parameters example

How to run multiple test cases in testng with different set of test data from excel file?