KotlinTest is a flexible and comprehensive testing tool for Kotlin.
Full documentation
For latest updates see Changelog
- Forum
- Stack Overflow (don't forget to use the tag "kotlintest".)
- Contribute
Write simple and beautiful tests with the StringSpec style:
class MyTests : StringSpec({
"length should return size of string" {
"hello".length shouldBe 5
}
"startsWith should test for a prefix" {
"world" should startWith("wor")
}
})
You can choose the testing style that fits your needs.
Use over 100 provided matchers to test assertions on many different types:
"substring" should include("str")
user.email should beLowerCase()
myImmgeFile should haveExtension(".jpg")
cityMap should haveKey("London")
See the full list of matchers or write your own.
Use property based testing to test your code with automatically generated test data:
class PropertyExample: StringSpec() {
init {
"String size" {
assertAll { a: String, b: String ->
(a + b) should haveLength(a.length + b.length)
}
}
}
Handle even an enormous amount of input parameter combinations easily with table driven tests:
class StringSpecExample : StringSpec() {
init {
"should add" {
val myTable = table(
headers("a", "b", "result"),
row(1, 2, 3),
row(1, 1, 2)
)
forAll(myTable) { a, b, result ->
a + b shouldBe result
}
}
}
}
Testing for exceptions is easy with KotlinTest:
val exception = shouldThrow<IllegalAccessException> {
// code in here that you expect to throw an IllegalAccessException
}
exception.message should startWith("Something went wrong")
You can specify the number of threads, invocations, and a timeout for each test or for all tests. And you can group tests by tags or disable them conditionally.
All you need is config
:
class MySpec : StringSpec() {
override val defaultTestCaseConfig = TestCaseConfig(invocations = 3)
init {
"should use config" {
// ...
}.config(timeout = 2.seconds, invocations = 10, threads = 2, tags = setOf(Database, Linux))
}
}
This page gives you just a short overview over KotlinTest. There are some more useful things:
- Check whole collections with Inspectors.
- Write elegant conditions with the matcher DSL:
"hello" should haveSubstring("ell")
. - Reuse test logic, e. g. for setup or tear down, with Listeners.
- Let KotlinTest close resources automatically:
val reader = autoClose(StringReader("xyz"))
- Test asynchronous code with
whenReady
andeventually
. - Use the Spring extension to automatically inject your spring test classes.
See full documentation.
Gradle:
buildscript {
dependencies {
classpath "org.junit.platform:junit-platform-gradle-plugin:1.1.0"
}
}
// This allows gradle to execute _jUnit-platform-5_ based tests (which KotlinTest builds upon).
// Note: Gradle says that this is **not** required as of 4.6 but even with 4.6 it seems to be required.
apply plugin: 'org.junit.platform.gradle.plugin'
testCompile 'io.kotlintest:kotlintest-runner-junit5:3.0.0'
Maven:
<dependency>
<groupId>io.kotlintest</groupId>
<artifactId>kotlintest-runner-junit5</artifactId>
<version>3.0.3</version>
<scope>test</scope>
</dependency>