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

Фотография

Логирование параллельных тестов


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

#1 elvis

elvis

    Постоянный участник

  • Members
  • PipPipPip
  • 189 сообщений
  • Город:Tallinn


Отправлено 11 апреля 2016 - 12:13

Поделитесь опытом, коллеги. Кто как логирует прогресс тестов, и логируете ли вообще. В случае когда все тесты идут один за другим нет вопросов, а вот с параллельными тестами возникает каша в консоли. Интересует конечно прежде всего варианты для Java.


  • 0

#2 BadMF

BadMF

    Специалист

  • Members
  • PipPipPipPipPip
  • 809 сообщений
  • ФИО:Dmitry Petrov

Отправлено 11 апреля 2016 - 13:05

ну наверное самое очевидное решение в начале строки указывать id обработчика тестов в общем логе. Это решение универсально для любого языка.


  • 0

#3 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 12 апреля 2016 - 13:35

Ну обычно сначала пишут название теста, а потом действие. Когда-то делал что-то похожее, надо найти старый код и адаптировать под новые реалии


  • 0

#4 TatyanaV

TatyanaV

    Опытный участник

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 12 апреля 2016 - 14:11

Как вариант, с log4j можно настроить не только разные уровни логирования (WARN, DEBUG и т.д.), но и разные способы (один тест в консоль, другой подробно в текстовый файлик, третий в еще один файлик, но только краткую информацию и т.п.).


  • 0

#5 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 12 апреля 2016 - 14:33

Как вариант, с log4j можно настроить не только разные уровни логирования (WARN, DEBUG и т.д.), но и разные способы (один тест в консоль, другой подробно в текстовый файлик, третий в еще один файлик, но только краткую информацию и т.п.).

 

С любым логером можно так сделать, но все равно получается каша

Масс файлы - тоже не вариант

 

Цель - сделать норм лог, который при параллельном выполнении будет записывать в файл и/или консоль. Информация должна обязательно содержать название тестового метода. ЯП Java, фреймоворк TestNG


  • 0

#6 TatyanaV

TatyanaV

    Опытный участник

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 12 апреля 2016 - 15:04

Если все в один файл пихать - да, не вариант. Вариант - пихать в разные файлы.

 

Если логирование нужно в самом конце теста - название теста можно получить из ITestResult: result.getMethod().getMethodName().

 

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

    public String getClassAndMethodForLog() {
        StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
        String message = "";
        if(stackTraceElements.length >= 3) {
            StackTraceElement element = stackTraceElements[2];
            String className = element.getClassName();
            className = className.toString().substring(className.lastIndexOf(".")+1);
            String methodName = element.getMethodName();
            message = "{ " + className + ": " + methodName + " } ";
        }
        return message;
    }

Выводит, к примеру "{ SomeHelperOrTestClass: someMethod }". 

 

А про log4j - он как раз и делает то, что вы спрашиваете. 

Например, у меня есть логгер с форматом сообщения "<PatternLayout pattern="[%level]&#9;%d{yyyy-MM-dd HH:mm:ss.SSS}&#9;[%C{2}.%M:%L]&#9;%msg%n"/>", который выводит мне в отдельный файл:

[DEBUG] 2016-04-12 17:07:38.642 [somePkg.SomeClass.someMethod:265] log message

прим.: 265 = номер строки.

 

И есть другой логгер с форматом сообщения "<PatternLayout pattern="[%level]&#9;%d{dd.MM.yyyy HH:mm:ss}&#9;[%C{1}.%M(%F:%L)]%n&#9;%msg%n"/>", который выводит мне в консоль:

[DEBUG] 12.04.2016 17:54:33 [SomeClass.someMethod(SomeClass.java:647)]
     log message

Причем в этом примере - "SomeClass.java:647" - кликабельная ссылка на указанную строку.

 

Настроено у меня несколько логгеров. 

В рамках одного и тоже запуска - в один файлик складывается по 1 строке на 1 проверку информация о созданных тестовых объектах (минимум информации для возможности поиска объектов в тестовой системе + инфа для какого теста каждый из объектов создан).

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

В третий - полный лог, на случай необходимости поиска ошибок и т.д.

Отдельно для проверки расчетов по тестовым объектам - в отдельной подпапке создаются файлики с логами расчетов по принципу 1 объект = 1 файлик, с названием вида "ok_testMethod_objectId". Сразу видно результат, из какого метода, какой объект был создан.

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

 

Кроме того, сами тесты настроены так, что, к примеру, список анкет и список расчетов никогда не очищается (1 строка на 1 проверку - даже при большом количестве запусков не так уж и много, а иногда помогает найти какие-нибудь "старые" данные), а полный лог - очищается автоматически при каждом запуске (т.к. при больших тестах может быть огромным).


  • 0

#7 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 12 апреля 2016 - 15:04

Тут есть решение

 

http://automated-tes...-paralleli/2298

 

но его необходимо улучшить

Добавлять в каждый тест

logger = setUp("simpleTest_02");

А, если у тебя 2000 авто-тестов - добавить 2000 строчек кода )))
Плюс в тестах обычно находится обычный DSL и не совсем понятно, как сделать, чтобы название теста печаталось в других классах (это в любом случае надо тестить - и тестить очень тщательно)

Название теста можно выцепить из ITestListener

 

PS в общем, для решения данной задачи нужно подумать


  • 0

#8 elvis

elvis

    Постоянный участник

  • Members
  • PipPipPip
  • 189 сообщений
  • Город:Tallinn


Отправлено 12 апреля 2016 - 17:28

Жесть, но есть над чем поработать. В итоге конечно, будет всё в каше, но по названию тестового класса можно grep'ом отфильтровать что надо. Плюс наверное буду писать для каждого тест класса отдельный лог файл.


  • 0

#9 DmitriyQA

DmitriyQA

    Постоянный участник

  • Members
  • PipPipPip
  • 183 сообщений
  • ФИО:Коваленко Дмитрий Владимирович
  • Город:Tel Aviv

Отправлено 13 апреля 2016 - 12:53

У нас есть список обьектов TestStepRecord

private final List<TestStepRecord> steps = new LinkedList();

 

Он в себе содержит сами элетменты логов

public TestStepRecord(int stepIndex, Level level, String message, String globalTime, String elapsedTime) {

.......

}

 

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


  • 0

Senior QA/ Wix.com / qaacademy.net



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

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