SlideShare une entreprise Scribd logo
1  sur  21
黃偉榮




      1
個人介紹
 Wade 黃偉榮
 2011 C# MVP
 TW MVC 創辦人之一
 [點部落]黃偉榮的學習筆記
    www.dotblogs.com.tw/wadehuang36/




                                       2
大綱
   簡單介紹單元測試
 單元測試困難的地方,與操作經驗
 NHibernate+Sqlite幫我決解那些問題




                              3
單元測試?
   什麼是單元測試?
     驗證程式的行為與期望是一致
   為什麼要寫單元測試?
     保證自己寫的程式沒有問題
   回歸測試?
     原有功能在修改後是否保持完整
   單元測試無法測試出?
     UI
     商業邏輯
     整體效能等等


                       4
單元測試困難的地方?
   程式的耦合度不能太高
   每一個Method處理的事務不能太大
   測試資料的準備
    • 考試成績計算
    • 購物車折扣計算
    • 排行計算




                         5
曾經嘗試過那些方法
   解耦合到受測Method資料來源完全使用參數傳遞
   自己寫DAO 使用DataSet
   使用測試資料庫,建snapshot
   使用Entity Framework時使用Mock DataContext
   使用NHibernate+Sqlite




                                            6
受測Method資料來源完全使用參數傳遞




                       7
受測Method資料來源完全使用參數傳遞




                       8
自己寫DAO



呈現層   邏輯層   資料存取層   DB




                         9
自己寫DAO

            資料存取層       DB



            資料存取層
呈現層   邏輯層              DataSet
            (For 測試)

            使用IoC切換




                                 10
自己寫DAO 使用DataSet




                   11
自己寫DAO 使用DataSet




                   12
Entity Framework Mock Context




黃偉榮的學習筆記:使用ContextMock以不連結資料庫的方式做單元測試
                                        13
使用測試資料庫,建snapshot
CREATE DATABASE TestExamDb__SS_1
ON ( ) AS SNAPSHOT OF TestExamDb;

RESTORE DATABASE TestExamDb FROM
DATABASE_SNAPSHOT = ‘ExamDb_SS_1‘;

有一個很大的缺點,測試Method多,很容易因
為Lock而失敗。



                                     14
Code First
   ORM的Model有幾種設計方式
     Database First
     Model First
     Code First
      ○ Entity Framework 4.1 +
      ○ NHibernate 3.2 +


   Model/Code First都有一個特性,一開始都
    沒有Database, Database是動態產生的,
    所以可以每一次測試都產生新增Database與
    新增測試資料。

                                  15
用NHibernate+Sqlite的好處
   NHibernate的特色
     支援的DB多
     Map彈性大
     Event
     Cache
     Log
     HQL與SQL支援

   Sqlite的特色
   對測試的便利性

                        16
二種策略
   產生很多*.db檔,執行時複製檔案
     適合資料量大
     缺點:Schema或測試資料異動時很麻煩

    NhibernateTestHelper.Copy(fileName)

   使用Create Schema與初始化資料
     Schema或測試資料異動時較方便
     缺點:資料量大時測試時間會加長

    NhibernateTestHelper.CreateSchema(iniClass[])


                                                    17
使用的單元測試工具
•   Microsoft Visual Studio Unit Testing




                                           18
單元測試的一些小技巧
   Moles - Isolation framework for .NET
     亂數
     日期



   Mock
     Moq

     寄Email(Call INotifyService)
     訂單執行刷卡服務
              (IOrderService Call ICreditService)


                                                    19
20
21

Contenu connexe

Tendances

CH04:認識物件
CH04:認識物件CH04:認識物件
CH04:認識物件Justin Lin
 
111030 gztechparty-小路-云时代的mysql
111030 gztechparty-小路-云时代的mysql111030 gztechparty-小路-云时代的mysql
111030 gztechparty-小路-云时代的mysqlZoom Quiet
 
Java单元测试
Java单元测试Java单元测试
Java单元测试darlingshan
 
Refactoring with Patterns in PHP
Refactoring with Patterns in PHPRefactoring with Patterns in PHP
Refactoring with Patterns in PHPJace Ju
 
Ch09 整合資料庫
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫Justin Lin
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityJustin Lin
 
Codeception test
Codeception testCodeception test
Codeception testChin-Yu Ku
 
Ch07 使用 JSTL
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTLJustin Lin
 
快速了解PostgreSQL
快速了解PostgreSQL快速了解PostgreSQL
快速了解PostgreSQL正中 周
 
網站自動化測試
網站自動化測試網站自動化測試
網站自動化測試Bruce Chen
 
Ch05 Servlet進階API、過濾器與傾聽器
Ch05 Servlet進階API、過濾器與傾聽器Ch05 Servlet進階API、過濾器與傾聽器
Ch05 Servlet進階API、過濾器與傾聽器Justin Lin
 
Kid171 chap03 traditional Chinese Version
Kid171 chap03 traditional Chinese VersionKid171 chap03 traditional Chinese Version
Kid171 chap03 traditional Chinese VersionFrank S.C. Tseng
 

Tendances (14)

CH04:認識物件
CH04:認識物件CH04:認識物件
CH04:認識物件
 
111030 gztechparty-小路-云时代的mysql
111030 gztechparty-小路-云时代的mysql111030 gztechparty-小路-云时代的mysql
111030 gztechparty-小路-云时代的mysql
 
Java单元测试
Java单元测试Java单元测试
Java单元测试
 
中软
中软中软
中软
 
Refactoring with Patterns in PHP
Refactoring with Patterns in PHPRefactoring with Patterns in PHP
Refactoring with Patterns in PHP
 
Lucene实践
Lucene实践Lucene实践
Lucene实践
 
Ch09 整合資料庫
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/Security
 
Codeception test
Codeception testCodeception test
Codeception test
 
Ch07 使用 JSTL
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTL
 
快速了解PostgreSQL
快速了解PostgreSQL快速了解PostgreSQL
快速了解PostgreSQL
 
網站自動化測試
網站自動化測試網站自動化測試
網站自動化測試
 
Ch05 Servlet進階API、過濾器與傾聽器
Ch05 Servlet進階API、過濾器與傾聽器Ch05 Servlet進階API、過濾器與傾聽器
Ch05 Servlet進階API、過濾器與傾聽器
 
Kid171 chap03 traditional Chinese Version
Kid171 chap03 traditional Chinese VersionKid171 chap03 traditional Chinese Version
Kid171 chap03 traditional Chinese Version
 

Similaire à Nhibernate+sqlite測試實戰經驗分享

Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Wade Huang
 
Web testing automation
Web testing automationWeb testing automation
Web testing automationkuozui
 
软件设计原则、模式与应用
软件设计原则、模式与应用软件设计原则、模式与应用
软件设计原则、模式与应用yiditushe
 
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫Justin Lin
 
Java 6中的线程优化真的有效么?
Java 6中的线程优化真的有效么?Java 6中的线程优化真的有效么?
Java 6中的线程优化真的有效么?wensheng wei
 
Top100summit automan x之框架介绍 王超
Top100summit automan x之框架介绍 王超Top100summit automan x之框架介绍 王超
Top100summit automan x之框架介绍 王超drewz lin
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践taobao.com
 
软件工程 第七章
软件工程 第七章软件工程 第七章
软件工程 第七章浒 刘
 
000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲ArBing Xie
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版Jackson Tian
 
Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫
Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫
Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫Justin Lin
 
TDD (Test-driven development, 測試驅動開發) 基本教學
TDD (Test-driven development, 測試驅動開發) 基本教學TDD (Test-driven development, 測試驅動開發) 基本教學
TDD (Test-driven development, 測試驅動開發) 基本教學潘 冠辰
 
单元测试(H2等)和持续集成(Hudson)实战简介
单元测试(H2等)和持续集成(Hudson)实战简介单元测试(H2等)和持续集成(Hudson)实战简介
单元测试(H2等)和持续集成(Hudson)实战简介isxylands
 
Java SE 8 技術手冊第 16 章 - 整合資料庫
Java SE 8 技術手冊第 16 章 - 整合資料庫Java SE 8 技術手冊第 16 章 - 整合資料庫
Java SE 8 技術手冊第 16 章 - 整合資料庫Justin Lin
 
OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发leneli
 
Big Java, Big Data
Big Java, Big DataBig Java, Big Data
Big Java, Big DataKuo-Chun Su
 
+++º+ ¦¦ ¦ ¦¦ ¦+ =
+++º+ ¦¦  ¦ ¦¦ ¦+ =+++º+ ¦¦  ¦ ¦¦ ¦+ =
+++º+ ¦¦ ¦ ¦¦ ¦+ =guesta6295f3
 
软件工程 第十一章
软件工程 第十一章软件工程 第十一章
软件工程 第十一章浒 刘
 

Similaire à Nhibernate+sqlite測試實戰經驗分享 (20)

Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有
 
jasmine入门指南
jasmine入门指南jasmine入门指南
jasmine入门指南
 
Web testing automation
Web testing automationWeb testing automation
Web testing automation
 
软件设计原则、模式与应用
软件设计原则、模式与应用软件设计原则、模式与应用
软件设计原则、模式与应用
 
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
 
Java 6中的线程优化真的有效么?
Java 6中的线程优化真的有效么?Java 6中的线程优化真的有效么?
Java 6中的线程优化真的有效么?
 
Top100summit automan x之框架介绍 王超
Top100summit automan x之框架介绍 王超Top100summit automan x之框架介绍 王超
Top100summit automan x之框架介绍 王超
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践
 
软件工程 第七章
软件工程 第七章软件工程 第七章
软件工程 第七章
 
PHPUnit
PHPUnitPHPUnit
PHPUnit
 
000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版
 
Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫
Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫
Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫
 
TDD (Test-driven development, 測試驅動開發) 基本教學
TDD (Test-driven development, 測試驅動開發) 基本教學TDD (Test-driven development, 測試驅動開發) 基本教學
TDD (Test-driven development, 測試驅動開發) 基本教學
 
单元测试(H2等)和持续集成(Hudson)实战简介
单元测试(H2等)和持续集成(Hudson)实战简介单元测试(H2等)和持续集成(Hudson)实战简介
单元测试(H2等)和持续集成(Hudson)实战简介
 
Java SE 8 技術手冊第 16 章 - 整合資料庫
Java SE 8 技術手冊第 16 章 - 整合資料庫Java SE 8 技術手冊第 16 章 - 整合資料庫
Java SE 8 技術手冊第 16 章 - 整合資料庫
 
OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发
 
Big Java, Big Data
Big Java, Big DataBig Java, Big Data
Big Java, Big Data
 
+++º+ ¦¦ ¦ ¦¦ ¦+ =
+++º+ ¦¦  ¦ ¦¦ ¦+ =+++º+ ¦¦  ¦ ¦¦ ¦+ =
+++º+ ¦¦ ¦ ¦¦ ¦+ =
 
软件工程 第十一章
软件工程 第十一章软件工程 第十一章
软件工程 第十一章
 

Plus de Wade Huang

Introducing taiwan
Introducing taiwanIntroducing taiwan
Introducing taiwanWade Huang
 
跟著Wade學習ASP.NET MVC + NHibernate - Day 9
跟著Wade學習ASP.NET MVC + NHibernate - Day 9跟著Wade學習ASP.NET MVC + NHibernate - Day 9
跟著Wade學習ASP.NET MVC + NHibernate - Day 9Wade Huang
 
跟著Wade學習ASP.NET MVC + NHibernate - Day 12
跟著Wade學習ASP.NET MVC + NHibernate - Day 12跟著Wade學習ASP.NET MVC + NHibernate - Day 12
跟著Wade學習ASP.NET MVC + NHibernate - Day 12Wade Huang
 
跟著Wade學習ASP.NET MVC + NHibernate - Day 11
跟著Wade學習ASP.NET MVC + NHibernate - Day 11跟著Wade學習ASP.NET MVC + NHibernate - Day 11
跟著Wade學習ASP.NET MVC + NHibernate - Day 11Wade Huang
 
跟著Wade學習ASP.NET MVC + NHibernate - Day 7
跟著Wade學習ASP.NET MVC + NHibernate - Day 7跟著Wade學習ASP.NET MVC + NHibernate - Day 7
跟著Wade學習ASP.NET MVC + NHibernate - Day 7Wade Huang
 
跟著Wade學習ASP.NET MVC + NHibernate - Day 6
跟著Wade學習ASP.NET MVC + NHibernate - Day 6跟著Wade學習ASP.NET MVC + NHibernate - Day 6
跟著Wade學習ASP.NET MVC + NHibernate - Day 6Wade Huang
 
跟著Wade學習ASP.NET MVC + NHibernate - Day 5
 跟著Wade學習ASP.NET MVC + NHibernate - Day 5 跟著Wade學習ASP.NET MVC + NHibernate - Day 5
跟著Wade學習ASP.NET MVC + NHibernate - Day 5Wade Huang
 
跟著Wade學習ASP.NET MVC + NHibernate - Day 4
跟著Wade學習ASP.NET MVC + NHibernate - Day 4跟著Wade學習ASP.NET MVC + NHibernate - Day 4
跟著Wade學習ASP.NET MVC + NHibernate - Day 4Wade Huang
 
跟著Wade學習ASP.NET MVC + NHibernate - Day 3
跟著Wade學習ASP.NET MVC + NHibernate - Day 3跟著Wade學習ASP.NET MVC + NHibernate - Day 3
跟著Wade學習ASP.NET MVC + NHibernate - Day 3Wade Huang
 

Plus de Wade Huang (9)

Introducing taiwan
Introducing taiwanIntroducing taiwan
Introducing taiwan
 
跟著Wade學習ASP.NET MVC + NHibernate - Day 9
跟著Wade學習ASP.NET MVC + NHibernate - Day 9跟著Wade學習ASP.NET MVC + NHibernate - Day 9
跟著Wade學習ASP.NET MVC + NHibernate - Day 9
 
跟著Wade學習ASP.NET MVC + NHibernate - Day 12
跟著Wade學習ASP.NET MVC + NHibernate - Day 12跟著Wade學習ASP.NET MVC + NHibernate - Day 12
跟著Wade學習ASP.NET MVC + NHibernate - Day 12
 
跟著Wade學習ASP.NET MVC + NHibernate - Day 11
跟著Wade學習ASP.NET MVC + NHibernate - Day 11跟著Wade學習ASP.NET MVC + NHibernate - Day 11
跟著Wade學習ASP.NET MVC + NHibernate - Day 11
 
跟著Wade學習ASP.NET MVC + NHibernate - Day 7
跟著Wade學習ASP.NET MVC + NHibernate - Day 7跟著Wade學習ASP.NET MVC + NHibernate - Day 7
跟著Wade學習ASP.NET MVC + NHibernate - Day 7
 
跟著Wade學習ASP.NET MVC + NHibernate - Day 6
跟著Wade學習ASP.NET MVC + NHibernate - Day 6跟著Wade學習ASP.NET MVC + NHibernate - Day 6
跟著Wade學習ASP.NET MVC + NHibernate - Day 6
 
跟著Wade學習ASP.NET MVC + NHibernate - Day 5
 跟著Wade學習ASP.NET MVC + NHibernate - Day 5 跟著Wade學習ASP.NET MVC + NHibernate - Day 5
跟著Wade學習ASP.NET MVC + NHibernate - Day 5
 
跟著Wade學習ASP.NET MVC + NHibernate - Day 4
跟著Wade學習ASP.NET MVC + NHibernate - Day 4跟著Wade學習ASP.NET MVC + NHibernate - Day 4
跟著Wade學習ASP.NET MVC + NHibernate - Day 4
 
跟著Wade學習ASP.NET MVC + NHibernate - Day 3
跟著Wade學習ASP.NET MVC + NHibernate - Day 3跟著Wade學習ASP.NET MVC + NHibernate - Day 3
跟著Wade學習ASP.NET MVC + NHibernate - Day 3
 

Nhibernate+sqlite測試實戰經驗分享

  • 2. 個人介紹  Wade 黃偉榮  2011 C# MVP  TW MVC 創辦人之一  [點部落]黃偉榮的學習筆記 www.dotblogs.com.tw/wadehuang36/ 2
  • 3. 大綱  簡單介紹單元測試  單元測試困難的地方,與操作經驗  NHibernate+Sqlite幫我決解那些問題 3
  • 4. 單元測試?  什麼是單元測試?  驗證程式的行為與期望是一致  為什麼要寫單元測試?  保證自己寫的程式沒有問題  回歸測試?  原有功能在修改後是否保持完整  單元測試無法測試出?  UI  商業邏輯  整體效能等等 4
  • 5. 單元測試困難的地方?  程式的耦合度不能太高  每一個Method處理的事務不能太大  測試資料的準備 • 考試成績計算 • 購物車折扣計算 • 排行計算 5
  • 6. 曾經嘗試過那些方法  解耦合到受測Method資料來源完全使用參數傳遞  自己寫DAO 使用DataSet  使用測試資料庫,建snapshot  使用Entity Framework時使用Mock DataContext  使用NHibernate+Sqlite 6
  • 9. 自己寫DAO 呈現層 邏輯層 資料存取層 DB 9
  • 10. 自己寫DAO 資料存取層 DB 資料存取層 呈現層 邏輯層 DataSet (For 測試) 使用IoC切換 10
  • 13. Entity Framework Mock Context 黃偉榮的學習筆記:使用ContextMock以不連結資料庫的方式做單元測試 13
  • 14. 使用測試資料庫,建snapshot CREATE DATABASE TestExamDb__SS_1 ON ( ) AS SNAPSHOT OF TestExamDb; RESTORE DATABASE TestExamDb FROM DATABASE_SNAPSHOT = ‘ExamDb_SS_1‘; 有一個很大的缺點,測試Method多,很容易因 為Lock而失敗。 14
  • 15. Code First  ORM的Model有幾種設計方式  Database First  Model First  Code First ○ Entity Framework 4.1 + ○ NHibernate 3.2 +  Model/Code First都有一個特性,一開始都 沒有Database, Database是動態產生的, 所以可以每一次測試都產生新增Database與 新增測試資料。 15
  • 16. 用NHibernate+Sqlite的好處  NHibernate的特色  支援的DB多  Map彈性大  Event  Cache  Log  HQL與SQL支援  Sqlite的特色  對測試的便利性 16
  • 17. 二種策略  產生很多*.db檔,執行時複製檔案  適合資料量大  缺點:Schema或測試資料異動時很麻煩 NhibernateTestHelper.Copy(fileName)  使用Create Schema與初始化資料  Schema或測試資料異動時較方便  缺點:資料量大時測試時間會加長 NhibernateTestHelper.CreateSchema(iniClass[]) 17
  • 18. 使用的單元測試工具 • Microsoft Visual Studio Unit Testing 18
  • 19. 單元測試的一些小技巧  Moles - Isolation framework for .NET  亂數  日期  Mock  Moq  寄Email(Call INotifyService)  訂單執行刷卡服務 (IOrderService Call ICreditService) 19
  • 20. 20
  • 21. 21