SlideShare a Scribd company logo
1 of 33
Download to read offline
單元測試不是有寫就好
Kuma Syu -> 講者怕寂寞,歡迎發問或互動 XD
關於我
https://medium.com/kuma老師的軟體工程教室
2
-> 講者怕寂寞,歡迎發問或互動 XD
https://www.facebook.com/kukumamaya
https://www.youtube.com/@yu-songsyu6598/videos
「我有個朋友」出了一本書…
3
KUMA WARNING
本演講意在與聽眾分享本人近年來開發中,在嘗
試(踩坑)過各種單元測試寫法後,所歸納出的
分析、經驗,與建議,而不在手牽把手教你寫測
試,期待在此看到大量測試程式碼的同學,恐將
大失所望。為不耽誤您的青春,請趁其他教室關
門前前往。
4
實戰 Workshop 在此
你是不是像我…
寫了測試,但上線依然錯誤百出
寫了測試,但架構沒有比較乾淨
寫了測試,但沒有比較有時間
5
6
這是一個悲傷的故事…
7
問卷調查一下…
工作時,「不經常寫」單元測試的,請舉手!
Today We’ll Have…
何謂單元測試
好的單元測試
如何最小成本實踐
8
何謂單元測試?
Tests that can run
independent of one another
9
https://www.oreilly.com/library/view/test-driven-development/0321146530/
何謂單元測試?
Tests that can run
independent of one another
10
不影響彼此
同時跑也沒差
單元測試的目的
1. 保護程式,不被 QA 靠北
11
單元測試的目的
1. 保護功能
12
單元測試的目的
1. 保護功能
2. 幫助重構
13
程式重構了,那測試呢?
14
單元測試,不是有寫就好!
欠缺管理的單元測試,在 Code Base 長大後,拖慢速度的力道,與 Legacy
Code 不相上下。
15
單元測試也是程式
一樣也會錯、會有 Code Smell → 一樣要重構
「像維護產品程式碼一樣地維護測試程式碼。」
16
何謂「好的」單元測試
17
何謂「好的」單元測試
writable, fast, and specific.
18
https://medium.com/@kentbeck_7670/test-desiderata-94150638a4b3
「好的」單元測試 之 Kuma 的建議
1. 暴露意圖
2. 「適當且簡單」的檢查
3. 珍惜生命,遠離框架
4. 測功能,不要測類別 → 獨立於架構
19
暴露意圖
UserObj user = new UserObj();
user.setName(“Kuma”);
long userId = userMapper.insert(user);
AccountObj account = new Account();
account.setBalance(1,000);
account.setUser(user.getId());
accountMapper.insert(account);
account.getBalance(userId);
assertEquals(1,000, userId)
20
create_user(1,000);
when_get_balance();
then_result_is(1,000);
「適當且簡單」的檢查
有做該做的,沒做不該做的
何謂「不該做的」?
驗回傳 > 驗狀態 > 驗互動
21
驗互動
X Mocking
X 被程式實作綁架
“Tests should be structure-insensitive.”
22
Mockito.verify(kafkaClient.put(“t”, “hello world”), times(2));
驗互動
X Mocking
X 被程式實作綁架
“Tests should be structure-insensitive.”
Tip: 當不得不驗互動的場景越來越多,請回頭看看介面設計有什麼問題。
23
Mockito.verify(kafkaClient.put(“t”, “hello world”), times(2));
驗狀態
24
珍惜生命,遠離框架
1. 速度
2. 架構設計
25
7 s 到 200 ms 的故事
測功能,不要測類別(風格一)
26
測功能,不要測類別(風格二)
測試要與架構獨立
27
道理我都懂(吧),但實踐呢?
實踐:邊寫邊重構
程式功能
程式架構
測試
三點不動一點動
28
29
有喔:
30
A Quick Recap
何謂單元測試
好的單元測試
大師怎麼說
Kuma 怎麼說
如何最小成本實踐
TDD:邊寫邊重構,三點不動一點動
31
Q&A
以上內容節錄自:
加入我們: 32
33
https://martinfowler.com/bliki/UnitTest.html

More Related Content

What's hot

JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」
JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」
JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」y torazuka
 
twMVC#43 Visual Studio 2022 新功能拆解
twMVC#43 Visual Studio 2022 新功能拆解twMVC#43 Visual Studio 2022 新功能拆解
twMVC#43 Visual Studio 2022 新功能拆解twMVC
 
Testing in Production, Deploy on Fridays
Testing in Production, Deploy on FridaysTesting in Production, Deploy on Fridays
Testing in Production, Deploy on FridaysYi-Feng Tzeng
 
Lxc で始めるケチケチ仮想化生活?!
Lxc で始めるケチケチ仮想化生活?!Lxc で始めるケチケチ仮想化生活?!
Lxc で始めるケチケチ仮想化生活?!Etsuji Nakai
 
Java仮想マシンの実装技術
Java仮想マシンの実装技術Java仮想マシンの実装技術
Java仮想マシンの実装技術Kiyokuni Kawachiya
 
OpenJDK トラブルシューティング #javacasual
OpenJDK トラブルシューティング #javacasualOpenJDK トラブルシューティング #javacasual
OpenJDK トラブルシューティング #javacasualYuji Kubota
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
CentOS Linux 8 の EOL と対応策の検討
CentOS Linux 8 の EOL と対応策の検討CentOS Linux 8 の EOL と対応策の検討
CentOS Linux 8 の EOL と対応策の検討Masahito Zembutsu
 
コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線Motonori Shindo
 
OSTree: OSイメージとパッケージシステムの間にGitのアプローチを
OSTree: OSイメージとパッケージシステムの間にGitのアプローチをOSTree: OSイメージとパッケージシステムの間にGitのアプローチを
OSTree: OSイメージとパッケージシステムの間にGitのアプローチをi_yudai
 
UnicodeによるXSSと SQLインジェクションの可能性
UnicodeによるXSSとSQLインジェクションの可能性UnicodeによるXSSとSQLインジェクションの可能性
UnicodeによるXSSと SQLインジェクションの可能性Hiroshi Tokumaru
 
クラシフィケーション・ツリー法入門
クラシフィケーション・ツリー法入門クラシフィケーション・ツリー法入門
クラシフィケーション・ツリー法入門H Iseri
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかYuki Miyatake
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みChihiro Ito
 
BHyVeってなんや
BHyVeってなんやBHyVeってなんや
BHyVeってなんやTakuya ASADA
 
OpenStackトラブルシューティング入門
OpenStackトラブルシューティング入門OpenStackトラブルシューティング入門
OpenStackトラブルシューティング入門VirtualTech Japan Inc.
 
Unified JVM Logging
Unified JVM LoggingUnified JVM Logging
Unified JVM LoggingYuji Kubota
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールMITSUNARI Shigeo
 

What's hot (20)

JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」
JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」
JJUG CCC 2013 Fall「JVMコードリーディング入門-JVMのOS抽象化レイヤーについて-」
 
twMVC#43 Visual Studio 2022 新功能拆解
twMVC#43 Visual Studio 2022 新功能拆解twMVC#43 Visual Studio 2022 新功能拆解
twMVC#43 Visual Studio 2022 新功能拆解
 
Testing in Production, Deploy on Fridays
Testing in Production, Deploy on FridaysTesting in Production, Deploy on Fridays
Testing in Production, Deploy on Fridays
 
Lxc で始めるケチケチ仮想化生活?!
Lxc で始めるケチケチ仮想化生活?!Lxc で始めるケチケチ仮想化生活?!
Lxc で始めるケチケチ仮想化生活?!
 
Java仮想マシンの実装技術
Java仮想マシンの実装技術Java仮想マシンの実装技術
Java仮想マシンの実装技術
 
OpenJDK トラブルシューティング #javacasual
OpenJDK トラブルシューティング #javacasualOpenJDK トラブルシューティング #javacasual
OpenJDK トラブルシューティング #javacasual
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
CentOS Linux 8 の EOL と対応策の検討
CentOS Linux 8 の EOL と対応策の検討CentOS Linux 8 の EOL と対応策の検討
CentOS Linux 8 の EOL と対応策の検討
 
Vyatta 改造入門
Vyatta 改造入門Vyatta 改造入門
Vyatta 改造入門
 
コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線
 
OSTree: OSイメージとパッケージシステムの間にGitのアプローチを
OSTree: OSイメージとパッケージシステムの間にGitのアプローチをOSTree: OSイメージとパッケージシステムの間にGitのアプローチを
OSTree: OSイメージとパッケージシステムの間にGitのアプローチを
 
單元測試
單元測試單元測試
單元測試
 
UnicodeによるXSSと SQLインジェクションの可能性
UnicodeによるXSSとSQLインジェクションの可能性UnicodeによるXSSとSQLインジェクションの可能性
UnicodeによるXSSと SQLインジェクションの可能性
 
クラシフィケーション・ツリー法入門
クラシフィケーション・ツリー法入門クラシフィケーション・ツリー法入門
クラシフィケーション・ツリー法入門
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
 
BHyVeってなんや
BHyVeってなんやBHyVeってなんや
BHyVeってなんや
 
OpenStackトラブルシューティング入門
OpenStackトラブルシューティング入門OpenStackトラブルシューティング入門
OpenStackトラブルシューティング入門
 
Unified JVM Logging
Unified JVM LoggingUnified JVM Logging
Unified JVM Logging
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
 

單元測試不是有寫就好