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,19 +28,47 @@ 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() After { _: Scenario ->
contextCurrent.engine.stop(0L, 0L, TimeUnit.MILLISECONDS)
}
}
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") logger?.info("Fixtures Begin")
val connection: Connection = get()
//language=PostgreSQL //language=PostgreSQL
connection.sendQuery("""truncate table "user" cascade;""") connection.sendQuery("""truncate table "user" cascade;""")
//language=PostgreSQL //language=PostgreSQL
@@ -50,23 +80,9 @@ class RunCucumberTest: En, KoinTest {
logger?.info("Fixtures Done") logger?.info("Fixtures Done")
} }
After { _: Scenario ->
contextCurrent.engine.stop(0L, 0L, TimeUnit.MILLISECONDS)
}
}
private fun beforeAll()
{
if (!unitialized) {
migrations.forceAllDown()
migrations.run()
unitialized = true
}
}
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,16 +28,13 @@ 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 test: TestApplicationEngine.() -> Unit = {
requester
.getFunction("insert_user")
.selectOne(user)
val data = body.asMap<String, String>(String::class.java, String::class.java) val data = body.asMap<String, String>(String::class.java, String::class.java)
val citizen = Citizen( val citizen = Citizen(
id = UUID.fromString(data["id"]), id = UUID.fromString(data["id"]),
@@ -44,10 +42,6 @@ class Request: En, KoinTest {
birthday = DateTime.now(), birthday = DateTime.now(),
user = user user = user
) )
val test: TestApplicationEngine.() -> Unit = {
requester
.getFunction("insert_user")
.selectOne(user)
requester requester
.getFunction("upsert_citizen") .getFunction("upsert_citizen")
.selectOne(citizen) .selectOne(citizen)