Поделитесь опытом, коллеги. Кто как логирует прогресс тестов, и логируете ли вообще. В случае когда все тесты идут один за другим нет вопросов, а вот с параллельными тестами возникает каша в консоли. Интересует конечно прежде всего варианты для Java.
Логирование параллельных тестов
#1
Отправлено 11 апреля 2016 - 12:13
#2
Отправлено 11 апреля 2016 - 13:05
ну наверное самое очевидное решение в начале строки указывать id обработчика тестов в общем логе. Это решение универсально для любого языка.
#3
Отправлено 12 апреля 2016 - 13:35
Ну обычно сначала пишут название теста, а потом действие. Когда-то делал что-то похожее, надо найти старый код и адаптировать под новые реалии
#4
Отправлено 12 апреля 2016 - 14:11
Как вариант, с log4j можно настроить не только разные уровни логирования (WARN, DEBUG и т.д.), но и разные способы (один тест в консоль, другой подробно в текстовый файлик, третий в еще один файлик, но только краткую информацию и т.п.).
#5
Отправлено 12 апреля 2016 - 14:33
Как вариант, с log4j можно настроить не только разные уровни логирования (WARN, DEBUG и т.д.), но и разные способы (один тест в консоль, другой подробно в текстовый файлик, третий в еще один файлик, но только краткую информацию и т.п.).
С любым логером можно так сделать, но все равно получается каша
Масс файлы - тоже не вариант
Цель - сделать норм лог, который при параллельном выполнении будет записывать в файл и/или консоль. Информация должна обязательно содержать название тестового метода. ЯП Java, фреймоворк TestNG
#6
Отправлено 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]	%d{yyyy-MM-dd HH:mm:ss.SSS}	[%C{2}.%M:%L]	%msg%n"/>", который выводит мне в отдельный файл:
[DEBUG] 2016-04-12 17:07:38.642 [somePkg.SomeClass.someMethod:265] log message
прим.: 265 = номер строки.
И есть другой логгер с форматом сообщения "<PatternLayout pattern="[%level]	%d{dd.MM.yyyy HH:mm:ss}	[%C{1}.%M(%F:%L)]%n	%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 проверку - даже при большом количестве запусков не так уж и много, а иногда помогает найти какие-нибудь "старые" данные), а полный лог - очищается автоматически при каждом запуске (т.к. при больших тестах может быть огромным).
#7
Отправлено 12 апреля 2016 - 15:04
Тут есть решение
http://automated-tes...-paralleli/2298
но его необходимо улучшить
Добавлять в каждый тест
logger = setUp("simpleTest_02");
А, если у тебя 2000 авто-тестов - добавить 2000 строчек кода )))
Плюс в тестах обычно находится обычный DSL и не совсем понятно, как сделать, чтобы название теста печаталось в других классах (это в любом случае надо тестить - и тестить очень тщательно)
Название теста можно выцепить из ITestListener
PS в общем, для решения данной задачи нужно подумать
#8
Отправлено 12 апреля 2016 - 17:28
Жесть, но есть над чем поработать. В итоге конечно, будет всё в каше, но по названию тестового класса можно grep'ом отфильтровать что надо. Плюс наверное буду писать для каждого тест класса отдельный лог файл.
#9
Отправлено 13 апреля 2016 - 12:53
У нас есть список обьектов TestStepRecord
private final List<TestStepRecord> steps = new LinkedList();
Он в себе содержит сами элетменты логов
public TestStepRecord(int stepIndex, Level level, String message, String globalTime, String elapsedTime) {
.......
}
Каждый тест пишет свой елемент списка. Каждый тест запускатся отдельным процессом, отдельным инстансом, пишет в консоль только от себя
Senior QA/ Wix.com / qaacademy.net
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных