TheServerSide.Net上有一篇不錯的文章,“10 Ways to Make Your Code More Testable”(10種讓你的代碼更具可測性的方法),這10種方法中,有幾項不但是讓代碼更具可測性的方法,也是寫代碼時必需遵循的基本Principla,但也有幾項非常有意思的:
只要可行,就讓方法返回一個值。這樣不但可以讓代碼更加容易被測試,而且也更加容易讓調用者瞭解它的運行狀態。不過作者也說了這個方法並非是“非此即彼”,而是“as much as possible”。
對於牽涉到包含了資料庫的操作,這篇文章提出的解決方案就是很常見的Mock Data Access Object,即在測試時使用一個並非真正去讀寫資料庫的假資料存取對象,來類比真正的DAO的行為。
說到牽涉到資料存取的測試,在單元測試領域這的確是一個容易讓人撓頭的問題。在這裡我鄭重推薦MbUnit這個工具,它內建了兩種最常見的解決這個問題的方法,使我們的日子更輕鬆了。
1、RollBackAttribute,這個特性利用COM+的Transaction,將整個測試方法的操作置於一個事務裡面,來達到自動復原的目的。
[Test]
[RollBack]
public void TestMethod()
Roy Osherove有一篇文章比較詳細的對這種方法進行了描述。
2、完整恢複資料庫,這個方法基於一種很簡單的資料恢複方式:在某個地方(通常是測試開始前或結束後),讓資料庫根據我們提供的Backup檔案自動回復。
[TestFixture]
[SqlRestoreInfo("connectionstring","databasename",@"c:\db.bak")]
public class TestClass
{
[Test]
[RestoreDatabaseFirst]
public void TestMethod()
“SqlRestoreInfo”特性提供了必要的連接字串、資料庫名,和Database Backup檔案資訊,“RestoreDatabaseFirst”特性指明了在執行測試方法前先用備份檔案來恢複資料庫。
最後,介紹一個系列文章,Automating Unit Testing With a Base Class Posts,講解了一個進行“自動化”測試的方法。