Использование gtest в jenkins

Я успешно запустил свой модульный тест с помощью google test в Jenkins, но я не знаю, как показать файл .xml, созданный gtest. Говорят, что gtest удовлетворяет формату JUnit, поэтому я установил следующее:

Скриншот

Но это заканчивается ошибками после постройки.

Файлы отчетов об испытаниях не найдены. Ошибка конфигурации?
Шаг сборки "Опубликовать отчет о результатах тестирования JUnit" изменил результат сборки на FAILURE
Завершено: FAILURE


person venus.w    schedule 18.07.2012    source источник
comment
Находится ли файл result.xml в корне рабочей области? Если вы просмотрите свое рабочее пространство, вы сможете найти файл result.xml и указать точный путь к нему.   -  person Arnestig    schedule 18.07.2012
comment
@sti: Я добавил точные ошибки, а где корень рабочего пространства Jenkins?   -  person venus.w    schedule 19.07.2012
comment
Я знаю, что может быть поздно, но, возможно, кто-то снова столкнется с этим вопросом, К счастью, теперь gtest совместим с JUnit в Jenkins (я читал, что есть еще некоторые проблемы, но для меня все было хорошо) Я использовал последний gtest из их основной ветки, сгенерированный xml был совместим с JUnit, и Дженкинс просто взял его и обработал.   -  person Amir Dashti    schedule 27.06.2019


Ответы (6)


Ответ Фрейзера хорош, и вам нужна дополнительная обработка для преобразования gtest XML в правильный формат JTest.

Сначала вы просите gtest вывести результат в XML, используя:

mygtestapp --gtest_output=xml:gtestresults.xml

Затем в скрипт вам нужно добавить дополнительные элементы, чтобы правильно пометить пропущенные тесты как таковые. Процессор Jenkin JTest требует, чтобы пропущенный тест содержал элемент ‹skipped›, а не просто устанавливал статус «не запущен»:

awk '{ if ($1 == "<testcase" && match($0, "notrun")) print substr($0,0,length($0)-2) "><skipped/></testcase>"; else print $0;}' gtestresults.xml > gtestresults-skipped.xml
mv gtestresults.xml gtestresults.off

Если вы запускаете это в пакетном файле Windows, поместите действие awk в файл, чтобы избежать проблем с кавычками. awk.progfile:

{ if ($1 == "<testcase" && match($0, "notrun")) print substr($0,0,length($0)-2) "><skipped/></testcase>"; else print $0;}

И создайте add в вашем bat-файле:

awk -f awk.progfile gtestresults.xml > gtestresults-skipped.xml

Наконец, вы указываете процессор JTest как шаг после сборки для чтения преобразованного XML:

# Publish JUnit Test Result Report
Test Report XMLs: gtestresults-skipped.xml
person MattiasF    schedule 28.12.2012
comment
Теперь также можно анализировать вывод googletest с помощью плагина xUnit, опция googletest 1.6. Кажется, что он может справиться с отключенными тестами без awk магии, а также корректно работает с googletest 1.7. - person avtomaton; 06.11.2016

Вы запускаете свой тестовый исполняемый файл с правильными флагами (например, --gtest_output=xml[:DIRECTORY_PATH\|:FILE_PATH])?

Из вывода --help:

--gtest_output=xml[:DIRECTORY_PATH\|:FILE_PATH] Generate an XML report in the given directory or with the given file name. FILE_PATH defaults to test_details.xml.

person Fraser    schedule 18.07.2012

Ошибка на странице конфигурации Jenkins - отвлекающий маневр.

По сути, происходит то, что XML-файл отчета о тестировании не был сгенерирован заданием сборки. Итак, вы получите эту ошибку:

Recording test results
No test report files were found. Configuration error? 

Разумеется, локацию нужно настроить правильно. Для этого см. Этот пост:

Как настроить отчеты о тестировании при работе Jenkins CI с grails?

Итак, как исправить ошибку? Ключ в том, чтобы изучить вывод консоли, чтобы проверить, успешно ли прошли тесты. Скорее всего, нет, и поэтому произошла ошибка.

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

Вы используете JUnit, так что это будет проект Java. Я отмечу здесь, на случай, если это может помочь другим, что мы использовали Xcode. Тесты не проводились.

В выводе консоли Jenkins чуть выше ошибки была эта заметка:

 note: RunUnitTests exited without running tests because TEST_AFTER_BUILD was set to NO.

Возвращение в Xcode и установка флага Test After Build цели UnitTests на YES помогли. Это в разделе Модульное тестирование. Вы также можете, конечно, установить флаг на уровне проекта и изменить цель на «Другое», установив значение $(inherited).

person Max MacLeod    schedule 17.08.2012

Ваш файл результатов хранится в неправильном месте, и плагин Jenkins не может его найти. Вы храните его где-нибудь после выполнения тестов и создания XML-файла?

Я предлагаю попробовать заставить его работать, заменив result.xml на '*' (при условии, что это единственный XML-файл, который должен там храниться), и если это сработает, начните работать с правильным именем файла.

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

person ratkok    schedule 22.08.2012

У Jenkins есть плагин xunit, который конвертирует googletest xml в формат junit: https://plugins.jenkins.io/xunit/ < / а>.

Пример трубопровода

pipeline {
    agent any
    stages {
        stage('Test'){
            steps {
                sh "run_tests.bash"
            }
        }
    }
    post {
        always{
            xunit (
                thresholds: [ skipped(failureThreshold: '0'), failed(failureThreshold: '0') ],
                tools: [ GoogleTest(pattern: 'reports/*.xml') ]
            )
        }
    }
}

Другие полезные ссылки:

person Dennis Hoer    schedule 16.04.2020
comment
Похоже, в вашем коде слишком много скобок ')'. - person ChrisRo; 16.06.2020
comment
снятая скоба - person Dennis Hoer; 29.12.2020

Вот пакетная версия Windows для преобразования google-test "notRun" в junit, "пропущенный" с помощью пакета Windows. Я знаю, что есть более элегантные способы, но для этого требуется только пакет Windows, и он выполняет свою работу.

rem convert gtest xml to junit compatible format (replace notRun by skipped)
IF EXIST  %INTEXTFILE% (
    IF EXIST %OUTTEXTFILE% (
        del %OUTTEXTFILE%
        waitfor fileSystemToDoItsStuff /t 1
    )
    FOR /f "tokens=1,* delims=¶" %%A IN ( '"type %INTEXTFILE%"') DO (
        ECHO."%%A" | findstr /C:"DISABLED_">nul & IF ERRORLEVEL 1 (
            SET modified=%%A
        ) ELSE (
            SET string=%%A
            SET modified=!string:/^>=^>^<skipped /^>^</testcase^>!
        )
        ECHO !modified!>> %OUTTEXTFILE%
    )
    del %INTEXTFILE%
    waitfor fileSystemToDoItsStuff /t 1
    move %OUTTEXTFILE% %INTEXTFILE%
)
person wuppi    schedule 22.09.2017