serenity-bdd / serenity-core

Serenity BDD is a test automation library designed to make writing automated acceptance tests easier, and more fun.
http://serenity-bdd.info
Other
720 stars 519 forks source link

Serenity reports taking more than 46 mins for two tests #3238

Closed infa-vpatil closed 1 year ago

infa-vpatil commented 1 year ago

Please find below my build.gradle file

`plugins { id 'org.springframework.boot' version "${SPRING_VERSION}" apply false id 'io.spring.dependency-management' version "${SPRING_DEP_MANAGEMENT_VERSION}" apply false id "net.serenity-bdd.serenity-gradle-plugin" version "3.9.8" apply false id "io.freefair.lombok" version "6.4.1" apply false id 'com.adarshr.test-logger' version '3.0.0' id 'java' }

project.ext { testParamPrefix = "mdmtest." }

group = 'com.informatica' version = '0.0.1-SNAPSHOT'

configurations { compileOnly { extendsFrom annotationProcessor } }

repositories { mavenCentral() }

//to copy parent project properties to current import org.apache.tools.ant.filters.ReplaceTokens

import java.util.stream.Collectors

processResources { with copySpec { from 'src/main/resources' include '/application*.yml' include '*/application.yaml' include '/application*.properties' project.properties.findAll().each { prop -> if (prop.value != null) { filter(ReplaceTokens, tokens: [(prop.key): prop.value]) filter(ReplaceTokens, tokens: [('project.' + prop.key): prop.value]) } } } }

allprojects {

//jvm settings
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: "io.freefair.lombok"
apply plugin: 'net.serenity-bdd.serenity-gradle-plugin'

compileJava.options.encoding = "UTF-8"
compileTestJava.options.encoding = "UTF-8"

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(16)
    }
}

//package settings
group 'com.informatica.mdmnext'
version '1.0'

//additional repositories as needed
repositories {
    mavenCentral()
    maven {
        name "MDM-common-services"
        url "http://mdmmaven.informatica.com/nexus/content/repositories/mdminfa/"
        allowInsecureProtocol true
    }
    maven {
        name "MDM-thirdparty"
        url "http://mdmmaven.informatica.com/nexus/content/repositories/mdminfa-snapshot/"
        allowInsecureProtocol true
    }
}

dependencies {
    implementation files('libs/ZapiUtility.jar')

    //slf4j over log4j
    implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: "${SLF4J_LOG4J_VERSION}"
    implementation group: 'org.apache.logging.log4j', name: 'log4j-core', version: "${SLF4J_LOG4J_VERSION}"
    implementation group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: "${SLF4J_LOG4J_VERSION}"

    //spring boot
    implementation group: 'org.springframework.boot', name: 'spring-boot-starter'
    implementation group: 'org.springframework.boot', name: 'spring-boot-starter-test'
    implementation group: 'org.springframework.boot', name: 'spring-boot-starter-cache'
    implementation group: 'org.springframework.data', name: 'spring-data-mongodb'
    implementation group: 'org.mongodb', name: 'mongo-java-driver', version: '3.12.11'
    implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-mongodb'
    implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web'

    //serenity
    implementation group: 'net.serenity-bdd', name: 'serenity-core', version: "${SERENITY_VERSION}"
    implementation group: 'net.serenity-bdd', name: 'serenity-spring', version: "${SERENITY_VERSION}"
    implementation group: 'net.serenity-bdd', name: 'serenity-cucumber', version: "${SERENITY_VERSION}"
    implementation group: 'net.serenity-bdd', name: 'serenity-rest-assured', version: "${SERENITY_VERSION}"
    implementation group: 'net.serenity-bdd', name: 'serenity-single-page-report', version: "${SERENITY_VERSION}"

    //serenity zephyr
    //implementation group: 'net.serenity-bdd', name: 'serenity-jira-plugin', version: "1.12.0"

    implementation group: 'org.glassfish.jersey.core', name: 'jersey-client', version: '2.25.1'
    implementation group: 'org.glassfish.jersey.core', name: 'jersey-common', version: '2.25.1'
    implementation group: 'com.googlecode.lambdaj', name: 'lambdaj', version: '2.3.3'

    //utils
    implementation group: 'com.codeborne', name: 'selenide', version: "${SELENIDE_VERSION}"
    implementation group: 'org.hamcrest', name: 'hamcrest', version: '2.2'
    implementation group: 'org.skyscreamer', name: 'jsonassert', version: '1.5.0'
    implementation group: 'com.jayway.jsonpath', name: 'json-path', version: '2.7.0'
    implementation group: 'org.awaitility', name: 'awaitility', version: '4.2.0'
    implementation group: 'com.github.ben-manes.caffeine', name: 'caffeine', version: '3.1.1'
    implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-xml'
    implementation group: 'commons-jxpath', name: 'commons-jxpath', version: '1.3'
    testImplementation group: 'org.assertj', name: 'assertj-core', version: '3.23.1'
    implementation group: 'com.jcraft', name: 'jsch', version: '0.1.54'
    implementation group: 'com.opencsv', name: 'opencsv', version: '5.6'
    implementation group: 'com.github.javafaker', name: 'javafaker', version: '0.15'

    //spring dependency is overriding selenium version from selenide. So had to resolve it like this
    implementation(group: 'org.seleniumhq.selenium', name: 'selenium-java') { version { strictly "[${SELENIUM_VERSION}]" } }
    implementation(group: 'org.seleniumhq.selenium', name: 'selenium-api') { version { strictly "[${SELENIUM_VERSION}]" } }
    implementation(group: 'org.seleniumhq.selenium', name: 'selenium-remote-driver') { version { strictly "[${SELENIUM_VERSION}]" } }
    implementation(group: 'org.seleniumhq.selenium', name: 'selenium-chrome-driver') { version { strictly "[${SELENIUM_VERSION}]" } }
    implementation(group: 'org.seleniumhq.selenium', name: 'selenium-firefox-driver') { version { strictly "[${SELENIUM_VERSION}]" } }
    implementation(group: 'org.seleniumhq.selenium', name: 'selenium-ie-driver') { version { strictly "[${SELENIUM_VERSION}]" } }
    implementation(group: 'org.seleniumhq.selenium', name: 'selenium-edge-driver') { version { strictly "[${SELENIUM_VERSION}]" } }
    implementation(group: 'org.seleniumhq.selenium', name: 'selenium-opera-driver') { version { strictly "[4.4.0]" } }
    implementation(group: 'org.seleniumhq.selenium', name: 'selenium-safari-driver') { version { strictly "[${SELENIUM_VERSION}]" } }
    implementation(group: 'org.seleniumhq.selenium', name: 'selenium-support') { version { strictly "[${SELENIUM_VERSION}]" } }
    implementation(group: 'org.seleniumhq.selenium', name: 'selenium-manager') { version { strictly "[${SELENIUM_VERSION}]" } }
    implementation(group: 'org.codehaus.groovy', name: 'groovy') { version { strictly "[3.0.8]" } }
    implementation(group: 'org.codehaus.groovy', name: 'groovy-xml') { version { strictly "[3.0.8]" } }
    implementation(group: 'org.codehaus.groovy', name: 'groovy-json') { version { strictly "[3.0.8]" } }
    implementation group: 'org.apache.httpcomponents.client5', name: 'httpclient5', version: '5.2.1'
}

configurations {
    configureEach {
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
        exclude group: 'org.apache.groovy', module: 'groovy'
        exclude group: 'org.apache.groovy', module: 'groovy-json'
        exclude group: 'org.apache.groovy', module: 'groovy-xml'
    }
}

}

// need to skip common from depending on itself configure(subprojects.findAll { it.name != 'common' }) {

apply plugin: 'net.serenity-bdd.serenity-gradle-plugin'

cleanTest {
    def serenityReportFolder = "${project.projectDir}/target"
    if (new File(serenityReportFolder).exists()) {
        delete serenityReportFolder
    }
}

test {
    dependsOn cleanTest
    //passing cucumber tags to test jvm
    systemProperty "cucumber.filter.tags", System.getProperty("cucumber.filter.tags")
    // overrides the browser type at runtime
    if (System.getProperty("selenide.browser") == null) {
        systemProperty "selenide.browser", 'chrome'
    } else {
        systemProperty "selenide.browser", System.getProperty("selenide.browser")
    }
    if (!(System.getProperty("selenide.remote") == null)) {
        systemProperty "selenide.remote", System.getProperty("selenide.remote")
    }
    // overrides the browser language at runtime
    if (System.getProperty("chromeoptions.prefs") == null) {
        systemProperty "chromeoptions.prefs", 'intl.accept_languages=en'
    } else {
        systemProperty "chromeoptions.prefs", System.getProperty("chromeoptions.prefs")
    }
    // overrides the headless option at runtime
    if (System.getProperty("selenide.headless") == null) {
        systemProperty "selenide.headless", 'false'
    } else {
        systemProperty "selenide.headless", System.getProperty("selenide.headless")
    }
    // overrides the timeout value at runtime
    if (System.getProperty("selenide.timeout") == null) {
        systemProperty "selenide.timeout", '90000'
    } else {
        systemProperty "selenide.timeout", System.getProperty("selenide.timeout")
    }
    //To override zephyr update in jira
    systemProperty "jira.update", System.getProperty("jira.update")

    //To override project type in jira
    systemProperty "jira.project", System.getProperty("jira.project")

    if ((System.getProperty("chromeoptions.args") == null)) {
        systemProperty "chromeoptions.args", '--remote-allow-origins=*'
    }
    //To override asset types coming from jenkins job or parameters
    systemProperty "assetTypes", System.getProperty("assetTypes")
    // overrides the failfast behavior
    if (System.getProperty("overrideFailFast") == "false") {
        failFast = false
    } else {
        failFast = true
    }

    //deciding required spring profiles to apply
    ArrayList<String> profiles = new ArrayList<>()
    final String team = project.getProperties().get("team") as String
    final String env = project.getProperties().get("env") as String
    final String envType = project.getProperties().get("envType") as String
    final String podName = project.getProperties().get("podName") as String
    if (team != null && !team.isEmpty() && env != null) {
        profiles.add(team + "_" + env)
    }

    if (team != null && !team.isEmpty()) {
        profiles.add(team)
    }

    if (env != null && !env.isEmpty()) {
        profiles.add(env)
    }

    if (envType != null && !envType.isEmpty()) {
        profiles.add(envType)
    }

    if (podName != null && !podName.isEmpty()) {
        profiles.add(podName)
    }

    systemProperty("spring.profiles.active", profiles.stream().collect(Collectors.joining(",")))

    System.properties.each { k, v ->
        if (k.startsWith(project.testParamPrefix)) {
            if (k.contains('_')) {
                throw new InvalidUserDataException("Parameter ${k} contains underscore(_) which is not permitted")
            }
            systemProperty k - testParamPrefix, v
        }
    }
    reports.html.destination(file("$buildDir/gradle-report"))
    testLogging.showStandardStreams = true
}

serenity {
    reports = ["single-page-html"]

    // Specify the root package of any JUnit acceptance tests
    testRoot="com.informatica.mdm"

    // Specify the root directory of any Cucumber feature files
    requirementsDir = "${project.projectDir}/src/test/resources/features"
}

test.finalizedBy(aggregate, reports)

task wrapper(type: Wrapper) {
    gradleVersion = '8.2.1'
}

testlogger {
    theme 'standard'
    showExceptions true
    showStackTraces true
    showFullStackTraces true
    showCauses true
    slowThreshold 2000
    showSummary true
    showSimpleNames false
    showPassed true
    showSkipped true
    showFailed true
    showStandardStreams true
    showPassedStandardStreams true
    showSkippedStandardStreams true
    showFailedStandardStreams true
    logLevel 'debug'
}

dependencies {
    project.logger.info('implementing common dependencies')
    implementation project(":common")
    implementation group: 'org.springframework.retry', name: 'spring-retry', version: '1.3.1'
}

}

//project specific configuration subprojects { def configFileName = project.getProperties().get("configFile") != null ? project.getProperties().get("configFile") : 'null' ext.readConfigFile = { inputFile -> def theInfoName = inputFile File theInfoFile = new File(theInfoName) if (theInfoFile.exists()) { def drives = [[:]] theInfoFile.splitEachLine(/\s:\s/) { items -> if (items.size() == 1 && drives[-1] != [:]) drives << [:] else { def (key, value) = items drives[-1][key] = value } } return drives.get(0) } }

project(":mdmtest") {
    processTestResources {
        ArrayList<String> userList = ["adminUser", "adminPassword", "stewardUser", "stewardPassword", "designerUser",
                                      "designerPassword", "rdmUser", "rdmPassword", "analystUser", "analystPassword",
                                      "managerUser", "managerPassword", "stewardUser2", "stewardUser2Password", "podName",
                                      "sdlcDesignerUserSource", "sdlcDesignerUserSourcePassword", "sdlcDesignerUserTarget",
                                      "sdlcDesignerUserTargetPassword", "agentHost", "agentUserName", "agentPassword", "mrelPodName",
                                      "relPodName", "prodStagingPodName", "mlPodName", "upgradePodName", "usPod1Name", "usPod2Name",
                                      "usPod3Name", "usPod4Name", "usPod5Name", "usPod6Name", "emeaPodName", "apsePodName", "nac1PodName",
                                      "emailLicenseKey", "phoneLicenseKey", "avBatchLicensePath", "avRealTimeAccount", "avRealTimeToken",
                                      "secureAgentUser", "secureAgentPassword", "solutionName", "ingressFileConfigPath"]
        LinkedHashMap<String, String> properties = readConfigFile(configFileName) != null ? readConfigFile(configFileName) : new LinkedHashMap<String, String>()
        for (String s : userList) {
            if (project.getProperties().get(s) == null) {
                if (!properties.containsKey(s)) {
                    properties.put(s, "null")
                }
            } else {
                properties.put(s, project.getProperties().get(s))
            }
        }
        inputs.properties properties
        filteringCharset 'UTF-8'
        filesMatching(["**/application.yml"]) {
            expand properties
        }
    }
}

project(":common") {
    processResources {
        ArrayList<String> userList = ["podHost", "caiHost", "iicsHost", "mdmPublicHost", "mdmInternalHost",
                                      "mdmConsulHost", "s3AccessKey", "s3SecretKey", "useMongoUri", "mongoUser",
                                      "mongoPassword", "mongoUrl", "mongoUri"]
        LinkedHashMap<String, String> properties = readConfigFile(configFileName) != null ? readConfigFile(configFileName) : new LinkedHashMap<String, String>()
        for (String s : userList) {
            if (project.getProperties().get(s) == null) {
                if (!properties.containsKey(s)) {
                    properties.put(s, "null")
                }
            } else {
                properties.put(s, project.getProperties().get(s))
            }
        }
        inputs.properties properties
        filteringCharset 'UTF-8'
        filesMatching(["application.yml"]) {
            expand properties
        }
    }
}

}`

Runner file :

@RunWith(CucumberWithSerenity.class) @CucumberOptions( features = "src/test/resources/features", glue = {"com/informatica/mdm/step"}, //dryRun = true, to make sure for every steps we have implementation method in step class, for actual execution dryRun value will be false. dryRun = false, //to print the output in readable format monochrome = true ) public class Runner { }

Task :mdmtest:reports Caching disabled for task ':mdmtest:reports' because: Build cache is disabled Task ':mdmtest:reports' is not up-to-date because: Task has not declared any outputs despite executing actions. Generating Additional Serenity Reports for mdmtest to directory /home/gradle/mdmtest/target/site/serenity No report found on classpath with name single-page-html Resolve mutations for :mdmtest:aggregate (Thread[Execution worker Thread 7,5,main]) started. :mdmtest:aggregate (Thread[included builds,5,main]) started.

Task :mdmtest:aggregate Caching disabled for task ':mdmtest:aggregate' because: Build cache is disabled Task ':mdmtest:aggregate' is not up-to-date because: Task has not declared any outputs despite executing actions. Generating Serenity Reports

  • Test Root: com.informatica.mdm
  • Main report: file:///home/gradle/mdmtest/target/site/serenity/index.html
  • Test Root: com.informatica.mdm
  • Requirements base directory: null GENERATING REPORTS USING 16 THREADS GENERATING SUMMARY REPORTS... GENERATING REQUIREMENTS REPORTS... GENERATING RESULT REPORTS... GENERATING ERROR REPORTS... Test results for 2 tests generated in 46 mins and 45.9 secs in directory: file:/home/gradle/mdmtest/target/site/serenity/
wakaleo commented 1 year ago

Duplicate of ##3229