From 17746d9b1efe590b41e808060cd67bbc87e8a326 Mon Sep 17 00:00:00 2001 From: Fabrice Lecomte Date: Wed, 14 Aug 2019 22:41:46 +0200 Subject: [PATCH] improve speed of cucumber tests --- src/test/kotlin/RunCucumberTest.kt | 64 +++++++++++++++++++----------- src/test/kotlin/feature/Request.kt | 26 +++++------- 2 files changed, 50 insertions(+), 40 deletions(-) diff --git a/src/test/kotlin/RunCucumberTest.kt b/src/test/kotlin/RunCucumberTest.kt index f173687..8568bf8 100644 --- a/src/test/kotlin/RunCucumberTest.kt +++ b/src/test/kotlin/RunCucumberTest.kt @@ -4,6 +4,7 @@ import cucumber.api.java8.En import cucumber.api.junit.Cucumber import feature.Context import fr.dcproject.config +import fr.dcproject.module import fr.dcproject.utils.LoggerDelegate import fr.postgresjson.connexion.Connection import fr.postgresjson.connexion.Requester @@ -11,10 +12,11 @@ import fr.postgresjson.migration.Migrations import io.ktor.locations.KtorExperimentalLocationsAPI import io.ktor.server.testing.TestApplicationEngine import io.ktor.server.testing.createTestEnvironment +import io.ktor.server.testing.withTestApplication import io.ktor.util.KtorExperimentalAPI import org.junit.runner.RunWith import org.koin.test.KoinTest -import org.koin.test.inject +import org.koin.test.get import org.slf4j.Logger import java.util.concurrent.TimeUnit import feature.Context.Companion.current as contextCurrent @@ -26,28 +28,27 @@ var unitialized: Boolean = false @RunWith(Cucumber::class) @CucumberOptions(plugin = ["pretty"]) class RunCucumberTest: En, KoinTest { - private val migrations: Migrations by inject() - private val connection = Connection("test", "test", "test") private val logger: Logger? by LoggerDelegate() init { + Before(-2) { _: Scenario -> + if (!unitialized) { + config.database = "test" + config.username = "test" + config.password = "test" + + withTestApplication({ module() }) { + migrations() + fixtures() + } + unitialized = true + } + } + Before(-1) { scenario: Scenario -> config.database = "test" config.username = "test" config.password = "test" contextCurrent = Context(TestApplicationEngine(createTestEnvironment()) {}, scenario) - - beforeAll() - - logger?.info("Fixtures Begin") - //language=PostgreSQL - connection.sendQuery("""truncate table "user" cascade;""") - //language=PostgreSQL - connection.sendQuery("""SET fixture.quantity.multiple = '50';""") - getFixturesRequester() - .getQueries() - .sortedBy { it.name } - .forEach { it.sendQuery() } - logger?.info("Fixtures Done") } After { _: Scenario -> @@ -55,18 +56,33 @@ class RunCucumberTest: En, KoinTest { } } - private fun beforeAll() - { - if (!unitialized) { - migrations.forceAllDown() - migrations.run() - unitialized = true - } + private fun migrations() { + config.database = "test" + config.username = "test" + config.password = "test" + val migrations: Migrations = get() + migrations.forceAllDown() + migrations.run() + } + + private fun fixtures() { + logger?.info("Fixtures Begin") + + val connection: Connection = get() + //language=PostgreSQL + connection.sendQuery("""truncate table "user" cascade;""") + //language=PostgreSQL + connection.sendQuery("""SET fixture.quantity.multiple = '50';""") + getFixturesRequester() + .getQueries() + .sortedBy { it.name } + .forEach { it.sendQuery() } + logger?.info("Fixtures Done") } private fun getFixturesRequester(): Requester { return Requester.RequesterFactory( - connection = connection, + connection = get(), queriesDirectory = config.sqlFiles.resolve("fixtures") ).createRequester() } diff --git a/src/test/kotlin/feature/Request.kt b/src/test/kotlin/feature/Request.kt index 317ff6f..9a13725 100644 --- a/src/test/kotlin/feature/Request.kt +++ b/src/test/kotlin/feature/Request.kt @@ -20,6 +20,7 @@ import org.koin.test.KoinTest import org.koin.test.inject import org.opentest4j.AssertionFailedError import java.util.* +import kotlin.random.Random import kotlin.test.asserter import feature.Context.Companion.current as currentContext @@ -27,27 +28,20 @@ class Request: En, KoinTest { private val migrations: Migrations by inject() private val requester: Requester by inject() init { -// Before { scenario: Scenario -> -// migrations.run() -// } -// -// After { scenario: Scenario -> -// migrations.forceAllDown() -// } - When("I have citizen:") { body: DataTable -> - val user = User(username = "jaque", plainPassword = "azerty") - val data = body.asMap(String::class.java, String::class.java) - val citizen = Citizen( - id = UUID.fromString(data["id"]), - name = Citizen.Name(data["firstName"], data["lastName"]), - birthday = DateTime.now(), - user = user - ) + val user = User(username = "jaque_${Random.nextInt(0, 10000)}", plainPassword = "azerty") val test: TestApplicationEngine.() -> Unit = { requester .getFunction("insert_user") .selectOne(user) + + val data = body.asMap(String::class.java, String::class.java) + val citizen = Citizen( + id = UUID.fromString(data["id"]), + name = Citizen.Name(data["firstName"], data["lastName"]), + birthday = DateTime.now(), + user = user + ) requester .getFunction("upsert_citizen") .selectOne(citizen)