Мне нужно запускать файлы функций огурца параллельно, используя gradle

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

Can somebody please look into this issue and provide me some inputs.


**Below is my build.gradle file** 

        

    plugins {
            id 'java'
            id 'maven-publish'
            //id 'java-library'
            //id 'io.qameta.allure' version '2.8.1'
        
        }
        
        
        repositories {
            mavenCentral()
            jcenter()
        }
        
        task deleteGraphicsAssets(type: Delete) {
            delete "build"
        }
        
        task allureHistoryCopy() {
            mkdir "./allure-results/history"
            copy {
                from "./allure-report/history"
                into "./allure-results/history/"
            }
        }
        
        group 'com.hal.brands'
        version '1.0-SNAPSHOT'
        sourceCompatibility = 1.8
        
            
        def cucumberVersion = '4.8.0'
        def gherkinVersion  = '5.1.0'
        def hamcrestVersion = '1.3'
        
        def testngVersion = '6.14.3'
        def cucumber4adapterVersion = '1.0.11'
        
        def Log4jVersion = '1.2.17'
        def slf4jVersion = '1.7.5'
        
        def restassuredVersion = '3.3.0'
        def jsonsimpleVersion = '1.1.1'
        
        def appiumjavaClientVersion = '7.3.0'
        
        def allurePluginVersion = '2.8.1'
        def allurecucumber4jvmVersion = '2.13.0'
        def codeborneselenideVersion = '5.3.1'
            
        
        dependencies {
        
            //All version of the dependencies are defined above
        
            //Cucumber
            testImplementation  "io.cucumber:cucumber-java:${cucumberVersion}"
            testImplementation  "io.cucumber:cucumber-jvm:${cucumberVersion}"
            testImplementation  "io.cucumber:cucumber-core:${cucumberVersion}"
            testImplementation  "io.cucumber:cucumber-testng:${cucumberVersion}"
        
            implementation  "io.cucumber:cucumber-picocontainer:${cucumberVersion}"  //Do not change from implementation to testImplementation otherwise Scenario will throw errors
        
            //Cucumber Gherkin
            testImplementation  "io.cucumber:cucumber-gherkin:${gherkinVersion}"
        
            //Hamcrest
            testImplementation "org.hamcrest:hamcrest-all:${hamcrestVersion}"
        
        
            //TestNg
            //testImplementation "org.testng:testng:${testngVersion}"
            //testCompile group: 'org.testng', name: 'testng', version: '6.13.1'
        
        
            //Cucumber Adapter Extent Reports
            //testImplementation  'com.aventstack:extentreports:4.0.9'   // Do not use this when you are using Cucumber Adapter Extent reports. Not Required when Adapter used
            testImplementation  "com.aventstack:extentreports-cucumber4-adapter:${cucumber4adapterVersion}"
        
        
            //Log4j Logs
            implementation "log4j:log4j:${Log4jVersion}"  //Do not change from implementation to testImplementation otherwise  PropertyConfigurator and Logger will throw errors
        
            //Rest Assured Apis
            testImplementation "io.rest-assured:rest-assured:${restassuredVersion}"
            testImplementation "com.googlecode.json-simple:json-simple:${jsonsimpleVersion}"
            testImplementation 'org.json:json:20180813'
        
        
            //Selenium Apis
            compile group: 'org.seleniumhq.selenium', name: 'selenium-server', version: '3.141.59'
            implementation 'com.paulhammant:ngwebdriver:1.1.4'
            compile group: 'org.seleniumhq.selenium', name: 'selenium-htmlunit-driver', version: '2.52.0'
            implementation 'org.seleniumhq.selenium:selenium-java:3.141.59'
        
        
            //Allure Reports
            testImplementation "io.qameta.allure:allure-cucumber4-jvm:${allurecucumber4jvmVersion}"
            implementation "io.qameta.allure:allure-selenide:${allurecucumber4jvmVersion}"
            implementation "com.codeborne:selenide:${codeborneselenideVersion}"
        
        
            //Appium
            implementation "io.appium:java-client:${appiumjavaClientVersion}"
        
        
            //Netty Jar is important
            compile group: 'io.netty', name: 'netty-all', version: '4.1.31.Final'
        
            //AspectJweaver
            runtime group: 'org.aspectj', name: 'aspectjweaver', version: '1.9.6'
        
            compile group: 'com.browserstack', name: 'browserstack-integration', version: '1.0.0'
            compile group: 'com.browserstack', name: 'browserstack-local-java', version: '0.3.0'
        
            //MongoDB
            // https://mvnrepository.com/artifact/org.mongodb/mongodb-driver
            // compile group: 'org.mongodb', name: 'mongodb-driver', version: '3.12.6'
            // compile group: 'org.mongodb', name: 'mongodb-driver', version: '3.4.2'
        
            // https://mvnrepository.com/artifact/org.mongodb/mongo-java-driver
            compile group: 'org.mongodb', name: 'mongo-java-driver', version: '3.12.6'
        
            //SqlServer
            // https://mvnrepository.com/artifact/com.microsoft.sqlserver/mssql-jdbc
            compile group: 'com.microsoft.sqlserver', name: 'mssql-jdbc', version: '7.2.1.jre8'
        
            // https://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple
            compile group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1.1'
        
        
        
            //SqlServer
            // https://mvnrepository.com/artifact/com.microsoft.sqlserver/mssql-jdbc
            compile group: 'com.microsoft.sqlserver', name: 'mssql-jdbc', version: '7.2.1.jre8'
        
        
             compile fileTree(dir: 'libs', include: 'testng-6.14.3.jar')   //This should be last statement
           
        }
        
        
        configurations {
            cucumberRuntime.extendsFrom testImplementation
        }
        
        
        
        task runTest() {
            dependsOn assemble, testClasses
            doLast {
                javaexec {
                    main = "io.cucumber.core.cli.Main"
                    classpath = configurations.cucumberRuntime + sourceSets.main.output + sourceSets.test.output
        
                    systemProperty "environment", project.findProperty("env") ?: "QA"
                    systemProperty "platform", project.findProperty("plt")  ?: "browserstack"
                    
                    
        
                    args = [
        
                             '--threads' , '2',
                          
                          
                            '--plugin', 'pretty',
        
                            '--plugin', 'json:target/HAL.json',
        
                            //'--plugin', 'io.qameta.allure.cucumber4jvm.AllureCucumber4Jvm',
        
                            '--plugin', 'com.aventstack.extentreports.cucumber.adapter.ExtentCucumberAdapter:Report',
        
                            '--glue',   'com.pros.InitDriver',
        
                            '--glue',   'com.pros.helper.Logger',
        
                            '--glue',   'com.pos.it.helper',
        
                            '--glue',   'com.bpos.test.stepdefinition',
        
                            '--glue',   'src/main/java','src/test/resources','src/main/resources',
        
                            '--tags',    project.findProperty("testTag")  ?: "@sanity"
        
                    ]
        
                }
        
            }
        }
        
         /*
        
            allure {
                System.setProperty( "user.dir", project.projectDir.toString() )
                version = allurePluginVersion
                autoconfigure = true
                aspectjweaver = true
                //boolean clean = true
                resultsDir = file("${project.projectDir}/allure-results");
                println "resultsDir : ${resultsDir}"
                reportDir = file("${project.projectDir}/allure-report");
                println "reportDir : ${reportDir}"
                String configuration = 'testImplementation'
                useTestNG {
                    version = '2.0-BETA10'
                }
                useCucumberJVM {
                    version = '2.0-BETA10'
                }
            }
        
           runTest.finalizedBy 'allureReport'
         */
        
        
        task packageZip(type: Zip){
        
        
            from "$project.rootDir/Automation_Report"
            print "$project.rootDir\n"
            destinationDir = file("$project.rootDir/Archive")
            Date date = new Date()
            String datePart = date.format("yyyyMMdd")
            String timePart = date.format("HHmmss")
            println "datePart : " + datePart + "\ttimePart : " + timePart
        
            archiveName = datePart+"_"+timePart+"_"+"IST.zip"
        
            //  archiveName = "datePart_timePart_IST.zip"
            println "Zip action complete"
        }
        
        
        
        
        tasks.test {
        
            // finalizedBy runTest
            finalizedBy packageZip
        
        }


**Below the sample command that I use in command prompt**
gradle runTest -PtestTag=@sanity_ui -Penv=STAGE -Pplt=Local

**Below is my project Hierarchy**

[![][1]][1]

Я не уверен, что нужно включить в раздел args в файле build.gradle, чтобы он запускал параллельное выполнение.

Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Если вы являетесь веб-разработчиком или тестировщиком, вы можете быть знакомы с Selenium, популярным инструментом для автоматизации работы...
1
0
5 041
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мой недавний ответ на этот тесно связанный вопрос должен быть полезен здесь: https://stackoverflow.com/a/65473008/10256045

Для параллельной работы огурца требуется небольшая настройка. правильно с градиентом.

  • Каждый тест должен быть потокобезопасным, поэтому вам нужно быть осторожным со статическим использованием.
  • Для каждого потока необходимо сделать несколько драйверов
  • logging должен регистрировать правильный поток и сценарий

У меня есть скелетный фреймворк, который обрабатывает все это, что вы можете использовать в качестве ссылки или сборки отсюда

Для вашего конкретного вопроса в build.gradle вы определяете --threads вариант огурца.

Посмотрите здесь в build.gradle

Эти переменные используются для настройки параллельных запусков и определения потоков. использовать в вариантах огурца

def availableThreadCount = Runtime.runtime.availableProcessors().intdiv(2) ?: 1
def cucumberThreadsOption = ['--threads', availableThreadCount.toString()]

если используется задача runInParallel, она устанавливает для setParallel значение true. Мы затем добавьте аргумент --threads в параметры огурца Это где это происходит в задаче с огурцом

Вот где используются варианты встроенного огурца

Здесь CreateSharedDrivers.java мы занимаемся созданием несколько драйверов для потоков и реализован хук выключения.

В Hooks.java здесь есть пример того, как мы логируем тред и его текущий сценарий

Спасибо за обновление и информацию, и я обязательно рассмотрю это и дам свой вывод.

Balaji Singh .Y 06.01.2021 07:56

Можем ли мы интегрировать вашу структуру с отчетами о масштабах и привлекательности?

Balaji Singh .Y 07.01.2021 03:18

Подскажите, пожалуйста, где можно изменить/добавить название проекта, чтобы оно отображалось в Актуальном отчете?

Balaji Singh .Y 07.01.2021 17:08

Большое спасибо. Я проверю, попробую и свяжусь с вами.

Balaji Singh .Y 07.01.2021 17:18

Я думаю, что при каждом запуске этот «TestResults/Reports/cucumber-html» будет перезаписываться. Не уверен, куда его написать один раз, чтобы при всех запусках отображалось название проекта без дальнейших изменений

Balaji Singh .Y 07.01.2021 17:30
Здесь я удаляю старые результаты тестов. Вам придется возиться с этим, если вы не хотите, чтобы эта функциональность
Sean F 07.01.2021 17:40

На всякий случай, если у вас есть последний обновленный проект (Cucumber + gradle) на параллельном тестировании, пожалуйста, перейдите по ссылке репозитория git.

Balaji Singh .Y 07.01.2021 17:54

На всякий случай, если у вас есть последний обновленный проект (Cucumber + gradle) на параллельном тестировании, пожалуйста, перейдите по ссылке репозитория git.

Balaji Singh .Y 07.01.2021 17:58

@BalajiSingh.Y это ссылка на репозиторий git github.com/seanfrenzel/…

Sean F 07.01.2021 18:06

Подскажите, пожалуйста, как переопределить теги, передав параметр из командной строки. Например, некоторые из них, как показано ниже, gradle runTest -PtestTag = "@sanity_ui1" -Pplt=local -Penv=stage -Pbrowser=chrome

Balaji Singh .Y 12.01.2021 16:36

-P для свойств проекта, которые вы должны использовать -D для системных свойств

Sean F 14.01.2021 15:23

Используйте -DdeviceName=chrome для смены драйвера. Проверьте конфигурацию для использования системных свойств. github.com/seanfrenzel/… @BalajiSingh.Y

Sean F 14.01.2021 15:33

Большое спасибо за всю помощь и информацию. Для тестов пользовательского интерфейса это очень хорошо. Можете ли вы предоставить мне рабочий фрагмент кода для параллельного выполнения API. Для API я использую Rest Api`s (HTTPRequest и Http Response). Ниже приведен пример кода, который я использую.

Balaji Singh .Y 27.01.2021 09:35

импортировать io.restassured.response.Response; импортировать io.restassured.specification.RequestSpecification; public RequestSpecification get_httpRequest_Ref(String url) { System.out.println("Вызван метод спецификации запроса"); httpЗапрос= ноль; if (httpRequest==null) { System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2"); RestAssured.baseURI = URL-адрес; RestAssured.useRelaxedHTTPSValidation(); httpRequest = RestAssured.given().log().all(); } else { System.out.println("HttpRequest не равен null"); } вернуть httpRequest; }

Balaji Singh .Y 27.01.2021 09:49

: Для ответа API общедоступный статический ответ getHttpResponse (String endpoint_path) { response = httpRequest.get (endpoint_path); ответный ответ; }

Balaji Singh .Y 27.01.2021 09:50

рад слышать это. Если это было полезно, не могли бы вы выбрать мой ответ в качестве решения с некоторыми отзывами и отметить проект в главной роли :) Я бы предложил использовать что-то другое, кроме огурца, для тестирования API. Я бы проверил Checkout, так как обнаружил, что это намного лучше для тестирования API.

Sean F 30.01.2021 00:35

Я проголосовал за ваш правильный ответ и предоставленную вами помощь. Но моему проекту нужны все вещи (я имею в виду мобильные устройства, пользовательский интерфейс, API) в одном фреймворке. Поэтому приходится искать решение здесь.

Balaji Singh .Y 01.02.2021 10:26
Для мобильных устройств вы можете найти помощь с другим моим проектом здесь. Я не смогу больше помочь с API, и если вы хотите использовать для этого огурец, вам придется найти собственное решение, если вы хотите продолжать использовать эту структуру проектов. Я бы предложил иметь пользовательский интерфейс, API как свои собственные подпроекты в gradle, если вам нужно иметь все в одном проекте. Для проверки API Spock или что-то вроде Karate, которое также использует Gherkin.
Sean F 01.02.2021 14:13

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

Balaji Singh .Y 01.02.2021 20:28

Большое спасибо! И можно ли добавить слушателя к задаче огурца?

balantain 10.05.2023 20:38

Другие вопросы по теме