Kotest는 10가지의 다양한 스타일의 테스트 레이아웃을 제공합니다. 일부는 다른 인기 있는 테스트 프레임워크에서 영감을 받았습니다.
1. Fun spec
- inspired by scala test
- test라는 함수를 호출하여 테스트를 실행한다.
- 함수의 인자로 해당 테스트를 설명하는 문자열을 넘긴다.
- context 및 xtest를 사용하여 테스트를 비활성화할 수 있습니다.
class MyTests : FunSpec({
test("String length should return the length of the string") {
"sammy".length shouldBe 5
"".length shouldBe 0
}
context("this outer block is enabled") {
xtest("this test is disabled") {
// test here
}
}
xcontext("this block is disabled") {
test("disabled by inheritance from the parent") {
// test here
}
}
})
2. Describe Spec
- inspired By Ruby and Javascript framework
- Describe와 it 키워드로 테스트할 주체와 검증할 내용을 설명
- xdescribe 및 xit를 사용하여 테스트를 비활성화할 수 있습니다.
class MyTests : DescribeSpec({
describe("score") {
it("start as zero") {
// test here
}
describe("with a strike") {
it("adds ten") {
// test here
}
it("carries strike to the next frame") {
// test here
}
}
describe("for the opposite team") {
it("Should negate one score") {
// test here
}
}
}
})
3. Should spec
- kotest original
- fun spec과 유사한데 test 대신 should 키워드를 사용한다.
- context block으로 테스트를 중첩할 수 있다.
- xcontext 및 xshould 변형을 사용하여 테스트를 비활성화할 수 있습니다.
class MyTests : ShouldSpec({
context("String.length") {
should("return the length of the string") {
"sammy".length shouldBe 5
"".length shouldBe 0
}
}
context("this outer block is enabled") {
xshould("this test is disabled") {
// test here
}
}
xcontext("this block is disabled") {
should("disabled by inheritance from the parent") {
// test here
}
}
})
4. String spec
- kotest original
- 가장 미니멀한 스타일
- 테스트 코드를 사용하여 문자열과 람다 표현식을 작성하면 됩니다.
- String으로 테스트를 설명한 후 검증한다.
class MyTests : StringSpec({
"strings.length should return size of string" {
"hello".length shouldBe 5
}
"strings.length should return size of string".config(enabled = false, invocations = 3) {
"hello".length shouldBe 5
}
})
5. Behavior Spec
- inspired By BDD frameworks
- Given, When, Then 패턴의 특징의 테스트 스타일
- Give 및 When에서 And 키워드를 사용하여 깊이를 더할 수도 있습니다.
class MyTests : BehaviorSpec({
given("a broomstick") {
`when`("I sit on it") {
then("I should be able to fly") {
// test code
}
}
`when`("I throw it away") {
then("it should come back") {
// test code
}
}
}
})
class MyTests : BehaviorSpec({
xgiven("this is disabled") {
When("disabled by inheritance from the parent") {
then("disabled by inheritance from its grandparent") {
// disabled test
}
}
}
given("this is active") {
When("this is active too") {
xthen("this is disabled") {
// disabled test
}
}
}
})
6. Free Spec
- Inspired By ScalaTest
- 테스트 함수의 depth를 "-" 키워드로 자유롭게 조절할 수 있다.
- 마지막 깊이의 테스트에서는 "-"를 생략하고 테스트명만 쓴다.
class MyTests : FreeSpec({
"String.length" - {
"should return the length of the string" {
"sammy".length shouldBe 5
"".length shouldBe 0
}
}
"containers can be nested as deep as you want" - {
"and so we nest another container" - {
"yet another container" - {
"finally a real test" {
1 + 1 shouldBe 2
}
}
}
}
})
7. Word Spec
- Inspired By ScalaTEst
- When, Should 키워드를 사용하여 테스트의 설명을 작성한다.
- when은 Kotlin의 키워드이므로 백틱이나 대문자 변형을 사용해야 합니다.
class MyTests : WordSpec({
"String.length" should {
"return the length of the string" {
"sammy".length shouldBe 5
"".length shouldBe 0
}
}
})
8. Feature Spec
- Inspired By Cucumber
- cucumber를 사용했다면 친숙한 feature, scenario keyword를 사용하여 테스트를 설명한다.
- xfeature 및 xscenario을 사용하여 테스트를 비활성화할 수 있습니다.
class MyTests : FeatureSpec({
feature("the can of coke") {
scenario("should be fizzy when I shake it") {
// test here
}
scenario("and should be tasty") {
// test here
}
}
})
9. Expect Spec
- kotest Original
- Fun Spec, Should Spec과 비슷한데 expect 키워드를 사용한다.
- 테스트는 하나 이상의 컨텍스트 블록에 중첩될 수도 있습니다.
- xcontext 및 xexpect 변형을 사용하여 테스트를 비활성화할 수 있습니다.
class MyTests : ExpectSpec({
context("a calculator") {
expect("simple addition") {
// test here
}
expect("integer overflow") {
// test here
}
}
})
10. Annotation Spec
- Inspired By JUnit
- JUnit을 사용할 때와 같이 @Test어노테이션을 사용하여 테스트 클래스를 정의한다.
- JUnit에서 사용하는 다음의 어노테이션을 사용할 수 있다.
- @BeforeAll / @BeforeClass
- @BeforeEach / @Before
- @AfterAll / @AfterClass
- @AfterEach / @After
- @Ignore
class AnnotationSpecExample : AnnotationSpec() {
@BeforeEach
fun beforeTest() {
println("Before each test")
}
@Test
fun test1() {
1 shouldBe 1
}
@Test
fun test2() {
3 shouldBe 3
}
}
REFERENCE
- 공식 문서 : https://kotest.io/docs/framework/testing-styles.html
- 백엔드 실전 역량 강화를 위한 5개 도메인 프로젝트
'Kotlin' 카테고리의 다른 글
[kotlin] 코틀린 간단 정리 (0) | 2023.01.24 |
---|