improve speed of cucumber tests

This commit is contained in:
2019-08-14 22:41:46 +02:00
parent 7dffc005b9
commit 17746d9b1e
2 changed files with 50 additions and 40 deletions

View File

@@ -4,6 +4,7 @@ import cucumber.api.java8.En
import cucumber.api.junit.Cucumber import cucumber.api.junit.Cucumber
import feature.Context import feature.Context
import fr.dcproject.config import fr.dcproject.config
import fr.dcproject.module
import fr.dcproject.utils.LoggerDelegate import fr.dcproject.utils.LoggerDelegate
import fr.postgresjson.connexion.Connection import fr.postgresjson.connexion.Connection
import fr.postgresjson.connexion.Requester import fr.postgresjson.connexion.Requester
@@ -11,10 +12,11 @@ import fr.postgresjson.migration.Migrations
import io.ktor.locations.KtorExperimentalLocationsAPI import io.ktor.locations.KtorExperimentalLocationsAPI
import io.ktor.server.testing.TestApplicationEngine import io.ktor.server.testing.TestApplicationEngine
import io.ktor.server.testing.createTestEnvironment import io.ktor.server.testing.createTestEnvironment
import io.ktor.server.testing.withTestApplication
import io.ktor.util.KtorExperimentalAPI import io.ktor.util.KtorExperimentalAPI
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.koin.test.KoinTest import org.koin.test.KoinTest
import org.koin.test.inject import org.koin.test.get
import org.slf4j.Logger import org.slf4j.Logger
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
import feature.Context.Companion.current as contextCurrent import feature.Context.Companion.current as contextCurrent
@@ -26,28 +28,27 @@ var unitialized: Boolean = false
@RunWith(Cucumber::class) @RunWith(Cucumber::class)
@CucumberOptions(plugin = ["pretty"]) @CucumberOptions(plugin = ["pretty"])
class RunCucumberTest: En, KoinTest { class RunCucumberTest: En, KoinTest {
private val migrations: Migrations by inject()
private val connection = Connection("test", "test", "test")
private val logger: Logger? by LoggerDelegate() private val logger: Logger? by LoggerDelegate()
init { 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 -> Before(-1) { scenario: Scenario ->
config.database = "test" config.database = "test"
config.username = "test" config.username = "test"
config.password = "test" config.password = "test"
contextCurrent = Context(TestApplicationEngine(createTestEnvironment()) {}, scenario) 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 -> After { _: Scenario ->
@@ -55,18 +56,33 @@ class RunCucumberTest: En, KoinTest {
} }
} }
private fun beforeAll() private fun migrations() {
{ config.database = "test"
if (!unitialized) { config.username = "test"
migrations.forceAllDown() config.password = "test"
migrations.run() val migrations: Migrations = get()
unitialized = true 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 { private fun getFixturesRequester(): Requester {
return Requester.RequesterFactory( return Requester.RequesterFactory(
connection = connection, connection = get(),
queriesDirectory = config.sqlFiles.resolve("fixtures") queriesDirectory = config.sqlFiles.resolve("fixtures")
).createRequester() ).createRequester()
} }

View File

@@ -20,6 +20,7 @@ import org.koin.test.KoinTest
import org.koin.test.inject import org.koin.test.inject
import org.opentest4j.AssertionFailedError import org.opentest4j.AssertionFailedError
import java.util.* import java.util.*
import kotlin.random.Random
import kotlin.test.asserter import kotlin.test.asserter
import feature.Context.Companion.current as currentContext import feature.Context.Companion.current as currentContext
@@ -27,27 +28,20 @@ class Request: En, KoinTest {
private val migrations: Migrations by inject() private val migrations: Migrations by inject()
private val requester: Requester by inject() private val requester: Requester by inject()
init { init {
// Before { scenario: Scenario ->
// migrations.run()
// }
//
// After { scenario: Scenario ->
// migrations.forceAllDown()
// }
When("I have citizen:") { body: DataTable -> When("I have citizen:") { body: DataTable ->
val user = User(username = "jaque", plainPassword = "azerty") val user = User(username = "jaque_${Random.nextInt(0, 10000)}", plainPassword = "azerty")
val data = body.asMap<String, String>(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 test: TestApplicationEngine.() -> Unit = { val test: TestApplicationEngine.() -> Unit = {
requester requester
.getFunction("insert_user") .getFunction("insert_user")
.selectOne(user) .selectOne(user)
val data = body.asMap<String, String>(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 requester
.getFunction("upsert_citizen") .getFunction("upsert_citizen")
.selectOne(citizen) .selectOne(citizen)