как передать поставщик данных в любой тест в testNG, если в наборе данных есть данные, не относящиеся к этому тестовому сценарию - PullRequest
0 голосов
/ 06 мая 2018

Я пытаюсь создать гибридную среду Selenium, используя TestNG, в которой я получаю данные из своей таблицы данных Excel. Я пытаюсь использовать DataProvider из testNG, но проблема в том, что моя таблица данных содержит данные, которые относятся к другому тестовому примеру (например, 2 строки для добавления пользователя, 1 строка для изменения пользователя, некоторые строки для поиска пользователя и т. Д.)

, поскольку мой поставщик данных вернет все данные из таблицы данных, и передача их в любой конкретный testCase, который будет выполняться для всей строки поставщика данных, вызовет проблему (например, для создания пользователя потребуется 5 параметров, но данных для редактирования пользователя будет недостаточно). к нему).

как мы можем решить эту проблему?

1 Ответ

0 голосов
/ 08 мая 2018

Вот как это сделать:

  • В вашем файле .xls создайте лист, который представляет определенную функциональность. (Например, login, compose, address-book и т. Д., Если бы я брал пример приложения электронной почты)
  • Теперь каждый лист будет иметь тестовые данные для различных тестовых случаев, которые проверяют эту конкретную функциональность.
  • В вашем методе @Test вы можете создать новую пользовательскую аннотацию (это будет аннотация маркера), которая будет указывать имя «листа», из которого поставщик данных должен получать данные. Если вы не заинтересованы в создании новой пользовательской аннотации, вы можете использовать атрибут «description» аннотации @Test для сбора этой информации.
  • TestNG может встроить объект Method в ваш аннотированный метод @DataProvider. Здесь внедренный объект Method будет представлять метод @Test, для которого собирается быть вызван поставщик данных. Теперь вы можете извлечь имя листа из новой пользовательской аннотации (или) из атрибута description аннотации @Test, чтобы выяснить, какое имя листа запрашивать для данных.

Это должно решить вашу проблему.

Вот пример, который демонстрирует общую идею. Вам нужно будет обогатить провайдера данных так, чтобы он использовал имя листа для запроса данных из электронной таблицы Excel. Мой образец просто исключает все это ради демонстрации.

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.METHOD;

@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@Target({METHOD})
public @interface SheetName {
    String value() default "";
}
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

import java.lang.reflect.Method;

public class TestClass {

  @Test(dataProvider = "dp")
  @SheetName("one")
  public void test1(String name) {
    System.err.println("Name is " + name);
  }

  @Test(dataProvider = "dp")
  @SheetName("two")
  public void test2(int age) {
    System.err.println("Age is " + age);
  }

  @DataProvider(name = "dp")
  public Object[][] getData(Method method) {
    String sheetName = getSheetName(method);
    if (sheetName == null) {
      // Handle the case, wherein our custom annotation is missing. That means the test perhaps
      // expects
      // either all of the data, or it could be a error case.
      return new Object[][] {{}};
    }
    if ("one".equalsIgnoreCase(sheetName)) {
      return new Object[][] {{"Cedric"}, {"Beust"}};
    }
    if ("two".equalsIgnoreCase(sheetName)) {
      return new Object[][] {{1}, {2}};
    }
    // Handle the case, wherein we had a valid sheet name, but it represents a sheet that cant be
    // found in our
    // excel spreadsheet.
    return new Object[][] {{}};
  }

  private String getSheetName(Method method) {
    SheetName sheetName = method.getAnnotation(SheetName.class);
    if (sheetName == null || sheetName.value().trim().isEmpty()) {
      return null;
    }
    return sheetName.value();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...