Используйте теги JUnit5 для Spek - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь разделить свои тесты на модульные и интеграционные тесты. Моя идея состояла в том, чтобы использовать новую аннотацию JUnit5 @Tag("unit"), которая хорошо работает для моих тестов JUnit, но я не могу заставить ее работать со Spek.

У меня сейчас есть мой класс:

data class MyObject(val value: Int)

Мои тесты:

@Tag("unit")
object MyObjectTest {

    @Test
    fun checkEquality() {
        val o1 = MyObject(1)
        assertEquals(o1, o1)
    }
}

С моим build.gradle, имеющим:

task utest(type: Test) {
    outputs.upToDateWhen { false }
    useJUnitPlatform {
        includeEngines 'junit-jupiter', 'junit-vintage', 'spek'
        includeTags 'unit'
        excludeTags 'performance', 'integration', 'functional'
    }


    testLogging {
        events "passed", "skipped", "failed"
    }
}

Когда я выполняю utest, это работает. Однако, когда вы делаете то же самое со Spek:

@Tag("unit")
object MyObjectSpek : Spek({

   given("an Object") {
       val o1 = MyObject(1)

       it("should be equal to itself") {
           assertEquals(o1, o1)
       }
   }
})

Что происходит, если я запускаю тестовую задачу, она выполняет только методы из MyObjectTest и не выполняет тесты для MyObjectSpek

Есть ли у вас какие-либо идеи о том, как интегрировать Spek с тегами JUnit5, или есть другая идея для разделения модульных и интеграционных тестов?

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Еще одна вещь, которую следует учитывать при использовании IntelliJ и при наличии проблем с зависимостями с новыми исходными наборами, добавьте это в свой build.gradle:

apply plugin: 'idea'
idea {
    module {
        testSourceDirs += project.sourceSets.unitTest.kotlin.srcDirs
        testSourceDirs += project.sourceSets.unitTest.resources.srcDirs
        testSourceDirs += project.sourceSets.integrationTest.kotlin.srcDirs
        testSourceDirs += project.sourceSets.integrationTest.resources.srcDirs
        testSourceDirs += project.sourceSets.functionalTest.kotlin.srcDirs
        testSourceDirs += project.sourceSets.functionalTest.resources.srcDirs
    }
}
0 голосов
/ 11 мая 2018

сегодня я столкнулся с точно такой же проблемой. Мне пришлось разделить тесты на 3 раздела: Unit, Service (тестирование REST API) и Integration (WebDriver).

Отказ от ответственности: это руководство применимо для любой среды тестирования, а не только для Spek. Gradle 4.6 или новее требуется для запуска этого.

Отдельный набор тестовых источников на исходные наборы

В моем примере они будут:

  • src/test - для юнит-тестов (у вас уже есть)
  • src/serviceTest - для служебных испытаний
  • src/integrationTest - для интеграционных испытаний

все эти наборы должны иметь стандартную структуру набора источников. Создайте эти папки внутри вашего проекта и переместите ваши пакеты в соответствующие исходные наборы.

Когда это будет сделано, добавьте к build.gradle перед dependency section следующие строки:

sourceSets {
    integrationTest {
        compileClasspath += main.output
        runtimeClasspath += main.output
    }
    serviceTest {
        compileClasspath += main.output
        runtimeClasspath += main.output
    }
}

configurations {
    integrationTestCompile.extendsFrom testCompile
    integrationTestRuntime.extendsFrom testRuntime

    serviceTestCompile.extendsFrom testCompile
    serviceTestRuntime.extendsFrom testRuntime
}

После того, как вы сделаете это, ваша IDE (я полагаю, вы используете Idea) должна переиндексировать build.gradle и распознать исходные наборы. У вас могут быть ошибки в ваших новых наборах источников, потому что они не видят друг друга источники. Это правильно, потому что эти исходные наборы предназначены для запуска независимо, и не должно быть проблемой.

Отдельный dependencies для соответствующих конфигураций (Необязательно)

По умолчанию serviceTest и integrationTest наследуют все test зависимости, но если вам нужно переместить что-то определенное для определенной конфигурации из общей области, вы можете сделать это здесь.

В моем случае WebDriver довольно тяжелый, и он мне не нужен нигде, кроме интеграционного тестирования.

dependencies {
    // available for all scopes
    testCompile "org.jetbrains.spek:spek-api:$spekVersion"
    testRuntime "org.jetbrains.spek:spek-junit-platform-engine:$spekVersion"
    testCompile "org.junit.platform:junit-platform-launcher:$junitPlatformVersion"

    // compiles only for integrationTest
    integrationTestCompile "org.seleniumhq.selenium:selenium-java:3.11.0"
    integrationTestCompile "org.seleniumhq.selenium.fluent:fluent-selenium:1.19"
}

Настройка порядка выполнения

Нам нужно будет добавить задание gradle типа Test и настроить его. У вас могут быть разные настройки для разных тестовых заданий.

task serviceTest(type: Test) {
    // Runs tests from src/serviceTest
    testClassesDirs = sourceSets.serviceTest.output.classesDirs
    classpath = sourceSets.serviceTest.runtimeClasspath
}
// Setup serviceTest task 
serviceTest {
    // Uncomment this if you need to skip tests from the set after first failure. Since Gradle 4.6
    //failFast = true

    // Enable some logging
    testLogging {
        events "PASSED", "FAILED", "SKIPPED"
    }

    // Enable JUnit5 tests
    useJUnitPlatform {
    }
}

Сделайте то же самое для интеграционного теста.

Наконец, настройте зависимости и порядок выполнения:

// Make service tests run during gradle check
check.dependsOn serviceTest
check.dependsOn integrationTest

// Make service tests run after unit tests
serviceTest.mustRunAfter test
// Make integration tests run after service tests
integrationTest.mustRunAfter serviceTest

Заключение

Вы получите:

  1. Цепочка из Unit -> Service -> Integration тестовых наборов, работающих в строгом порядке;
  2. Если вы получите сбой теста (независимо от опции failFast) в одном наборе тестов, остальные не запустятся и не будут тратить ресурсы;
  3. Возможность запуска с консоли каждого пакета отдельно при выполнении gradle <task>.

Дополнительные ресурсы:

...