1. 利用 NUnitLite, 在 App_Code 下寫單元測試

    繼上篇寫了些 543, 說 NUnitLite 可以用來測 Asp.Net 2.0 Web Application 後, 這次來個簡單的範例. 因為我公司主要開發的是 web based application, 因此常常碰到寫好的程式可能會被安裝到好幾個不同 site 的情況, 甚至安裝的人員也不見得是懂 coding 的人.. 因此確認 configuration 是否正確就是很重要的一環. 這個例子就來把 “configuration 是否正確” 這件事, 也當做 unit test 的一部份.

    也許有人會講, 這是環境的測試, 而 unit test 主要是要測程式的最小單元 - function 是否正常, 話是沒錯, config 之類的問題應該用 trace / assert 也許較恰當, 或是整個 system initialization 時就應該自我檢查一番. 這樣沒錯, 不過我的看法較實際一點, 除非你的開發人員很多, 或是你的產品量已經大到值得你這麼做, 否則大部份的專案, 我想這部份都是被呼略掉的一環…

    因此, 既然 NUnit Framework 已經讓測試這麼方便了, 為什麼不順便用這種機制來做些額外的檢查? 好, 不多說, 來看 sample project: NUnitLiteWebSite

    首先, 你寫好的 test fixture, 總要有 test runner 來測試它. Nunit 有 gui / console mode runner, 但是 NUnitLite 沒有, 而且 App_Code 最簡單能執行的方式也只有 asp.net page (其實我實際應用的案例, 連 ASP.NET Hosting 都用上了, 不過這就有點偏離主題了). 所以…

    Step 1. 先建立一個 Web Site Project.. [download]

    Step 2. Reference NUnitLite.dll, 請自行到 NUnitLite 網站下載 source code, 自己 build 吧.

    Step 3. 實作 NUnitLiteTestRunner.aspx 這個網頁, 目標是 browser 開啟這網頁, 就能看到像 NUnitConsole 輸出的結果畫面… (當然醜一點沒關係… ) 主程式很短, 如下…

    public partial class NUnitLiteTestRunner : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            this.Response.ContentType = "text/plain";
            Console.SetOut(this.Response.Output);
    
            ConsoleUI.Main(new string[] {"App_Code"});
        }
    }
    

    應該沒啥需要說明吧? 第一行指定輸出的 content type 是純文字… 第二行把 Console.Output 導向到 Response.Output, 這樣 browser 才收的到輸出內容 第三行, 呼叫 NUnitLite 內建的 console test runner … 第四行, 沒… 沒事做了

    Step 4. 接下來就簡單了, 直接在 App_Code 下把你要的 TestFixture 通通丟進去… 我準備了一個例子, 主要做兩項測試. 一個是確認 session 有啟用, 另一個就是確認 configuration 裡指定的 temp folder 是否存在, 是否真的能夠 create / read / write / delete temp file.

    [TestFixture]
    public class ConfigurationTest
    {
        [Test]
        public void SessionEnableTest()
        {
            //
            // 確認session 是啟用的
            //
            Assert.NotNull(HttpContext.Current.Session);
        }
    
        [Test]
        public void TempFolderAccessTest()
        {
            //
            // 確認設定檔指定的temp folder 存在
            //
            Assert.True(Directory.Exists(ConfigurationManager.AppSettings["temp-folder"]));
    
            string filepath = Path.Combine(ConfigurationManager.AppSettings["temp-folder"], "test.txt");
            string content = "12345";
    
            //
            // 確認可以寫暫存檔
            //
            File.WriteAllText(
                filepath,
                content);
    
            //
            // 確認可讀, 且內容跟寫入的一樣
            //
            Assert.AreEqual(
                File.ReadAllText(filepath),
                content);
    
            //
            // 確認可刪除, 不會有exception
            //
            File.Delete(filepath);
        }
    }
    

    Step 5. Deploy Web, 調整好各項 configuration, 啟用前先點一下 NUnitLiteTestRunner.aspx, 看看結果如何… 但是我的 IE 很怪, 明明 Step 3 的 code 都已經把 content type 都標示為 text/plain 了, 我的 IE 硬要把它當 xml 來開, 然後才唉唉叫說 xml 有問題…. 結果就變這樣:

    NUnitLite Test Result

    如果你剛好也碰到, 就直接按右鍵選 view source 就好…

    2006/10/29 .NET

  2. ASP.NET Tips: Launch ASP.NET Web Sites without IIS / VS2005

    恩, 題目定的很偉大的樣子.. 其實只是個不起眼的小技巧而以.. 以往開發網站程式都要裝 IIS, 到 visual studio 2005 後就有內建的 Develop Web Server 可以用.

    不過還是很麻煩, 比方說我另外一篇文章講到 NUnitLite 在 Web Application 上的應用, 我有提供 sample code, 抓下來後, 你可能會把它放到 iis 做些設定跑看看, 或是直接用 visual studio 2005 開 web site 後按 f5 跑看看… 兩種方式看來都很麻煩, 尤其我用 notebook, 開個 visual studio 2005 要等半天, 不是很有吸引力的 code 我可能就懶的開了, 哈哈..

    2006/10/28 .NET

  3. 泛型 + Singleton Patterns (II)

    上篇因為貼 code , 放一起實在太長了, 只好分兩篇… 吊完胃口, 不囉唆了, 直接看我想出來的解法. 原則還是跟一般的函式庫一樣, 我希望先做出一個 base class, 把 singleton 的實作細節都處理掉, 函式庫的目的是讓使用你 lib 的人會很快樂才對, 因此 base class 可以辛苦點沒關係, 但是絕不能讓用你 code 的人得做苦工…

    好了, 我實做出來的版本, code 如下:

    public class GenericSingletonBase<T>
        where T: GenericSingletonBase<T>,
        new()
    {
        public readonly static T Instance = new T();
    }
    

    2006/10/27 系列文章: 泛型 + Singleton Patterns .NET

  4. 泛型 + Singleton Patterns

    聽起來 singleton 跟 generic 好像搭不上邊, 不過搭配 .net framework 2.0 的 generic 機制, 倒是可以讓 singleton 好做很多… 我先簡單寫一下不使用 generic 時的做法…

    只有單一 class 要實作 singleton 很簡單, 只要寫這樣的 code 就可以:

    2006/10/26 系列文章: 泛型 + Singleton Patterns .NET

  5. Microsoft Windows XP Media Center Edition 2005

    最近裝了台 PC, 灌了 MCE 2005 … 用起來只有一個字… 爽!!!

    最近台灣引進了 TiVo 這套系統, 應該不少人聽過吧? PC + TV card + MCE2005 就是像 TiVo 這樣子的東西, 只不過都是 Microsoft 靠一堆軟體弄的… 不用額外買專用的機器, 也不用像 TiVo 要付月租費…

    用起來如何? 就是用電腦看電視而以, 我沒有接在電視上, 而是直接用 LCD monitor 看, 爽度差了點, 不過我也習慣了, 我們家都是用 monitor 在看電視… 哈哈. 用 MCE 跟一般 TV card 付的軟體看電視, 差別蠻大的… 我列幾個我覺的特別好用的地方:

    2006/09/25 有的沒的