Zie ook:
Contract testing met Pactflow (deel 1/3) : Contract test process
Contract testing met Pactflow (deel 2/3) : Consumer test
Contract testing met Pactflow (deel 3/3) : Provider test
In deze blog laat ik een voorbeeld zien hoe je als provider microservice een contract test kunt maken. Hierbij ga ik er vanuit dat je Jenkins gebruikt en een account hebt bij pactflow die je gebruikt als pact-broker. De code is in Kotlin.
Voeg onderstaande dependency toe aan de pom.xml
<dependency>
<groupId>au.com.dius.pact.provider</groupId>
<artifactId>junit5</artifactId>
<version>4.1.7</version>
<scope>test</scope>
</dependency>
Voeg onderstaande variabele toe in de environment stap in de Jenkinsfile:
PACTFLOW_TOKEN = credentials('jenkins-pactflowtoken')
(Hierbij is het nodig dat er een ‘jenkins-pactflowtoken’ secret in Jenkins is aangemaakt met daarin het token dat je van pactflow gekregen hebt)
Verander de “compile & test” stap in onderstaande code:
stage('Compile & Test') {
steps {
sh '''
unset JAVA_TOOL_OPTIONS
GIT_COMMIT=$(git rev-parse HEAD)
PUBLISH_PACT_RESULT=false
TEST_PENDING_CONTRACTS=false
# Only the master branch must publish the pact results, and test all pending contracts
if [[ $BRANCH_NAME == "master" ]]; then
PUBLISH_PACT_RESULT=true
TEST_PENDING_CONTRACTS=true
fi
./mvnw install -Dpact.provider.version=$GIT_COMMIT -Dpact.verifier.publishResults=$PUBLISH_PACT_RESULT -Dpact.provider.tag=$BRANCH_NAME -Dpactbroker.enablePending=$TEST_PENDING_CONTRACTS
'''
}
}
Voorbeeld unit test voor de verificatie van de contracts:
import Customer
import CustomerDatabase
import Rest
import au.com.dius.pact.provider.junit5.HttpTestTarget
import au.com.dius.pact.provider.junit5.PactVerificationContext
import au.com.dius.pact.provider.junit5.PactVerificationInvocationContextProvider
import au.com.dius.pact.provider.junitsupport.IgnoreNoPactsToVerify
import au.com.dius.pact.provider.junitsupport.Provider
import au.com.dius.pact.provider.junitsupport.State
import au.com.dius.pact.provider.junitsupport.loader.PactBroker
import au.com.dius.pact.provider.junitsupport.loader.PactBrokerAuth
import au.com.dius.pact.provider.junitsupport.loader.VersionSelector
import io.mockk.every
import io.mockk.mockk
import org.junit.jupiter.api.*
import org.junit.jupiter.api.extension.ExtendWith
@Provider("sample-service-2")
@IgnoreNoPactsToVerify
@PactBroker(
host = "xxx.pactflow.io",
scheme = "https",
port = "443",
authentication = PactBrokerAuth(token = "\${PACTFLOW_TOKEN}"),
consumerVersionSelectors = [
VersionSelector(tag = "master"),
VersionSelector(tag = "\${BRANCH_NAME:DIGI-201}") // change this to the current branch if you want to test that contract
],
enablePendingPacts = "\${pactbroker.enablePending:false}",
providerTags = ["\${BRANCH_NAME:master}"],
includeWipPactsSince = "2020-01-01"
)
class ContractVerificationTest {
private val customerDatabase = mockk<CustomerDatabase>()
private val restModule = Rest(9099, customerDatabase)
@TestTemplate
@ExtendWith(PactVerificationInvocationContextProvider::class)
internal fun pactVerificationTestTemplate(context: PactVerificationContext?) {
context?.verifyInteraction()
}
@BeforeEach
internal fun before(context: PactVerificationContext?) {
context?.target = HttpTestTarget("localhost", 9099, "/")
restModule.start()
}
@AfterEach
internal fun after(){
restModule.stop()
}
@State("default")
internal fun default(params: Map<String, Boolean>) {
val customerExists = (params.getOrDefault("customerExists", true))
val error = (params.getOrDefault("failure", false))
when {
error == true -> {
every { customerDatabase.findCustomer(any()) } throws RuntimeException("Database is down")
}
customerExists == false -> {
every { customerDatabase.findCustomer(any()) } returns null
}
customerExists == true -> {
every { customerDatabase.findCustomer(any()) } returns Customer()
}
}
}
}
Webhook:
Je kunt in pactflow een webhook aanmaken om er voor te zorgen dat een jenkins build automatisch gaat lopen als er een nieuw contract voor deze provider op gitflow geupload wordt. Pactflow zal de build alleen triggeren als het contract daadwerkelijk veranderd is t.o.v vorige versies.
[…] Zie ook:Contract testing met Pactflow (deel 1/3) : Contract test processContract testing met Pactflow (deel 2/3) : Consumer testContract testing met Pactflow (deel 3/3) : Provider test […]
LikeLike
[…] Zie ook:Contract testing met Pactflow (deel 1/3) : Contract test processContract testing met Pactflow (deel 2/3) : Consumer testContract testing met Pactflow (deel 3/3) : Provider test […]
LikeLike