Я работаю над автоматизацией, основанной на 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, чтобы он запускал параллельное выполнение.
Мой недавний ответ на этот тесно связанный вопрос должен быть полезен здесь: 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 здесь есть пример того, как мы логируем тред и его текущий сценарий
Можем ли мы интегрировать вашу структуру с отчетами о масштабах и привлекательности?
Подскажите, пожалуйста, где можно изменить/добавить название проекта, чтобы оно отображалось в Актуальном отчете?
Большое спасибо. Я проверю, попробую и свяжусь с вами.
Я думаю, что при каждом запуске этот «TestResults/Reports/cucumber-html» будет перезаписываться. Не уверен, куда его написать один раз, чтобы при всех запусках отображалось название проекта без дальнейших изменений
На всякий случай, если у вас есть последний обновленный проект (Cucumber + gradle) на параллельном тестировании, пожалуйста, перейдите по ссылке репозитория git.
На всякий случай, если у вас есть последний обновленный проект (Cucumber + gradle) на параллельном тестировании, пожалуйста, перейдите по ссылке репозитория git.
@BalajiSingh.Y это ссылка на репозиторий git github.com/seanfrenzel/…
Подскажите, пожалуйста, как переопределить теги, передав параметр из командной строки. Например, некоторые из них, как показано ниже, gradle runTest -PtestTag = "@sanity_ui1" -Pplt=local -Penv=stage -Pbrowser=chrome
-P для свойств проекта, которые вы должны использовать -D для системных свойств
Используйте -DdeviceName=chrome для смены драйвера. Проверьте конфигурацию для использования системных свойств. github.com/seanfrenzel/… @BalajiSingh.Y
Большое спасибо за всю помощь и информацию. Для тестов пользовательского интерфейса это очень хорошо. Можете ли вы предоставить мне рабочий фрагмент кода для параллельного выполнения API. Для API я использую Rest Api`s (HTTPRequest и Http Response). Ниже приведен пример кода, который я использую.
импортировать 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; }
: Для ответа API общедоступный статический ответ getHttpResponse (String endpoint_path) { response = httpRequest.get (endpoint_path); ответный ответ; }
рад слышать это. Если это было полезно, не могли бы вы выбрать мой ответ в качестве решения с некоторыми отзывами и отметить проект в главной роли :) Я бы предложил использовать что-то другое, кроме огурца, для тестирования API. Я бы проверил Checkout, так как обнаружил, что это намного лучше для тестирования API.
Я проголосовал за ваш правильный ответ и предоставленную вами помощь. Но моему проекту нужны все вещи (я имею в виду мобильные устройства, пользовательский интерфейс, API) в одном фреймворке. Поэтому приходится искать решение здесь.
Большое спасибо за сообщение о мобильной части. Наверняка посмотрит.
Большое спасибо! И можно ли добавить слушателя к задаче огурца?
Спасибо за обновление и информацию, и я обязательно рассмотрю это и дам свой вывод.