寫出好測試 - 淺談 Kotlin 單元測試框架

活動訊息
寫出好測試 - 淺談 Kotlin 單元測試框架

不論您是從其他 JVM 語言轉換來寫 Koitlin、或是出於學習新語言的動機接觸 Kotlin、或是被推動著學習 Kotlin,透過這場分享,您將學會運用不同的測試框架寫出易讀、好維護的 Kotlin 單元測試。

活動日期:2020 年 10 月 27 日

活動時間:PM 08:30

主辦單位:

 
講者簡介
Carolyn
趨勢科技 後端工程師

Carolyn 平時工作以 Java 為主、Kotlin 為輔,接觸過設計、開發和測試等軟體開發領域已有五年的經驗。喜歡喝咖啡和旅行,吃異國料理,也愛看別人玩狼人殺。

身為工程師的我們或多或少都知道寫測試的好處與重要性,它可以保護你的商業邏輯,在開發新專案或重構的過程中,降低出錯率、提升程式碼品質。雖然 Kotlin 開發生態系裡也不乏測試工具與框架,但實際在專案導入測試時,或許是對撰寫 Kotlin 測試不熟悉、也可能是迷失在眾多測試框架中無所適從,造成導入測試的比例仍偏低。因此,本次技術講座邀請到 Carolyn 跟大家分享一下她的測試經驗及概覽 Kotlin 生態系裡幾個知名的單元測試框架,協助大家做技術決策。

主題分享

在分享的一開始,Carolyn 簡單地做了個調查,聽眾裡約只有一半的開發者有寫測試,而幾乎所有人在專案導入測試的時候都曾遇到困難,可能的原因包括原本的專案就沒有寫測試,或是雖然現有的專案有測試但看不懂而難以維護。從這個結果可以證實,導入測試是大家都知道該做的事,卻也是所有人都會遇到問題的事。

寫測試時遇到的痛點

因此 Carolyn 拿一個測試案例跟大家討論寫測試時常見的痛點,像是測試名稱命名不當,甚至加了許多註解後還是難以理解,也有可能是測試的範圍過大,在測試案例裡有龐大的 Assertion 語句。為了讓測試寫起來可以更輕鬆,在架構上可以更清楚好維護,這時可以使用測試工具或框架來輔助我們寫出好的測試。綜覽開發生態系裡的測試工具大至可分為兩種面向,其一是提供工具集(如 Mocking、Assertion、Matcher 等 Library)、其二是提供好的架構,幫助開發者以不同的測試風格撰寫測試、將測試群組化(Grouping)並統一語法撰寫風格。Carlolyn 幫大家整理出常見的 Kotlin 測試工具一覽表如下。

Kotlin 測試工具選項一覽表

但測試工具這麼多,該選哪個才適合呢?Carolyn 也以一個 PasswordValidator 為例,實際介紹三個在 Kotlin 生態系裡最常被提及的測試框架,包括前身是 kotlintest 的 Kotest,目前是第四版,可支援 Multiplatform,支援不同種類的 Testing 像是 Property-based、Data-Driven testing 等,官方也有出 IntelliJ IDEA 的外掛。第二個介紹的是由 JetBrains 團隊推出的 Spek,目前出到第二版,也支援 Multiplatform,是一個以 BDD 為核心的框架,使用 DSL 和 Gherkin 語法來寫測試,也有 IntelliJ IDEA 外掛方便開發。第三個則是 Java 開發者都不陌生的 JUnit,JUnit 在第五版後拆成很多 Module 來提供不同的功能,也解決了很多第四版的問題,IntelliJ IDEA 也是預設就支援其語法,讓開發者更好上手。Carolyn 也在最後整理了一個比較表如下,讓大家快速了解各框架的特色。

Kotlin 測試框架比較表

透過 Carolyn 脈絡性的介紹和整理,並針對同一個 Test Case 實際用三種測試框架寫給大家看,讓我們可以從架構、語法風格、程式碼撰寫量、易讀性等面向做比較,相信能讓大家對各測試框架有更進一步的認識。不過 Carolyn 也建議大家,在選擇測試框架時,應該要每一個都親自試過,從中找出一個適合專案開發情境,自己也喜歡的框架來用,才能讓自己寫出易懂好維護的測試。

問答

Q. 如果是 Java 跟 Kotlin 的混合專案,會建議使用哪個工具?

之前剛好有參與過一個從 Java 逐步轉移到 Kotlin 的混合專案,考量到同事們大多還是習慣 Java 的語法、加上專案已經有現存的 JUnit 測試,所以那時的決策是持續使用 JUnit 做測試工具,並將 JUnit 升級到第五版以取得更多新的功能。由於每個專案條件不同,採用的決策也會不同。若當時是全新的專案、沒有現存測試、團隊成員對 Kotlin 的熟悉度也夠的話,或許就會改採 Kotest 這種以 Kotlin 打造的測試框架。

P.S 因為 Kotlin 可以跟 Java 在同一個專案內混合使用,所以現存 Java 開發生態系裡的工具也都可以用在 Kotlin 專案內。即使是全新的 Kotlin 專案,想要採用 JUnit 做為測試工具也是沒有問題的。

Q. 如果是一個比較複雜的專案,建議怎麼開始導入測試框架?

可以先搜尋一下該專案使用的程式語言有沒有對應的測試工具?或是其開發生態系裡,有沒有對應的 xUnit 或其他知名的測試框架可以使用?從這些工具裡找出最符合專案及團隊需求的一個,這樣會比較容易平順的導入。另外,在選擇框架時,也會評估一下該框架目前的開發動態是否活躍?以及文件、教學是否足夠,這樣在導入的過程中也會有充足的學習及參考資源。

若是對測試不熟悉的話,可以參考一下單元測試的藝術(第二版)這本書,書裡面除了介紹單元測試的各種基本功外,也提供很多在 Legacy Code 裡加單元測試的實務技巧。

Q. 如果已經有成熟的框架,但專案從沒有用過測試框架,該怎麼開始,從哪裡開始下手?

建議先從單元測試的藝術這本書裡提到的切入點開始,也就是從這些可以加測試的點下手,而框架就是在這個過程中幫助我們讓測試程式碼更有組織、更快速、更方便的工具,兩者相輔相成可以讓這個導入過程更加順利。

問卷調查

本次講座進行過程中也進行了簡單的調查,在這邊一併分享結果給大家參考:

Q. 您用 Kotlin 開發什麼樣類型的專案?

您用 Kotlin 開發什麼樣類型的專案?

Q. 您的 Kotlin 測試經驗?

您的 Kotlin 測試經驗?

從問卷的結果看來,不少朋友正在學習 Kotlin 且大多都是應用在 Android 開發上,撰寫測試的經驗也還不是非常豐富。希望透過 Carolyn 的分享,可以讓大家找出現有專案導入測試卡關的點,也對如何選擇測試框架有更多的想法。我們之後也會繼續舉辦更多跟 Kotlin 及測試有關的技術講座,歡迎大家參加,下次見!