Перейти к содержимому

Фотография

Инициализация и очистка тестовых данных TestNG


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 5

#1 Okhotina_Irina

Okhotina_Irina

    Новый участник

  • Members
  • Pip
  • 2 сообщений
  • ФИО:Охотина Ирина Юрьевна

Отправлено 24 октября 2018 - 13:34

Добрый день.

После прохождения курсов Алексея Баранцева решила попробовать свои силы в тестировании приложения, над которым я тружусь в ручном режиме.

Приложение представляет из себя CRM, одна из основных функций которой является создание клиента. 
Использую стек  Selenium+Gradle+Java+TestNG.

Я написала тест на создание клиента с использованием @DataProvider. То есть сначала я генерирую данные в формате json, далее я читаю этот файл и передаю в качестве параметра тесту. И всё работает отлично. Но задача на данный момент такая, что нужно перед каждым запуском теста генерировать новый набор данных, прежде очищая старый набор, чтобы каждый раз был новый набор данных. 

Подскажите пожалуйста как это организовать?

 

Тестовый класс:

public class CustomerCreateTest extends TestBase{


  @DataProvider
  public Iterator<Object[]> dataCustomersFromJson() throws IOException {
    try (BufferedReader reader = new BufferedReader(new FileReader(new File("src/test/resources/customers.json")))) {
      String json = "";
      String line = reader.readLine();
      while (line != null) {
        json += line;
        line = reader.readLine();
      }
      Gson gson = new Gson();
      List<CustomerData> customers = gson.fromJson(json, new TypeToken<List<CustomerData>>() {}.getType()); // List<RepositoryData>.class
      return customers.stream().map((g) -> new Object[]{g}).collect(Collectors.toList()).iterator();
    }
  }

  @Test (dataProvider = "dataCustomersFromJson")
  public void createCustomerValidData(CustomerData customer) throws InterruptedException {
     app.goTo().customerListPage();
     app.customer().create(customer);
     Thread.sleep(20000);
     Boolean curdCustomerPage = app.customer().isTextPresent("Успешно сохранен");
     assertTrue(curdCustomerPage);
     Thread.sleep(15000);
  }
}

Класс по генерации тестовых данных:

public class CustomerDataGenerator {

  @Parameter(names = "-c", description = "Repository count")
  public int count;

  @Parameter(names = "-f", description = "Target file")
  public String file;

  @Parameter(names = "-d", description = "Data format")
  public String format;


  public static void main(String[] args) throws IOException {

    CustomerDataGenerator generator = new CustomerDataGenerator();
    JCommander jCommander = new JCommander(generator);
    try {
      jCommander.parse(args);
    } catch (ParameterException ex) {
      jCommander.usage();
      return;
    }
    generator.run();

  }

  public void run() throws IOException {
    List<CustomerData> customers = generateCustomer(count);
    if (format.equals("csv")) {
      saveAsCsv(customers, new File(file));
    } else if (format.equals("xml")) {
      saveAsXml(customers, new File(file));
    } else if (format.equals("json")) {
      saveAsJson(customers, new File(file));
    } else {
      System.out.println("Unrecognized format " + format);
    }
  }

  private void saveAsJson(List<CustomerData> customers, File file) throws IOException {
    Gson gson = new GsonBuilder().setPrettyPrinting().create();
    String json = gson.toJson(customers);
    try (Writer writer = new FileWriter(file)) {
      writer.write(json);
    }
  }

  private void saveAsXml(List<CustomerData> customers, File file) throws IOException {
    XStream xstream = new XStream();
    xstream.processAnnotations(CustomerData.class);

    String xml = xstream.toXML(customers);
    try (Writer writer = new FileWriter(file)) {
      writer.write(xml);
    }
  }

  private void saveAsCsv(List<CustomerData> customers, File file) throws IOException {
    System.out.println(new File(".").getAbsolutePath()); // узнает относительный путь к файлу
    try (Writer writer = new FileWriter(file)) {
      for (CustomerData customer : customers) {
        writer.write(String.format("%s;%s\n", customer.getFirstname(), customer.getLastname(), customer.getDateOfBirth(), customer.getBurthCountry(), customer.getPlaceOfBirth(), customer.getSex(), customer.getEmail(), customer.getPhone(), customer.getPassportNumber()));
      }
    }
  }

  private static List<CustomerData> generateCustomer(int count) {
    List<CustomerData> customers = new ArrayList<CustomerData>();
    for (int i = 0; i < count; i++) {
      customers.add(new CustomerData().withTypeCustomer("Контрагент")
      .withFirstname(String.format("Ирина", i))
      .withLastname(String.format("Охотина", i))
      .withDateOfBirth(String.format("1984-06-2%s", i))
      .withBurthCountry(String.format("Российская Федерация", i))
      .withPlaceOfBirth(String.format("Казань", i))
      .withSex("Женский")
      .withEmail(java.util.UUID.randomUUID().toString() + "@gmail.com")
      .withPhone(String.format("234567%s", i))
      .withPassportNumber(String.format("1234567%s", i))
      .withPassportDateIssue(String.format("2015-06-1%s", i))
      .withPassportIssueBy(String.format("OVD%s", i))
      .withPassportDepartmentCode("136")
      .withSnils("136-001")
      .withInnCountry("Российская Федерация")
      .withInnSourceType("Отсутствует ИНН")
      .withInn("123456789")
      .withRegistrationCountry("Российская Федерация")
      .withCitizenshipAddress("РФ, г. Казань, ул. Мира, д.14")
      .withPass(String.format("QWEasd123", i))
      .withIdentityDocument(String.format("/home/irina_okhotina/Документы/Projects/java_pft/backoffice/src/test/resources/Doc%s.jpg", i+1))
      .withDocumentConfirming(String.format("/home/irina_okhotina/Документы/Projects/java_pft/backoffice/src/test/resources/Doc%s.jpg", i+1))
      );
    }
    return customers;
  }
}


  • 0

#2 Aleksche

Aleksche

    Новый участник

  • Members
  • Pip
  • 22 сообщений
  • ФИО:Алексей


Отправлено 08 ноября 2018 - 12:48

А количество тестовых наборов оно конечное? Я бы тогда сделал табличку в екселе а потом сохранил в csv


  • 0

#3 Okhotina_Irina

Okhotina_Irina

    Новый участник

  • Members
  • Pip
  • 2 сообщений
  • ФИО:Охотина Ирина Юрьевна

Отправлено 08 ноября 2018 - 13:16

На создание клиента один набор. По сути не имеет значение в каком формате сохранять, важно, чтобы при каждом прохождении этого набора генерировался новый почтовый адрес и паспортные данные, поскольку в системе есть проверка на дубликаты. Если бы был доступ к БД, то можно было в таблице удалять созданных клиентов и тогда можно было бы читать один и тот же файл с одними и теми же тестовыми данными, но к БД доступа нет. 
И как вариант, думаю, просто запускать генерацию данных из класса CustomerDataGenerator перед тестом createCustomerValidData. Но как это сделать, не могу понять.


  • 0

#4 Aleksche

Aleksche

    Новый участник

  • Members
  • Pip
  • 22 сообщений
  • ФИО:Алексей


Отправлено 08 ноября 2018 - 13:24

А, теперь понятно. Ну я бы наверное где-то счетчик запоминал которым вы данные приращиваете String.format("2015-06-1%s", i

а перед следующим запуском удалял бы старый файл с данными а генерировал новый начиная со следующего числа, тогда

данные всегда будут уникальными


  • 0

#5 Spock

Spock

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 772 сообщений
  • ФИО:Роман

Отправлено 08 ноября 2018 - 13:28

 

А, теперь понятно. Ну я бы наверное где-то счетчик запоминал которым вы данные приращиваете String.format("2015-06-1%s", i

а перед следующим запуском удалял бы старый файл с данными а генерировал новый начиная со следующего числа, тогда

данные всегда будут уникальными

не надо файлы с данными создавать и удалять, тогда будет головная боль когда тест будет запускаться с другой машины либо с ЦИ сервера

 

просто надо генерировать случайные уникальные данные клиента, и всё


  • 1

#6 Aleksche

Aleksche

    Новый участник

  • Members
  • Pip
  • 22 сообщений
  • ФИО:Алексей


Отправлено 08 ноября 2018 - 13:32

 

 

А, теперь понятно. Ну я бы наверное где-то счетчик запоминал которым вы данные приращиваете String.format("2015-06-1%s", i

а перед следующим запуском удалял бы старый файл с данными а генерировал новый начиная со следующего числа, тогда

данные всегда будут уникальными

не надо файлы с данными создавать и удалять, тогда будет головная боль когда тест будет запускаться с другой машины либо с ЦИ сервера

 

просто надо генерировать случайные уникальные данные клиента, и всё

 

 

Ну так если файл "внутри" проекта, разве будут проблемы? Но генерация случайных данных конечно изящнее


  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных