Как создать задачу Gradle для запуска только определенных тестов в Spring

У меня есть проект Spring, в котором я написал несколько модульных и интеграционных тестов. Теперь я хочу создать пользовательские задачи для запуска всех модульных тестов, всех интеграционных тестов и одну задачу для запуска обоих. Но как я могу это сделать?


person softwareUser    schedule 24.11.2019    source источник
comment
Отвечает ли это на ваш вопрос? Как запустить только один тестовый класс в gradle   -  person Martin Zeitler    schedule 24.11.2019
comment
В качестве альтернативы вы можете использовать аннотацию @Suite, чтобы сгруппировать их по желанию.   -  person Martin Zeitler    schedule 24.11.2019


Ответы (1)


Я бы предложил выделить интеграционные тесты в отдельный набор исходников. По умолчанию у вас уже есть 2 исходных набора, один для производственного кода и один для тестов. Чтобы создать новый исходный набор (создайте новый каталог в src/integrationTest/java) и добавьте следующую конфигурацию с помощью Junit5:

test {
  useJUnitPlatform()
}

sourceSets {
  integrationTest {
    java.srcDir file("src/integrationTest/java")
    resources.srcDir file("src/integrationTest/resources")
    compileClasspath += sourceSets.main.output + configurations.testRuntime
    runtimeClasspath += output + compileClasspath
  }
}

Для отдельной задачи:

task integrationTest(type: Test) {
  description = 'Runs the integration tests.'
  group = 'verification'
  testClassesDirs = sourceSets.integrationTest.output.classesDirs
  classpath = sourceSets.integrationTest.runtimeClasspath

  useJUnitPlatform()

  reports {
    html.enabled true
    junitXml.enabled = true
  }
}

Теперь у вас есть 3 задачи:

  1. gradlew test
  2. gradlew integrationTest
  3. gradlew check - запускает оба, так как это зависит от тестовой задачи, которая расширяет оба

Если вы также используете jacoco и хотите объединить результаты теста, у вас могут быть следующие задачи:

task coverageMerge(type: JacocoMerge) {
  destinationFile file("${rootProject.buildDir}/jacoco/test.exec")
  executionData fileTree(project.rootDir.absolutePath).include("**/build/jacoco/*.exec")
}

// aggregate all coverage data at root level
if (tasks.findByName("test")) {
  tasks.findByName("test").finalizedBy coverageMerge
}

if (tasks.findByName("integrationTest")) {
  tasks.findByName("integrationTest").finalizedBy coverageMerge
}

task codeCoverageReport(type: JacocoReport) {
  executionData fileTree(project.rootDir.absolutePath).include("**/build/jacoco/*.exec")
  subprojects.each {
    if (!it.name.contains('generated')) {
      sourceSets it.sourceSets.main
    }
  }
  reports {
    xml.enabled true
    html.enabled true
    html.setDestination(new File("${buildDir}/reports/jacoco"))
    csv.enabled false
  }
}

Чтобы запустить отчет о покрытии, просто выполните

gradlew codeCoverageReport
person Vaelyr    schedule 24.11.2019