iT邦幫忙

2023 iThome 鐵人賽

DAY 15
0
Kotlin

Kotlin魔法:Spring Boot 3的fp奇幻冒險系列 第 15

[小城鎮] kotlin 單元測試到底要怎麼寫?

  • 分享至 

  • xImage
  •  

前情提要

昨天我們介紹了測試金字塔,加上吃了月餅!,今天我們要從最底部的Unit test寫起,透過撰寫Unit test,來確保我們的程式有符合運作條件。

套件

可以把這些加到我們的Pom檔

<dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-test-junit5</artifactId>
            <version>1.9.10</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.10.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.10.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-commons</artifactId>
            <version>1.10.0</version>
        </dependency>

TestCase

每一個Test Case盡量只測到一種情境,這樣才不會發生寫太多function在裡面,結果不知道到底是哪一個function導致測試掛掉了QQ

目標

今天我們要先以測試這個function當作目標

    fun customerVOToCustomer(customerVO: CustomerVO) =
        when {
            customerVO.contactInfo.contains("@") -> Customer(
                Name(customerVO.name),
                Email(customerVO.contactInfo),
                Age(customerVO.age),
            )

            else -> Customer(Name(customerVO.name), Phone(customerVO.contactInfo), Age(customerVO.age))
        }

Test code

撰寫測試時我們可以根據3A原則來進行!第一個想到的是不是3A大作呢(誤

    @Test
    fun testCustomerVoToCustomer() {
        val customerVO = CustomerVO(
            name = "John",
            contactInfo = "hello@xx.com",
            age = 18,
        )

        val result = customerVOToCustomer(customerVO)

        val expected = Customer(
            name = Name("John"),
            contactInfo = Email("hello@xx.com"),
            age = Age(18),
        )

        Assertions.assertEquals(expected, result)
    }

Arrange

準備階段,這邊要將我們的測試code所需要的東西建立好,比如說,我們要建立一個蘋果物件,這樣才能在Act階段吃它。

這邊我們將customerVO建立好,讓等等的Act階段可以使用。

        val customerVO = CustomerVO(
            name = "John",
            contactInfo = "hello@xx.com",
            age = 18,
        )

Act

執行階段,這邊要實際執行我們的商業邏輯,比如說"吃蘋果"

這邊我們就真正call我們想測試的function了,就是我們的商業邏輯啦XD
執行完後,就有一定的結果,接下來就會到最重要的地方,Assert

        val result = customerVOToCustomer(customerVO)

Assert

驗證階段,這邊要驗證我們code的結果,比如說,吃一口蘋果,蘋果應該不是完好無缺的,是被咬一口的!

這邊我們將customerVOToCustomer的結果,跟我們預期的結果比對,如果一樣,恭喜,我們成功啦XD
如果不一樣也別氣餒,至少我們知道程式有可能寫錯啦XD

Assertions.assertEquals(expected, result)

結論

因為測試是由我們撰寫,因此我們可以知道結果是什麼,就跟我們預期咬一口蘋果,它就不會是完整的,透過不斷的完善測試,我們的程式就可以達到很高的信心水平,不會有錯誤了!

但是,但是,但是!很重要,所以說三遍XD

測試code也是我們寫的,難道測試的code不會錯嗎?

我們要怎麼知道測試的code是寫正確的? 程式是我們寫的,測試也是我們寫的,不會有裁判跟球員都是自己人的問題嗎!?

如果一開始預期的結果本來就是錯的,那我們程式不就被導去錯誤的地方了嗎?

這問題,可以想一下,明天我們來繼續討論測試XD


上一篇
[小城鎮] 笨蛋,測試,召喚獸 - 自動化測試是甚麼?
下一篇
[小城鎮] 測試 大補帖
系列文
Kotlin魔法:Spring Boot 3的fp奇幻冒險30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言