t.me/atinfo_chat Telegram группа по автоматизации тестирования

gradle последовательно запускать тестовые классы

Теги: #<Tag:0x00007f7488f71e90> #<Tag:0x00007f7488f71dc8> #<Tag:0x00007f7488f71cb0> #<Tag:0x00007f7488f71be8>

Всем привет! У меня есть тестовые классы и нужно, чтобы один тестовый класс запускался после выполнения предыдущего.

Нашёл, что есть doFirst и doLast, но как при помощи них управлять тестовыми классами не нашёл. Перепробовал много способов, но ни один не заработал, как мне нужно.

Моя структура тестовых классов %D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA

Мой файл build.gradle

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath "io.qameta.allure:allure-gradle:2.8.1"
        classpath "org.junit.platform:junit-platform-gradle-plugin:1.2.0"
    }
}

plugins {
    id 'java'
    id 'idea'
}

group 'chat.ros.testing2'
version '1.0'

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

sourceCompatibility = 1.8

repositories {
    mavenCentral()
    mavenLocal()
}

apply plugin: 'io.qameta.allure'
apply plugin: 'java'
apply plugin: 'maven'

jar {
    baseName = 'roschat-ms'
    version = '1.0'
    exclude ("chat/ros/testing2/server/MonitoringPage.class")
    exclude ("chat/ros/testing2/data/SettingsData.class")
    exclude ("chat/ros/testing2/server/settings/**")
    enabled = true
}

dependencies {
    // https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api
    testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.6.0'
    // https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine
    testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.6.0'
    // https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-params
    testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-params', version: '5.6.0'
    // https://mvnrepository.com/artifact/org.junit/junit5-engine
    compile group: 'org.junit', name: 'junit5-engine', version: '5.0.0-ALPHA'
    // https://mvnrepository.com/artifact/org.junit.platform/junit-platform-runner
    testCompile group: 'org.junit.platform', name: 'junit-platform-runner', version: '1.6.1'

    //dependencies for selenium
    // https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java
    compile group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '3.141.59'
    // https://mvnrepository.com/artifact/com.codeborne/selenide
    compile group: 'com.codeborne', name: 'selenide', version: '5.4.1'
    // https://mvnrepository.com/artifact/ru.stqa.selenium/webdriver-factory
    compile group: 'ru.stqa.selenium', name: 'webdriver-factory', version: '4.3'

    //dependencies for reporting
    // https://mvnrepository.com/artifact/io.qameta.allure/allure-junit5
    testCompile group: 'io.qameta.allure', name: 'allure-junit5', version: '2.13.1'
    // https://mvnrepository.com/artifact/io.qameta.allure/allure-junit-platform
    compile group: 'io.qameta.allure', name: 'allure-junit-platform', version: '2.13.1'
    // https://mvnrepository.com/artifact/io.qameta.allure/allure-selenide
    compile group: 'io.qameta.allure', name: 'allure-selenide', version: '2.13.1'
    // https://mvnrepository.com/artifact/ru.yandex.qatools.ashot/ashot
    compile group: 'ru.yandex.qatools.ashot', name: 'ashot', version: '1.5.4'
    // https://mvnrepository.com/artifact/org.slf4j/slf4j-api
    compile group: 'org.slf4j', name: 'slf4j-api', version: '2.0.0-alpha1'
    // https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12
    testCompile group: 'org.slf4j', name: 'slf4j-log4j12', version: '2.0.0-alpha1'

    //Dependencies for connect ssh
    // https://mvnrepository.com/artifact/com.jcraft/jsch
    compile group: 'com.jcraft', name: 'jsch', version: '0.1.55'
}

allure {
    version = '2.8.1'
    autoconfigure = true
    aspectjweaver = true

    downloadLink = 'https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/2.8.1/allure-commandline-2.8.1.zip'

    useJUnit5 {
        version = '2.13.1'
    }
}

test {

    useJUnitPlatform()

    dependsOn 'cleanTest'

    // Show test results.
    testLogging {
        events "passed", "skipped", "failed"
    }

}

может лучше писать независимые тесты, и не выдумывать велосипед?

4 Симпатий

Да я уже подумал, что так будет проще и быстрее)

а если нельзя писать независимые тесты? ну вот надо запустить цепочку из сценариев, чтобы проверить работоспособность сложного бизнес-процесса?

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

Можете привести пример?

ну а как вы свои тесты запускаете? я в пайплайне пишу критерии отбора по тегу

соответственно никто не мешает мне вызватт сначала один тест, потом другой, и далее по очереди скриптом

так почему тести нельзя сделать независимыми?
нельзя засетапить тестовые данние, или просто нет времени написать нормально?

1 Симпатия

потому что я пишу интеграционные тесты
в одном тесте я создаю сущность, которая будет дальше использоваться

я могу зафейкать создание сущности, но на бою может отвалиться интеграция, а мы об этом не узнаем

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

Я нашёл, что в gradle можно только включать или исключать тесты. Как их запускать по тегам пока не разбирался) Можно конечно средства JUnit Nested и не мучаться, но правильно ли так я не знаю.

я на c# тесты пишу, стек SpecFlow + nunit
у нюнита есть консольный раннер, которому говоришь где тесты лежат и какие из них запускать, собственно этого достаточно чтобы как угодно менеджить запуск тестов

я не знаю специфики приложения, но что мешает перед каждым тестом создать сущность заново, а не тянуть ее по всем тестам?

я не говорил что это просто, имхо это сложнее чем писать зависимые)

конечно, мне же их потом сапортить, а не заказчику)

прикол в том, что я сущность создаю тестом. проверяя по пути кейс создания сущности

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

но проверяете вы по итогу бизнес-процесс целиком, а не что-то абстрактное в вакууме

Думаю, эта ссылка может помочь. Я бы сделал несколько тасок в градле, каждая инклудит свой тег, и чтобы каждая из тасок была зависима от предыдущей (тоесть начинась только когда предыдущая заканчивалась).
Еще можно сделать так (при условии, что тестовые классы запускаются по алфавитному порядку) - дать такие имена классам, чтобы начинались с букв. Я так делаю у себя (использую C#+NUnit+SpecFlow). Каждый сценарий начинается с буквы (A_scenario_name). И у меня тесты идут в нужном порядке).

в gradle можно создавать кастомные методы(в каждом просто укажите сьюты для запуска, через filter или даже по отдельности), организовать зависимости можно например с помощью dependsOn

task0.dependsOn task2, task3

Перешёл с Junit на Testng и вопрос отпал сам собой. Всё таки для последовательного запуска Junit не очень подходит, либо у меня недостаточно знаний использования данного framework’а.