昨天我們介紹了測試金字塔,加上吃了月餅!,今天我們要從最底部的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>
每一個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))
}
撰寫測試時我們可以根據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)
}
準備階段,這邊要將我們的測試code所需要的東西建立好,比如說,我們要建立一個蘋果物件,這樣才能在Act階段吃它。
這邊我們將customerVO建立好,讓等等的Act階段可以使用。
val customerVO = CustomerVO(
name = "John",
contactInfo = "hello@xx.com",
age = 18,
)
執行階段,這邊要實際執行我們的商業邏輯,比如說"吃蘋果"
這邊我們就真正call我們想測試的function了,就是我們的商業邏輯啦XD
執行完後,就有一定的結果,接下來就會到最重要的地方,Assert
val result = customerVOToCustomer(customerVO)
驗證階段,這邊要驗證我們code的結果,比如說,吃一口蘋果,蘋果應該不是完好無缺的,是被咬一口的!
這邊我們將customerVOToCustomer的結果,跟我們預期的結果比對,如果一樣,恭喜,我們成功啦XD
如果不一樣也別氣餒,至少我們知道程式有可能寫錯啦XD
Assertions.assertEquals(expected, result)
因為測試是由我們撰寫,因此我們可以知道結果是什麼,就跟我們預期咬一口蘋果,它就不會是完整的,透過不斷的完善測試,我們的程式就可以達到很高的信心水平,不會有錯誤了!
但是,但是,但是!很重要,所以說三遍XD
測試code也是我們寫的,難道測試的code不會錯嗎?
我們要怎麼知道測試的code是寫正確的? 程式是我們寫的,測試也是我們寫的,不會有裁判跟球員都是自己人的問題嗎!?
如果一開始預期的結果本來就是錯的,那我們程式不就被導去錯誤的地方了嗎?
這問題,可以想一下,明天我們來繼續討論測試XD