воскресенье, 14 апреля 2013 г.

DDT in tests

Параметризация тестов или DDT подход

Собственно и так понятно,что при тестировании только одними или захардкоженными данными многого мы не добьемся, а значит нужно содержать наборы тестовых данных и использовать их в тестах и лучше всего их держать отдельно от самих тестов.
Здесь я приведу 2 примера хранения и использования данных с внешних источников,это будут 2 формата файлов-Excel и XML.

XML

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

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


Используя библиотеку Xstream(не обязательно ее,но мне она показалась самой легковесной)
User infoUser= new User(); 
System.out.println(new XStream().toXml(infoUser)); 
Получим:

 name
 pass

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



User infoUser2= (User) new XStream().fromXml(new FileInputStream("file.xml"));


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

 Excel

Будем использовать библиотеку  Java Excel API

Самому лень стало создавать подходящий Excel файл,поэтому я его нашел)

Функция этой библиотеки принимает 3 параметра:
1. xlFilePath - Путь к xls файлу
2. sheetName- Имя вашего sheet(На примере DataPool)
3. tableName- И имя таблички из которой будет проводиться выборка.


 private static String[][] getTableArray(String xlsFilePath, String sheetName, String tableName) throws BiffException, IOException {
        String[][] tabArray = null;
            Workbook workbook = Workbook.getWorkbook(new File(xlsFilePath));
            Sheet sheet = workbook.getSheet(sheetName);
            int startRow, startCol, endRow, endCol, ci, cj;
            Cell tableStart = sheet.findCell(tableName);
            startRow = tableStart.getRow();
            startCol = tableStart.getColumn();

            Cell tableEnd = sheet.findCell(tableName, startCol + 1, startRow + 1, 100, 64000, false);

            endRow = tableEnd.getRow();
            endCol = tableEnd.getColumn();
            tabArray = new String[endRow - startRow - 1][endCol - startCol - 1];
            ci = 0;

            for (int i = startRow + 1; i < endRow; i++, ci++) {
                cj = 0;
                for (int j = startCol + 1; j < endCol; j++, cj++) {
                    tabArray[ci][cj] = sheet.getCell(j, i).getContents();
                }
            }
     
        return (tabArray);
    }
А использовать уж как удобно.Просто как пример:
@DataProvider(name = "DP1")
    public Object[][] createData1() throws Exception{
        Object[][] retObjArr=getTableArray("data.xls",
                "DataPool", "imdbTestData1");
        return(retObjArr);
    }
    
    @Test (dataProvider = "DP1")
    public void testDataProviderExample(String ID, 
            String Name, String City) throws Exception { 
    //Что-нибудь делаем с ними тут  } 

Вот и все,всем спасибо.