как передать конкретные аргументы в пакетных командах во время сборки jenkins - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь использовать Jenkins для автоматизации тестирования производительности с JMeter, каждая сборка представляет собой отдельный тест JMeter, и я хочу увеличить количество пользователей (потоков) для каждой сборки Jenkins, если предыдущая была успешной.

Я сконфигурировал большую часть сборки, с плагином SSH я могу перезапустить Tomcat, скопировать catalina.out, с производительностью публикации я могу открыть файл .jtl и определить, была ли сборка успешной.

Я хочу выполнить другую пакетную команду для следующей сборки (чтобы увеличить количество пользователей (потоков) и идентификаторов пользователей) Например:

jmeter -Jthreads = 10 -n -t C: \ TestScripts \ script.jmx -l C: \ TestScripts \ Jenkins.jtl

jmeter -Jthreads = 20 -n -t C: \ TestScripts \ script.jmx -l C: \ TestScripts \ Jenkins.jtl

jmeter -Jthreads = 30 -n -t C: \ TestScripts \ script.jmx -l C: \ TestScripts \ Jenkins.jtl ...

Есть ли хороший плагин jmeter для счетчика, который я могу использовать для увеличения переменной на 10 каждый раз:

jmeter -Jthreads =% variable1% ...

Я попытался установить переменные среды, а затем увеличить эту переменную на:

"SET / A thread + = 10"

но она не меняет эту переменную, потому что jenkins открывает собственную CMD, новый процесс:

("вызов cmd / c C: \ WINDOWS \ TEMP \ jenkins556482303577128680.bat")

Ответы [ 4 ]

0 голосов
/ 05 февраля 2019

Я нашел решение, которое работает для меня, это довольно красиво.Я создал скрипт Python, который изменяет файл .CVS, из которого JMeter читает количество потоков и идентификатор начального пользователя.Этот скрипт Python увеличивает идентификатор начального пользователя на количество потоков в предыдущем билде и количество потоков на 10

file = open('C:\\Users\\mp\\AppData\\Local\\Programs\\Python\\Python37-32\\eggs.csv', 'r') 
a,b=file.readlines()[0].split(",")
print(a,b)
b=int(b)
a=int(a)
b=a+b
a=a+10
print(a,b)
f = open("C:\\Users\\mp\\AppData\\Local\\Programs\\Python\\Python37-32\\eggs2.csv", "a")
f.write(str(a)+","+str(b))
f.close()

У меня есть Python на моем компьютере, и я вызываю скрипт в Jenkins как окнаКоманда Баха

C:\Users\mp\AppData\Local\Programs\Python\Python37-32\python.exe C:\Users\mp\AppData\Local\Programs\Python\Python37-32\rename_write_file.py

Я гораздо лучше в Python, чем Java, поэтому я реализовал это в Python.Поэтому для каждого нового теста CSV-файл, из которого jmeter считывает значения, изменяется.

0 голосов
/ 28 января 2019

Не зная свою конфигурацию Jenkins и какие плагины вы установили и как вы проводите тестирование, довольно сложно найти лучшее решение.

Единственный «универсальный» обходной путь, который я могу придумать, - записать текущее количество потоков в файл в рабочем пространстве Jenkins и прочитать значение потоков из файла при следующем выполнении.

  1. Добавить setUp Group Thread * в ваш план тестирования
  2. Добавить JSR223 Sampler в вашу группу потоков
  3. Поместите следующий Groovy код в область «Сценарий»:

    import org.apache.jmeter.threads.ThreadGroup
    import org.apache.jorphan.collections.SearchByClass
    import org.apache.commons.io.FileUtils
    
    SampleResult.setIgnore()
    
    def file = new File(System.getenv('WORKSPACE') + System.getProperty('file.separator') + 'threads.number')
    
    if (file.exists()) {
    
    
        def newThreadNum = (FileUtils.readFileToString(file, 'UTF-8') as int) + 10
        FileUtils.writeStringToFile(file, newThreadNum as String)
    
        def engine = ctx.getEngine()
        def test = org.apache.commons.lang.reflect.FieldUtils.getField(engine.getClass(), 'test', true)
        def testPlanTree = test.get(engine)
    
        SearchByClass<ThreadGroup> threadGroupSearch = new SearchByClass<>(ThreadGroup.class)
        testPlanTree.traverse(threadGroupSearch)
        def threadGroups = threadGroupSearch.getSearchResults()
        threadGroups.each {
            it.setNumThreads(newThreadNum)
        }
    } else {
        FileUtils.writeStringToFile(file, props.get('threads'))
    }
    

    Код запишет текущее количество потоков во всех группах потоков в файлвызывается threads.number в Jenkins Workspace и при последующих запусках он считывает значение из него, добавляет 10 и записывает его обратно.

0 голосов
/ 29 января 2019

Пока я создаю 20 файлов .jmx (1.jmx, 2.jmx, 3.jmx ...) каждый с разным количеством пользователей. и вызывая их с помощью этой команды:

jmeter -n -t C: \ TestScripts \% BUILD_NUMBER% .jmx -l C: \ TestScripts \% BUILD_NUMBER% .jtl

первый билд будет называть 1.jmx, второй 2.jmx ... это не лучший метод, но он работает на данный момент. Я попробую ваш совет в выходные, когда у меня будет больше времени.

0 голосов
/ 27 января 2019

Используйте следующую команду SET , чтобы увеличить threads переменную на 10:

SET /A threads=threads+10

Или внутри двойных кавычек:

SET /A "threads+=10"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...