SlideShare a Scribd company logo
1
Sam Chen
软件开发单元测试
为什么需要单元测试?	
—  软件不停在迭代.
—  需求改变.
—  发现Bug.
—  优化.
—  重构.
—  软件是脆弱的.
—  新的改动有可能破坏老的功能.
—  新的改动不能引入新的问题.
—  人工测试永远无法做到完美.
2
测试种类	
—  系统集成测试
—  压力测试
—  单步调试测试 - 程序猿
—  接收测试
—  回归测试
—  单元测试 - 程序猿	
3
大多数的工程师测试就像	
4
什么是单元测试	
—  小测试 (面向函数).
—  很快(机器执行).
—  很便捷 (自动化).
—  程序猿写的.
—  好部署
—  可重复执行的.
—  可靠的.
	
5
为什么要单元测试?	
—  每个程序猿都会犯错,只有单元测试能够第一时间发现
你的错误。.
—  只有单元测试才能保证所有的边界条件都被测到.
—  可测试的代码,往往意味着好的设计。
—  从使用方角度去考虑往往能设计出好的接口。
—  单元测试需要减少依赖,这本身就是设计的要求之一。
—  单元测试能让你在解决bug或重构代码的时候更有信心。
—  单元测试代码就是最好的文档。
—  单元测试可以用来辅助调试。
6
对单元测试说‘不’?	
—  我没有时间.
—  如果你之前写了单元测试,现在你就不会这么忙了.
—  我的代码太复杂,不能写单元测试.
—  是时间Review一下你的代码了.
—  我的模块已经运行了好多年,非常稳定.
—  恭喜你,非常好的设计。但你能保证你接下来不需要重构你的代
码,不担心新的改动会破坏已有的功能?
—  我们是嵌入式开发,需要硬件配合,无法做单元测试.
—  好理由,但事实上通过Mock是可以做到的.
—  等我东西发布有时间后我再做单元测试.
—  太迟了,因为那个时间,你测试的是你的实现,而不是你的设计
7
多少单元测试是合理的	
—  准则: 当你可以放心的让一个实习生来修改你的代码,而
不用担心它的提交会破坏已有的行为,这个单元测试就
足够了
8
测试驱动开发(TDD)
9
什么是TDD	
—  Test-Driven Design (Development)
—  在写功能代码之前写单元测试.
—  只写能够通过测试的代码。
—  添加新的代码或重构,重复执行第一步.
	
10
好处和坏处	
—  好处
—  所有代码都被测试保护.
—  Bug会变少,解bug时间也相应小.
—  写测试会带来好的设计.
—  测试结果可以告诉你当前的进度
—  需要少的测试人员。
—  ⻓长远看,单元测试的成本是非常低的
—  Cons
—  测试代码需要工程师编写和维护.
—  初期,会减慢开发进度
—  执行困难,久了会产生疲倦。
11
改进的 TDD	
—  关键是在写功能代码前写测试代码.
—  对关键部分写足够的代码
—  结对编程。	
12
写单元测试和可测试的代
码
13
嵌入式系统中的单元测试难点	
—  依赖对象
—  慢的依赖对象,如播放一个视频
—  易变的依赖,如不同的视频内容
—  依赖对象的准备,播放视频前需要加载.
—  单元测试的部署.
—  嵌入式软件一般只能跑在硬件上。
14
写可测试的代码1-简单的函数.	
15
写可测试的代码 –隔离依赖.	
—  X 依赖 Y 如果
—  X调用Y.
—  X 继承Y.
—  X 依赖Y,而Y依赖Z (依赖迁移).
—  X: Dependant
—  Y: Component or Service.
	
16
如何解除依赖?	
17
写可承受的代码(3) – 可重入	
—  可重⼊入代码⼀一般
—  不使用全局或静态变量.
—  不调用不可重入的接口.
18
写可测试代码-避免不用的头文
件	
19
SOLID Design Principles	
—  S Single Responsibility Principle
—  O Open Closed Principle
—  L Liskov Substitution Principle
—  I Interface Segregation Principle
—  D Dependency Inversion Principle	
20
OO princibles	
—  封装变化的部分。
—  组合优于继承。
—  针对接口而不是实现编程。
—  对修改封闭,对扩展开放.
—  依赖抽象类,而不是具体的实现.
—  .	
21
设计模式	
—  Design pattern are try-and-trust programming patterns.
—  Strategy
—  Factory
—  State
—  Observer
—  Proxy
—  Adaptor
—  MVC (Modal-View-Controller)
—  DI (Dependency Injection)
—  An example of using Design patterns to refactor baseband
player.
22
GTest	
—  http://code.google.com/p/googletest/
—  What is
—  A library for writing C++ tests
—  Open-source with new BSD license
—  Based on xUnit architecture
—  Supports Android, Linux, Windows, Mac OS, and other Oses
—  Can generate JUnit-style XML, parsable by Hudson or Jenkins.
—  Features
—  Add debug info to assertions using <<
—  Death tests
—  User-defined predicate assertions
—  Value/type-parameterized tests
—  Test event listener API (user-defined plug-ins)
—  Test filtering
—  Test shuffling	
23
Gmock	
—  Gmock (Google C++ Mocking Framework) is a library for writing and
using C++ mock classes.
—  create mock classes trivially using simple macros.
—  supports a rich set of matchers and actions.
—  handles unordered, partially ordered, or completely ordered expectations
—  Gmock is not a test framework, it works seamless with Gtest.
—  http://code.google.com/p/googlemock/
24
Gmock Example	
25
单元测试框架
26
Reference.	
—  http://code.google.com/p/googletest/
—  http://code.google.com/p/googlemock/
—  http://martinfowler.com/articles/injection.html
—  Test Driven Development for Embedded C by James W. Grenning
—  Head first Desgin Patterns, O-Reilly by Eric Freeman.
—  Pragmatic programmers - pragmatic unit testing (in java with junit) –
2003 - by laxxuss
—  http://targetprocess.com	
27

More Related Content

What's hot

敏捷测试中的工具实现
敏捷测试中的工具实现敏捷测试中的工具实现
敏捷测试中的工具实现drewz lin
 
Open CV Setting For Android Studio
Open CV Setting For Android StudioOpen CV Setting For Android Studio
Open CV Setting For Android Studio
Phoebe Huang
 
Efficient JavaScript Unit Testing (Chinese Version), JavaOne China 2013
Efficient JavaScript Unit Testing (Chinese Version), JavaOne China 2013Efficient JavaScript Unit Testing (Chinese Version), JavaOne China 2013
Efficient JavaScript Unit Testing (Chinese Version), JavaOne China 2013
Hazem Saleh
 
单元测试(H2等)和持续集成(Hudson)实战简介
单元测试(H2等)和持续集成(Hudson)实战简介单元测试(H2等)和持续集成(Hudson)实战简介
单元测试(H2等)和持续集成(Hudson)实战简介
isxylands
 
設定android 測試環境
設定android 測試環境設定android 測試環境
設定android 測試環境
彥彬 洪
 
网易移动自动化测试实践(孔庆云)
网易移动自动化测试实践(孔庆云)网易移动自动化测试实践(孔庆云)
网易移动自动化测试实践(孔庆云)drewz lin
 
重構—改善既有程式的設計(chapter 4,5)
重構—改善既有程式的設計(chapter 4,5)重構—改善既有程式的設計(chapter 4,5)
重構—改善既有程式的設計(chapter 4,5)Chris Huang
 
Testing in swift
Testing in swiftTesting in swift
Testing in swifthugo lu
 
例外處理實務
例外處理實務例外處理實務
例外處理實務
Jeff Chu
 
使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)
Max Lai
 
测试快照
测试快照测试快照
测试快照
jacquesqj
 
2014/02: 嵌入式測試驅動開發
2014/02: 嵌入式測試驅動開發2014/02: 嵌入式測試驅動開發
2014/02: 嵌入式測試驅動開發AgileCommunity
 
例外處理與單元測試
例外處理與單元測試例外處理與單元測試
例外處理與單元測試
國昭 張
 
Duannian agile
Duannian agileDuannian agile
Duannian agiled0nn9n
 
Tip for Editors
Tip for EditorsTip for Editors
Tip for Editors
Chun-Yu Tseng
 
嵌入式測試驅動開發
嵌入式測試驅動開發嵌入式測試驅動開發
嵌入式測試驅動開發
hugo lu
 
Testing in Python @ Kaosiung.py 2014.05.26
Testing in Python @ Kaosiung.py 2014.05.26Testing in Python @ Kaosiung.py 2014.05.26
Testing in Python @ Kaosiung.py 2014.05.26
Chun-Yu Tseng
 
Net调试
Net调试Net调试
Net调试
breezeli
 

What's hot (20)

敏捷测试中的工具实现
敏捷测试中的工具实现敏捷测试中的工具实现
敏捷测试中的工具实现
 
Open CV Setting For Android Studio
Open CV Setting For Android StudioOpen CV Setting For Android Studio
Open CV Setting For Android Studio
 
Efficient JavaScript Unit Testing (Chinese Version), JavaOne China 2013
Efficient JavaScript Unit Testing (Chinese Version), JavaOne China 2013Efficient JavaScript Unit Testing (Chinese Version), JavaOne China 2013
Efficient JavaScript Unit Testing (Chinese Version), JavaOne China 2013
 
单元测试(H2等)和持续集成(Hudson)实战简介
单元测试(H2等)和持续集成(Hudson)实战简介单元测试(H2等)和持续集成(Hudson)实战简介
单元测试(H2等)和持续集成(Hudson)实战简介
 
設定android 測試環境
設定android 測試環境設定android 測試環境
設定android 測試環境
 
网易移动自动化测试实践(孔庆云)
网易移动自动化测试实践(孔庆云)网易移动自动化测试实践(孔庆云)
网易移动自动化测试实践(孔庆云)
 
重構—改善既有程式的設計(chapter 4,5)
重構—改善既有程式的設計(chapter 4,5)重構—改善既有程式的設計(chapter 4,5)
重構—改善既有程式的設計(chapter 4,5)
 
Testing in swift
Testing in swiftTesting in swift
Testing in swift
 
例外處理實務
例外處理實務例外處理實務
例外處理實務
 
使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)
 
jasmine入门指南
jasmine入门指南jasmine入门指南
jasmine入门指南
 
测试快照
测试快照测试快照
测试快照
 
2014/02: 嵌入式測試驅動開發
2014/02: 嵌入式測試驅動開發2014/02: 嵌入式測試驅動開發
2014/02: 嵌入式測試驅動開發
 
Xpp
XppXpp
Xpp
 
例外處理與單元測試
例外處理與單元測試例外處理與單元測試
例外處理與單元測試
 
Duannian agile
Duannian agileDuannian agile
Duannian agile
 
Tip for Editors
Tip for EditorsTip for Editors
Tip for Editors
 
嵌入式測試驅動開發
嵌入式測試驅動開發嵌入式測試驅動開發
嵌入式測試驅動開發
 
Testing in Python @ Kaosiung.py 2014.05.26
Testing in Python @ Kaosiung.py 2014.05.26Testing in Python @ Kaosiung.py 2014.05.26
Testing in Python @ Kaosiung.py 2014.05.26
 
Net调试
Net调试Net调试
Net调试
 

Similar to Unit test

Tcon分享 芈峮
Tcon分享 芈峮Tcon分享 芈峮
Tcon分享 芈峮
mijun_hlp
 
豆瓣I os自动化测试实践和经验
豆瓣I os自动化测试实践和经验豆瓣I os自动化测试实践和经验
豆瓣I os自动化测试实践和经验drewz lin
 
twMVC#12 | 如何在實務上使用 TDD 來開發
twMVC#12 | 如何在實務上使用 TDD 來開發twMVC#12 | 如何在實務上使用 TDD 來開發
twMVC#12 | 如何在實務上使用 TDD 來開發
twMVC
 
Foundation of software development 2
Foundation of software development 2Foundation of software development 2
Foundation of software development 2netdbncku
 
如何在實務上使用TDD來開發 twmvc#12
如何在實務上使用TDD來開發 twmvc#12如何在實務上使用TDD來開發 twmvc#12
如何在實務上使用TDD來開發 twmvc#12
twMVC
 
同济优秀课程设计 - 软件测试报告
同济优秀课程设计 - 软件测试报告同济优秀课程设计 - 软件测试报告
同济优秀课程设计 - 软件测试报告
Kerry Zhu
 
Testing survey
Testing surveyTesting survey
Testing surveyTao He
 
Junit使用指南及作业规范
Junit使用指南及作业规范Junit使用指南及作业规范
Junit使用指南及作业规范
dong jiang
 
service-oriented agile team-Q con-beijing2012
service-oriented agile team-Q con-beijing2012service-oriented agile team-Q con-beijing2012
service-oriented agile team-Q con-beijing2012Qiao Liang
 
打造面向服务的敏捷团队 Q con-beijing2012
打造面向服务的敏捷团队 Q con-beijing2012打造面向服务的敏捷团队 Q con-beijing2012
打造面向服务的敏捷团队 Q con-beijing2012
Qiao Liang
 
Continuous integration
Continuous integrationContinuous integration
Continuous integrationnetdbncku
 
Top100summit automan x之框架介绍 王超
Top100summit automan x之框架介绍 王超Top100summit automan x之框架介绍 王超
Top100summit automan x之框架介绍 王超drewz lin
 
有效的单元测试.ppt
有效的单元测试.ppt有效的单元测试.ppt
有效的单元测试.ppt
test499702
 
分布式系统测试实践
分布式系统测试实践分布式系统测试实践
分布式系统测试实践drewz lin
 
從理想、到現實的距離,開啟品味軟體測試之路 - 台灣軟體工程協會 (20220813)
從理想、到現實的距離,開啟品味軟體測試之路 - 台灣軟體工程協會 (20220813)從理想、到現實的距離,開啟品味軟體測試之路 - 台灣軟體工程協會 (20220813)
從理想、到現實的距離,開啟品味軟體測試之路 - 台灣軟體工程協會 (20220813)
Rick Hwang
 
手机自动化测试解决方案
手机自动化测试解决方案手机自动化测试解决方案
手机自动化测试解决方案
懿民 施
 
The way to continuous delivery
The way to continuous deliveryThe way to continuous delivery
The way to continuous delivery
Qiao Liang
 
钱宝坤:多浏览器集成的JavaScript单元测试工具
钱宝坤:多浏览器集成的JavaScript单元测试工具钱宝坤:多浏览器集成的JavaScript单元测试工具
钱宝坤:多浏览器集成的JavaScript单元测试工具taobao.com
 
UnitTest.pptx
UnitTest.pptxUnitTest.pptx
UnitTest.pptx
yuchengLiu36
 

Similar to Unit test (20)

Tcon分享 芈峮
Tcon分享 芈峮Tcon分享 芈峮
Tcon分享 芈峮
 
豆瓣I os自动化测试实践和经验
豆瓣I os自动化测试实践和经验豆瓣I os自动化测试实践和经验
豆瓣I os自动化测试实践和经验
 
twMVC#12 | 如何在實務上使用 TDD 來開發
twMVC#12 | 如何在實務上使用 TDD 來開發twMVC#12 | 如何在實務上使用 TDD 來開發
twMVC#12 | 如何在實務上使用 TDD 來開發
 
Foundation of software development 2
Foundation of software development 2Foundation of software development 2
Foundation of software development 2
 
如何在實務上使用TDD來開發 twmvc#12
如何在實務上使用TDD來開發 twmvc#12如何在實務上使用TDD來開發 twmvc#12
如何在實務上使用TDD來開發 twmvc#12
 
同济优秀课程设计 - 软件测试报告
同济优秀课程设计 - 软件测试报告同济优秀课程设计 - 软件测试报告
同济优秀课程设计 - 软件测试报告
 
Testing survey
Testing surveyTesting survey
Testing survey
 
Junit使用指南及作业规范
Junit使用指南及作业规范Junit使用指南及作业规范
Junit使用指南及作业规范
 
service-oriented agile team-Q con-beijing2012
service-oriented agile team-Q con-beijing2012service-oriented agile team-Q con-beijing2012
service-oriented agile team-Q con-beijing2012
 
打造面向服务的敏捷团队 Q con-beijing2012
打造面向服务的敏捷团队 Q con-beijing2012打造面向服务的敏捷团队 Q con-beijing2012
打造面向服务的敏捷团队 Q con-beijing2012
 
Continuous integration
Continuous integrationContinuous integration
Continuous integration
 
Top100summit automan x之框架介绍 王超
Top100summit automan x之框架介绍 王超Top100summit automan x之框架介绍 王超
Top100summit automan x之框架介绍 王超
 
C++exception
C++exceptionC++exception
C++exception
 
有效的单元测试.ppt
有效的单元测试.ppt有效的单元测试.ppt
有效的单元测试.ppt
 
分布式系统测试实践
分布式系统测试实践分布式系统测试实践
分布式系统测试实践
 
從理想、到現實的距離,開啟品味軟體測試之路 - 台灣軟體工程協會 (20220813)
從理想、到現實的距離,開啟品味軟體測試之路 - 台灣軟體工程協會 (20220813)從理想、到現實的距離,開啟品味軟體測試之路 - 台灣軟體工程協會 (20220813)
從理想、到現實的距離,開啟品味軟體測試之路 - 台灣軟體工程協會 (20220813)
 
手机自动化测试解决方案
手机自动化测试解决方案手机自动化测试解决方案
手机自动化测试解决方案
 
The way to continuous delivery
The way to continuous deliveryThe way to continuous delivery
The way to continuous delivery
 
钱宝坤:多浏览器集成的JavaScript单元测试工具
钱宝坤:多浏览器集成的JavaScript单元测试工具钱宝坤:多浏览器集成的JavaScript单元测试工具
钱宝坤:多浏览器集成的JavaScript单元测试工具
 
UnitTest.pptx
UnitTest.pptxUnitTest.pptx
UnitTest.pptx
 

Unit test