SlideShare a Scribd company logo
單元測試
本次簡報全都環繞在單元測試
會牽涉到很多東西………
軟體塑模、單元測試工具/概念
就讓我們先從軟體測試概念著手
圖片來源: https://martinfowler.com/articles/microservice-testing/#conclusion-test-pyramid
測試金字塔
先來想一些單元測試上的問題
為什麼單元測試這麼重要?
可不可以使用其它Testing去取代它?
寫單元測試是不是很花時間?
圖片來源: http://javarevisited.blogspot.tw/2017/01/Top-10-excuses-programmers-gives-to-avoid-unit-testing.html#axzz4ucIRqChB
好忙(盲)呀!
單元測試由誰寫?QA?Developer?
要怎麼開始單元測試?
先從寫出可測試程式開始!
S
O
C
K
(Simple)
(Observability)
(Control)
(Knowledge of
the expected result)
可測試的程式需要具備的特質
單純不複雜。E=mc2
Error = mistake * code2
程式碼可以被取得
執行中間過程的變化
以及最終的結果
程式碼的API符合測試案例的需求
程式碼有較少的
不確定(undetermined)
輸出
參考來源: http://www.ithome.com.tw/voice/88062
程式碼如何達成可測試性
第一步是什麼?
正確的軟體塑模(Modeling)
圖片來源: https://www.slideshare.net/InfoQ/why-bdd-can-save-agile
軟體設計的本質
從現實世界的問題映射成軟體解決方案
切記!映射的過程中,不要失去上下文(Context)
映射其實是一種心智轉換,可以採用試誤法(Try and Error)
快速疊代
映射完成之後,在程式設計時要注意什麼?
參考來源: https://www.linkedin.com/pulse/solid-architecture-design-principles-madhavan-ekanathan/
SOLID原則
Single
Responsibility
Principle
• 每個工作單元
僅擁有一項職
責
Open Close
Principle
• 每個工作單元
皆能輕易擴充,
但不接受直接
修改
Liskov
Substitution
Principle
• 衍生類別能夠取
代基礎類別
Interface
Segregation
Principle
• 針對不同客戶端
僅開發它所需要
的介面(API)
Dependency
Inversion Principle
• 改變呼叫端與
被呼叫端的
相依關係;讓呼叫
端不再受制於被
呼叫端
其實還有另一種手法….
參考來源: http://piotrgankiewicz.com/2016/03/15/cqs-an-easy-yet-powerful-pattern/
CQS(Command Query Segregation)
• Command改變物件狀態,不會直接回傳處理結果
• Query僅取得特定值,不會改變物件狀態
變得易於測試!
CQS並不適用所有場景,有些需求
就是無法套用CQS
除了軟體塑模,要達到可測試性
在實務上需要思考…
圖片來源: https://www.tenlong.com.tw/products/9789864342471
實務上的思維
封裝
接縫
設計
可測
試性
實務
• 限制物件對外提供的服務和資料
• 降低複雜度,提供易用性
• 讓程式碼關鍵部份得以被替換的
設計手法
• 配合Mocking工具在設計上的妥協
• 程式設計符合SOCK原則
開始進入單元測試第二步
先瞭解一堆名詞
參考來源: http://www.iteye.com/topic/1116464
相關專有名詞
Mocking
• 讓單元測試免除
外部服務的干擾
• 常用一些偽造物
件取代外部服務
TDD
• 一種以單元測試
為啟始步驟的開
發方法
紅綠重構
• TDD的執行步驟
• 從測試失敗(紅)
開始
• 撰寫程式碼讓其
通過(綠)
• 重構程式碼
ATDD/BDD
• 以實際需求的
例子為基準,滿
足這個例子為標
地撰寫程式碼
3A
• 撰寫單元測試的
常用格式,分別為:
Arrange/Act/Assert
SUT
• 受測單元,可以是
一個類別或是
一個子系統
Mocking!?
讓你感到困惑了嗎
圖片來源: http://www.dotnetcurry.com/aspnet-mvc/1103/aspnet-mvc-model-testing-using-nunit-moq
Mock的意義
Mocking工具有分兩種:
受限 & 不受限
受限的Mocking工具,幾乎都是免費的….
不受限的功能很強大,但是執行比較慢
以Mocking物件來說,分成兩類型:
Stub & Mock
圖片來源: https://stackoverflow.com/questions/3459287/whats-the-difference-between-a-mock-stub
Mock物件
Stub Mock
• 當測試給予正確的輸入參數,Stub回覆固定的值
• 用於測試預期的SUT運作結果
• 當SUT運行後,判定其內部運作是否符合預期
• 用於測試SUT內部運作的狀況
• 建議少用
Stub實際例子
針對DeserializeFromString方法進行偽造
(忽略輸入參數的變化)
回應的罐頭結果
使用工具: Nsubstitute & FluentAssertions
Mock實際例子
確認是否有被呼叫,及其輸入參數
(輸入參數可忽略或強制指定)
使用工具: Nsubstitute
我懂…Mock看起來很帥..但是請少用
Mock會讓測試程式碼變得不好維護/閱讀
Production Code一有改動,測試程式就要跟著改
來談談單元測試在開發上的一些原則
FIRST原則
Fast
Isolates
Repeatable
Self-validating
Timely
單元測試要盡可能讓它在短時間內執行完畢
測試不該存在相依,不論是單元測試彼此之間,或是受測單元的外部相依
單元測試可以不斷重複執行,在沒修改Production程式碼時,本次的執行結果應與上一次相同
驗證測試是否成功,不需要人工介入
盡可能在撰寫Production程式碼之前,撰寫單元測試程式
週邊
參考資料: http://fluentassertions.com/
週邊工具
FluentAssertions AutoFixture
• 讓斷言變得較為口語化,如同自然語言
• 提供許多好用的判斷相等的API
• 快速產出測試素材(Fixture)
• 資料為隨意資料組合,但是可以客製化資料產製的方式
參考資料: https://github.com/AutoFixture/AutoFixture
單元測試做不到的事
無法測試系統行為!
單元測試不能取代其它測試
其它測試也不能取代單元測試!
在實際軟體開發生命週期中
單元測試扮演什麼角色?
圖片資料: https://www.youtube.com/watch?v=e7X-l0pRhnA
你無法阻止需求新增/異動,而每一次的異動
都將造成架構的腐化,你只能重構來拯救你的
系統
沒有單元測試,重構的成本會讓你卻步!

More Related Content

What's hot

BHyVeってなんや
BHyVeってなんやBHyVeってなんや
BHyVeってなんやTakuya ASADA
 
twMVC#18 | 專案分層架構
twMVC#18 | 專案分層架構twMVC#18 | 專案分層架構
twMVC#18 | 專案分層架構
twMVC
 
從研發團隊管理及產品發展的角度看 DevOps
從研發團隊管理及產品發展的角度看 DevOps從研發團隊管理及產品發展的角度看 DevOps
從研發團隊管理及產品發展的角度看 DevOps
TIM WANG
 
Visual Studio 開發密技大補帖 | Study4.TW 2021 小聚#2
Visual Studio 開發密技大補帖 | Study4.TW 2021 小聚#2Visual Studio 開發密技大補帖 | Study4.TW 2021 小聚#2
Visual Studio 開發密技大補帖 | Study4.TW 2021 小聚#2
Alan Tsai
 
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。 【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
日本マイクロソフト株式会社
 
[2019 DevOpsDays Taipei]Azure DevOps 建立 DevOps 團隊
[2019 DevOpsDays Taipei]Azure DevOps 建立 DevOps 團隊[2019 DevOpsDays Taipei]Azure DevOps 建立 DevOps 團隊
[2019 DevOpsDays Taipei]Azure DevOps 建立 DevOps 團隊
Edward Kuo
 
如何讓一個敏捷團隊,同時執行多個專案
如何讓一個敏捷團隊,同時執行多個專案如何讓一個敏捷團隊,同時執行多個專案
如何讓一個敏捷團隊,同時執行多個專案
Paddy Huang
 
DevOps的神鬼奇航
DevOps的神鬼奇航DevOps的神鬼奇航
DevOps的神鬼奇航
Edward Kuo
 
MVC の Model を考える
MVC の Model を考えるMVC の Model を考える
MVC の Model を考える
tomo_masakura
 
用十分鐘瞭解 《JavaScript的程式世界》
用十分鐘瞭解  《JavaScript的程式世界》用十分鐘瞭解  《JavaScript的程式世界》
用十分鐘瞭解 《JavaScript的程式世界》
鍾誠 陳鍾誠
 
スクラム開発について
スクラム開発についてスクラム開発について
スクラム開発について
Akio Terayama
 
Gui自動テストツール基本
Gui自動テストツール基本Gui自動テストツール基本
Gui自動テストツール基本
Tsuyoshi Yumoto
 
從無到有建立一個敏捷開發團隊的經驗甘苦談
從無到有建立一個敏捷開發團隊的經驗甘苦談從無到有建立一個敏捷開發團隊的經驗甘苦談
從無到有建立一個敏捷開發團隊的經驗甘苦談
TIM WANG
 
如何設計電腦 -- 還有讓電腦變快的那些方法
如何設計電腦  -- 還有讓電腦變快的那些方法如何設計電腦  -- 還有讓電腦變快的那些方法
如何設計電腦 -- 還有讓電腦變快的那些方法
鍾誠 陳鍾誠
 
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
shinjiigarashi
 
91APP: 從 "零" 開始的 DevOps
91APP: 從 "零" 開始的 DevOps91APP: 從 "零" 開始的 DevOps
91APP: 從 "零" 開始的 DevOps
Andrew Wu
 
日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについてkumake
 
重新想像:如何做技術選型決策 / Rethinking : Technical Decision
重新想像:如何做技術選型決策 / Rethinking : Technical Decision重新想像:如何做技術選型決策 / Rethinking : Technical Decision
重新想像:如何做技術選型決策 / Rethinking : Technical Decision
Yi-Feng Tzeng
 
.NET Core時代のCI/CD
.NET Core時代のCI/CD.NET Core時代のCI/CD
.NET Core時代のCI/CD
Yuta Matsumura
 
Git workflows
Git workflowsGit workflows
Git workflows
Thuc Le Dong
 

What's hot (20)

BHyVeってなんや
BHyVeってなんやBHyVeってなんや
BHyVeってなんや
 
twMVC#18 | 專案分層架構
twMVC#18 | 專案分層架構twMVC#18 | 專案分層架構
twMVC#18 | 專案分層架構
 
從研發團隊管理及產品發展的角度看 DevOps
從研發團隊管理及產品發展的角度看 DevOps從研發團隊管理及產品發展的角度看 DevOps
從研發團隊管理及產品發展的角度看 DevOps
 
Visual Studio 開發密技大補帖 | Study4.TW 2021 小聚#2
Visual Studio 開發密技大補帖 | Study4.TW 2021 小聚#2Visual Studio 開發密技大補帖 | Study4.TW 2021 小聚#2
Visual Studio 開發密技大補帖 | Study4.TW 2021 小聚#2
 
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。 【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
【BS4】時は来たれり。今こそ .NET 6 へ移行する時。
 
[2019 DevOpsDays Taipei]Azure DevOps 建立 DevOps 團隊
[2019 DevOpsDays Taipei]Azure DevOps 建立 DevOps 團隊[2019 DevOpsDays Taipei]Azure DevOps 建立 DevOps 團隊
[2019 DevOpsDays Taipei]Azure DevOps 建立 DevOps 團隊
 
如何讓一個敏捷團隊,同時執行多個專案
如何讓一個敏捷團隊,同時執行多個專案如何讓一個敏捷團隊,同時執行多個專案
如何讓一個敏捷團隊,同時執行多個專案
 
DevOps的神鬼奇航
DevOps的神鬼奇航DevOps的神鬼奇航
DevOps的神鬼奇航
 
MVC の Model を考える
MVC の Model を考えるMVC の Model を考える
MVC の Model を考える
 
用十分鐘瞭解 《JavaScript的程式世界》
用十分鐘瞭解  《JavaScript的程式世界》用十分鐘瞭解  《JavaScript的程式世界》
用十分鐘瞭解 《JavaScript的程式世界》
 
スクラム開発について
スクラム開発についてスクラム開発について
スクラム開発について
 
Gui自動テストツール基本
Gui自動テストツール基本Gui自動テストツール基本
Gui自動テストツール基本
 
從無到有建立一個敏捷開發團隊的經驗甘苦談
從無到有建立一個敏捷開發團隊的經驗甘苦談從無到有建立一個敏捷開發團隊的經驗甘苦談
從無到有建立一個敏捷開發團隊的經驗甘苦談
 
如何設計電腦 -- 還有讓電腦變快的那些方法
如何設計電腦  -- 還有讓電腦變快的那些方法如何設計電腦  -- 還有讓電腦變快的那些方法
如何設計電腦 -- 還有讓電腦變快的那些方法
 
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
 
91APP: 從 "零" 開始的 DevOps
91APP: 從 "零" 開始的 DevOps91APP: 從 "零" 開始的 DevOps
91APP: 從 "零" 開始的 DevOps
 
日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについて
 
重新想像:如何做技術選型決策 / Rethinking : Technical Decision
重新想像:如何做技術選型決策 / Rethinking : Technical Decision重新想像:如何做技術選型決策 / Rethinking : Technical Decision
重新想像:如何做技術選型決策 / Rethinking : Technical Decision
 
.NET Core時代のCI/CD
.NET Core時代のCI/CD.NET Core時代のCI/CD
.NET Core時代のCI/CD
 
Git workflows
Git workflowsGit workflows
Git workflows
 

Similar to 單元測試

從理想、到現實的距離,開啟品味軟體測試之路 - 台灣軟體工程協會 (20220813)
從理想、到現實的距離,開啟品味軟體測試之路 - 台灣軟體工程協會 (20220813)從理想、到現實的距離,開啟品味軟體測試之路 - 台灣軟體工程協會 (20220813)
從理想、到現實的距離,開啟品味軟體測試之路 - 台灣軟體工程協會 (20220813)
Rick Hwang
 
单元测试(H2等)和持续集成(Hudson)实战简介
单元测试(H2等)和持续集成(Hudson)实战简介单元测试(H2等)和持续集成(Hudson)实战简介
单元测试(H2等)和持续集成(Hudson)实战简介
isxylands
 
Testing survey
Testing surveyTesting survey
Testing surveyTao He
 
有效的单元测试.ppt
有效的单元测试.ppt有效的单元测试.ppt
有效的单元测试.ppt
test499702
 
PHP 单元测试
PHP 单元测试PHP 单元测试
PHP 单元测试
Lan Yanguang
 
歡迎加入軟體構築行列
歡迎加入軟體構築行列歡迎加入軟體構築行列
歡迎加入軟體構築行列
Chris Wang
 
PHPUnit slide formal
PHPUnit slide formalPHPUnit slide formal
PHPUnit slide formaljameslabs
 
2014/02: 嵌入式測試驅動開發
2014/02: 嵌入式測試驅動開發2014/02: 嵌入式測試驅動開發
2014/02: 嵌入式測試驅動開發AgileCommunity
 
The way to continuous delivery
The way to continuous deliveryThe way to continuous delivery
The way to continuous delivery
Qiao Liang
 
Tip for Editors
Tip for EditorsTip for Editors
Tip for Editors
Chun-Yu Tseng
 
使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)
Max Lai
 
Unit test
Unit testUnit test
Unit test
shan chen
 
PHPUnit
PHPUnitPHPUnit
PHPUnit
jameslabs
 
twMVC#21 | 以實例說明ASP.NET Web API 服務的開發與測試過程
twMVC#21 | 以實例說明ASP.NET Web API 服務的開發與測試過程twMVC#21 | 以實例說明ASP.NET Web API 服務的開發與測試過程
twMVC#21 | 以實例說明ASP.NET Web API 服務的開發與測試過程
twMVC
 
Foundation of software development 1
Foundation of software development 1Foundation of software development 1
Foundation of software development 1netdbncku
 
Angular Testing for Book Club Online of Angular Taiwan
Angular Testing for Book Club Online of Angular TaiwanAngular Testing for Book Club Online of Angular Taiwan
Angular Testing for Book Club Online of Angular Taiwan
志龍 陳
 
打造完全免費的,JAVA專案持續整合環境_ 2013 java developer_day_by 李書豪
打造完全免費的,JAVA專案持續整合環境_ 2013 java developer_day_by 李書豪打造完全免費的,JAVA專案持續整合環境_ 2013 java developer_day_by 李書豪
打造完全免費的,JAVA專案持續整合環境_ 2013 java developer_day_by 李書豪
奕孝 陳
 
Legacy code 讀書會 1st (Ch1 - Ch5)
Legacy code 讀書會 1st (Ch1 - Ch5)Legacy code 讀書會 1st (Ch1 - Ch5)
Legacy code 讀書會 1st (Ch1 - Ch5)
Fong Liou
 

Similar to 單元測試 (20)

從理想、到現實的距離,開啟品味軟體測試之路 - 台灣軟體工程協會 (20220813)
從理想、到現實的距離,開啟品味軟體測試之路 - 台灣軟體工程協會 (20220813)從理想、到現實的距離,開啟品味軟體測試之路 - 台灣軟體工程協會 (20220813)
從理想、到現實的距離,開啟品味軟體測試之路 - 台灣軟體工程協會 (20220813)
 
C++exception
C++exceptionC++exception
C++exception
 
单元测试(H2等)和持续集成(Hudson)实战简介
单元测试(H2等)和持续集成(Hudson)实战简介单元测试(H2等)和持续集成(Hudson)实战简介
单元测试(H2等)和持续集成(Hudson)实战简介
 
Testing survey
Testing surveyTesting survey
Testing survey
 
有效的单元测试.ppt
有效的单元测试.ppt有效的单元测试.ppt
有效的单元测试.ppt
 
PHP 单元测试
PHP 单元测试PHP 单元测试
PHP 单元测试
 
歡迎加入軟體構築行列
歡迎加入軟體構築行列歡迎加入軟體構築行列
歡迎加入軟體構築行列
 
PHPUnit slide formal
PHPUnit slide formalPHPUnit slide formal
PHPUnit slide formal
 
2014/02: 嵌入式測試驅動開發
2014/02: 嵌入式測試驅動開發2014/02: 嵌入式測試驅動開發
2014/02: 嵌入式測試驅動開發
 
The way to continuous delivery
The way to continuous deliveryThe way to continuous delivery
The way to continuous delivery
 
Tip for Editors
Tip for EditorsTip for Editors
Tip for Editors
 
使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)
 
Unit test
Unit testUnit test
Unit test
 
PHPUnit
PHPUnitPHPUnit
PHPUnit
 
jasmine入门指南
jasmine入门指南jasmine入门指南
jasmine入门指南
 
twMVC#21 | 以實例說明ASP.NET Web API 服務的開發與測試過程
twMVC#21 | 以實例說明ASP.NET Web API 服務的開發與測試過程twMVC#21 | 以實例說明ASP.NET Web API 服務的開發與測試過程
twMVC#21 | 以實例說明ASP.NET Web API 服務的開發與測試過程
 
Foundation of software development 1
Foundation of software development 1Foundation of software development 1
Foundation of software development 1
 
Angular Testing for Book Club Online of Angular Taiwan
Angular Testing for Book Club Online of Angular TaiwanAngular Testing for Book Club Online of Angular Taiwan
Angular Testing for Book Club Online of Angular Taiwan
 
打造完全免費的,JAVA專案持續整合環境_ 2013 java developer_day_by 李書豪
打造完全免費的,JAVA專案持續整合環境_ 2013 java developer_day_by 李書豪打造完全免費的,JAVA專案持續整合環境_ 2013 java developer_day_by 李書豪
打造完全免費的,JAVA專案持續整合環境_ 2013 java developer_day_by 李書豪
 
Legacy code 讀書會 1st (Ch1 - Ch5)
Legacy code 讀書會 1st (Ch1 - Ch5)Legacy code 讀書會 1st (Ch1 - Ch5)
Legacy code 讀書會 1st (Ch1 - Ch5)
 

More from 國昭 張

8th ddd taiwan study group bounded context integration
8th ddd taiwan study group  bounded context integration8th ddd taiwan study group  bounded context integration
8th ddd taiwan study group bounded context integration
國昭 張
 
Ddd(meetup 2) ddd with clean architecture
Ddd(meetup 2) ddd with clean architectureDdd(meetup 2) ddd with clean architecture
Ddd(meetup 2) ddd with clean architecture
國昭 張
 
20190126 ddd-meetup1
20190126 ddd-meetup120190126 ddd-meetup1
20190126 ddd-meetup1
國昭 張
 
事件風暴-設計衝刺
事件風暴-設計衝刺事件風暴-設計衝刺
事件風暴-設計衝刺
國昭 張
 
事件風暴-領域建模
事件風暴-領域建模事件風暴-領域建模
事件風暴-領域建模
國昭 張
 
Docker實務
Docker實務Docker實務
Docker實務
國昭 張
 
Scrum essential
Scrum essentialScrum essential
Scrum essential
國昭 張
 
Docker進階探討
Docker進階探討Docker進階探討
Docker進階探討
國昭 張
 
Vue
VueVue
Docker基礎
Docker基礎Docker基礎
Docker基礎
國昭 張
 
DDD架構設計
DDD架構設計DDD架構設計
DDD架構設計
國昭 張
 
DDD系統分析
DDD系統分析DDD系統分析
DDD系統分析
國昭 張
 
DDD引導
DDD引導DDD引導
DDD引導
國昭 張
 
前端測試
前端測試前端測試
前端測試
國昭 張
 
Asp.net core v1.0
Asp.net core v1.0Asp.net core v1.0
Asp.net core v1.0
國昭 張
 
Redux+react js
Redux+react jsRedux+react js
Redux+react js
國昭 張
 
React js
React jsReact js
React js
國昭 張
 
架構設計-資料存取的選擇
架構設計-資料存取的選擇架構設計-資料存取的選擇
架構設計-資料存取的選擇
國昭 張
 
前端自動化工具
前端自動化工具前端自動化工具
前端自動化工具
國昭 張
 
例外處理與單元測試
例外處理與單元測試例外處理與單元測試
例外處理與單元測試
國昭 張
 

More from 國昭 張 (20)

8th ddd taiwan study group bounded context integration
8th ddd taiwan study group  bounded context integration8th ddd taiwan study group  bounded context integration
8th ddd taiwan study group bounded context integration
 
Ddd(meetup 2) ddd with clean architecture
Ddd(meetup 2) ddd with clean architectureDdd(meetup 2) ddd with clean architecture
Ddd(meetup 2) ddd with clean architecture
 
20190126 ddd-meetup1
20190126 ddd-meetup120190126 ddd-meetup1
20190126 ddd-meetup1
 
事件風暴-設計衝刺
事件風暴-設計衝刺事件風暴-設計衝刺
事件風暴-設計衝刺
 
事件風暴-領域建模
事件風暴-領域建模事件風暴-領域建模
事件風暴-領域建模
 
Docker實務
Docker實務Docker實務
Docker實務
 
Scrum essential
Scrum essentialScrum essential
Scrum essential
 
Docker進階探討
Docker進階探討Docker進階探討
Docker進階探討
 
Vue
VueVue
Vue
 
Docker基礎
Docker基礎Docker基礎
Docker基礎
 
DDD架構設計
DDD架構設計DDD架構設計
DDD架構設計
 
DDD系統分析
DDD系統分析DDD系統分析
DDD系統分析
 
DDD引導
DDD引導DDD引導
DDD引導
 
前端測試
前端測試前端測試
前端測試
 
Asp.net core v1.0
Asp.net core v1.0Asp.net core v1.0
Asp.net core v1.0
 
Redux+react js
Redux+react jsRedux+react js
Redux+react js
 
React js
React jsReact js
React js
 
架構設計-資料存取的選擇
架構設計-資料存取的選擇架構設計-資料存取的選擇
架構設計-資料存取的選擇
 
前端自動化工具
前端自動化工具前端自動化工具
前端自動化工具
 
例外處理與單元測試
例外處理與單元測試例外處理與單元測試
例外處理與單元測試
 

單元測試