пятница, 20 апреля 2012 г.

Отделяем данные от тестов с помощью сериализации

Если вы хотите написать тест не зависящий от данных, или вам при тестировании приходится часто менять тестовые данные - эта статья для вас.

1. В чем заключается проблема ?
Тестовые данные могут изменяться и жестко заносить их в код тестов не самая лучшая идея. Гораздо лучшей идеей было -бы хранить эти данные отдельно и предоставить к ним доступ всем необходимым тестам.

2. Как этого добиться ?
Я усматриваю несколько путей к реализации такого доступа.
1) Хранить данные в БД
2) Properties
3) Сериализация

Я не буду рассматривать все плюсы и минуса каждого подхода, а конкретно поговорю о последнем.

Сериализация - процесс перевода какой-либо структуры данных в последовательность битов. Обратной к операции сериализации является операция десериализации — восстановление начального состояния структуры данных из битовой последовательности.

Выглядит вполне интересно... Но обычная сериализация переводит обьект в совсем уж неудобоваримый формат, который править руками нет никакой возможности.

Есть решение этого. Сериализация в XML файл. В итоге такой сериализации мы получим на выходе читабельный и редактируемый файл.

 Рассмотрим пример. Напишем класс который хранит в себе логин и пароль пользователя.

public class LoginInfo{
  String login = "name";
  String password = "pass";
}

В классе всего 2 строковых поля. Как данный класс будет выглядеть в сериализованном виде ?
Давайте посмотрим.
Для сериализации я использую библиотеку XStream.

LoginInfo info= new LoginInfo();
System.out.println(new XStream().toXml(info));

Выполнение этих двух строчек кода выведет нам в консоль примерно следующее

<LoginInfo>
 <login>name</login>
 <password>pass</password>
</LoginInfo>

сохранив эту информация в xml файл мы можем восстановить объект оттуда.

LoginInfo info2= (LoginInfo) new XStream().fromXml(new FileInputStream("file.xml"));

Таким образом мы можем однажды описать структура с данными и хранить ее во внешнем файле. и при необходимости менять эти данные и при десериализации они будут подтягиваться в ваш код, необходимость менять сам код отпадает.

пример теста использующего этот подход:

LoginInfo info=null;

@BeforeMethod
public void before(){
 info=(LoginInfo) new XStream().fromXml(new FileInputStream("file.xml"));
}

@Test
public void test(){
 FirefosDriver firefox = new FirefoxDriver();
firefox.findElement(By...).sendKeys(info.login);
firefox.findElement(By...).sendKeys(info.password);
}



 

1 комментарий:

  1. LoginInfo info= new LoginInfo();
    System.out.println(new XStream().toXml());

    Кажется здесь не хватает передачи ссыли на инфо. Не смотрел апи, не уверен куда именно, в конструктор или метод.

    ОтветитьУдалить