Как я могу отфильтровать тесты в нашей сборке Gradle на Jenkins без коммитов? - PullRequest
0 голосов
/ 01 октября 2019

У меня есть сборка Gradle, которая выполняет набор тестов Java Selenium на Jenkins. Поскольку синхронизация может вызвать сбои теста Selenium, я повторно запускаю сбои раз или два.

Для этого я использую механизм фильтрации тестов Gradle, например:

test {
    [...]
    filter {
        includeTestsMatching "*AccountTest.canWithdrawMoney*"
    }
    [...]
}

Но это означает, что я долженсделать коммит Git с фильтром.

Теоретически я также могу использовать фильтр командной строки, например:

gradle test --tests "*AccountTest.canWithdrawMoney*"

Проблема в том, что я не вызываю gradle test для запускатесты. Я называю свои собственные задачи gradle testLocal или gradle testServer, в зависимости от того, выполняю ли я тесты на своем локальном ПК или сервере Jenkins, а соответствующая задача вызывает test.

(сервер Jenkins имеетделать дополнительные вещи, такие как загрузка и запуск нашего продукта; локально он уже запущен.)

Если я попытаюсь ...

gradle testLocal --tests "*AccountTest.canWithdrawMoney*"

... то произойдет сбой с помощью .. .

Неизвестный параметр командной строки '--tests'.

... предположительно потому, что testLocal и testServer нет (тип: Test)задач (и я не хочу, чтобы они были).

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

Итак: При такой настройке есть ли более простой способ передать тестовый фильтр в Gradle, который не потребует от меня добавления фильтра в качестве коммита Git?

Ответы [ 2 ]

1 голос
/ 01 октября 2019

Вы можете сделать

test {
    [...]
        def testFilter = findProperty('testFilter')
        if (testFilter) {
            filter {
               includePatterns = testFilter.split(',')
            } 
        } 
    [...]
}

И запустить, используя

gradle testLocal -PtestFilter=*AccountTest.canWithdrawMoney*
0 голосов
/ 01 октября 2019

Спасибо lance-java за помощь в получении этого, но я не мог заставить его работать решение, пока не поместил его в блок doFirst в задаче test. Я также изменил его для работы с несколькими классами и тестами.

Последняя версия, которая работала для меня, была:

test {
    [...]
    doFirst {
        def testFilter = System.getProperty('testFilter')
        if (testFilter) {
            def testFilterParts = testFilter.split(',')
            testFilterParts.each {
                item ->
                    filter {
                        includeTestsMatching item
                    }
            }
        }
    }
    [...]
}

Я использовал эквивалент этого фильтра в параметре Jenkins testFilter:

*TestClassA.methodA*,*TestClassB.methodB*,*TestClassC.methodC*
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...