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 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,19 +28,47 @@ 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()
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")
val connection: Connection = get()
//language=PostgreSQL
connection.sendQuery("""truncate table "user" cascade;""")
//language=PostgreSQL
@@ -50,23 +80,9 @@ class RunCucumberTest: En, KoinTest {
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 {
return Requester.RequesterFactory(
connection = connection,
connection = get(),
queriesDirectory = config.sqlFiles.resolve("fixtures")
).createRequester()
}

View File

@@ -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,16 +28,13 @@ 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 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 citizen = Citizen(
id = UUID.fromString(data["id"]),
@@ -44,10 +42,6 @@ class Request: En, KoinTest {
birthday = DateTime.now(),
user = user
)
val test: TestApplicationEngine.() -> Unit = {
requester
.getFunction("insert_user")
.selectOne(user)
requester
.getFunction("upsert_citizen")
.selectOne(citizen)