Nhibernate+sqlite測試實戰經驗分享

21
黃偉榮 1

Transcript of Nhibernate+sqlite測試實戰經驗分享

黃偉榮

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

呈現層 邏輯層

使用IoC切換

資料存取層 DB

資料存取層(For 測試)

DataSet

10

自己寫DAO 使用DataSet

11

自己寫DAO 使用DataSet

12

使用測試資料庫,建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