軟體技術人員最愛卻也是尾大不掉的萬用 Database Manager 物件

** 本文同步發表於 軟體設計鮮思維FB社群 **

上星期我在教授 TDD.NET 測試驅動開發課程。其中有位學員分享他們公司會計系統的部分程式碼 (沒有機密性議題),想知道這該如何撰寫單元測試 (Unit Test Code)。

我先用 EA (Enterprise Architect) UML 工具掃描程式碼反轉為 類別 (Class) 圖,老天!數百個 Windows Form (每一個 Form 他們稱為 Report) 全連接到一顆共用的 DB Manager,封裝了基本的 CRUD 行為,再存取資料庫。剛掃進來時還真嚇了一跳跳,那個 Form 的連線,有如積體電路般密密麻麻的共同連接到如同就是 CPU 地位的 DB Manager!

2tier universal db manager

這肯定就是典型技術人員的傑作,用許多稀奇古怪的實作方式,讓所有的表單 UI 程式,傳進來 SQL 敘述,然後再去存取資料庫。看似方便簡單,但這顆萬用的 DB Manager 已經被約束了特定的實作技術與特定的資料庫,所以當然無法抽換,原來他們使用 ADO.NET 的連線,現在是不可能換成 Entity Framework;不僅如此,內部程式碼的擁腫肥大,當時的技術人員一離開,幾乎達到無法維護的地步。

閱讀全文 »

整合測試還是單元測試比較有價值?

** 本文同步發表於 軟體設計鮮思維FB社群 **

看到國外某作者的一篇論述:「Lean Testing or Why Unit Tests are Worse than You Think」。這篇文章我瀏覽了兩遍,思考原作者從什麼樣的角度來看待所謂的單元測試 (unit test)。

文內有提,他純粹從經濟 (economic)的觀點來看待測試,然後接著從三項因子:成本 (Cost)、速度 (Speed)、信心 (Confidence)來比較 整合測試 (integration test) 與 單元測試 (unit test)的價值。

他的結論是認為:整合測試相對來得有價值許多。🤔

然後接著他再用 投資報酬率 (ROI, Return on Investment)與 程式覆蓋率 (Code Coverage)來佐證 整合測試 的高投資率。

這就讓我更肯定了,原作者是站在專案經理人 (PM, Project Management)的角度來看待整合測試,PM 最是偏好用指標來衡量投報率與顯性價值等。

問題是,投報率、覆蓋率等這些指標,是極難衡量隱性的因子與其所創造的價值啊! 試想想,該如何衡量軟體產品的彈性度、擴展性與維護性議題呢?

再則,整合測試與單元測試根本是兩種不同的構面與不同角色的人所負責的:

o 整合測試:產品釋出 (release)前涵蓋所有元件的測試,一般由 QA 品管專職人員擔任。

o 單元測試:系統開發期間對必要 (essential)性類別 (如 控制物件、資料存取物件、企業物件等)的測試,這必然由撰寫該類別的開發人員負責撰寫,不得假手他人。

閱讀全文 »

[課程規劃] TDD.NET 測試驅動開發與自動化測試

***
這是在資策會數位教育研究所開設的 TDD.NET 課程 (最近一期於 04/27 開課,4/12前報名即享早鳥優惠)。爾後關於單元性 (以2~3天課程)的課程,我們團隊均是透過該單位開設。

後續關於資策會的軟體設計單元性課程,我們也一併會公佈在 FB 社團:軟體設計鮮思維

***

有別於 TDD for Java 課程,我們把現今很熱門的 Mock 測試機制納入,以引導學員理解如何建立可隔離於外部環境對程式邏輯、資料庫數據等影響。 (但因課程時數限制,TDD.NET 無法談及壓力/效能測試。該範疇仍於 TDD for Java 課程內。)

關於本課程的主要目的:

  • 瞭解TDD的精髓與撰寫原則。
  • 區別幾個主要的測試類型與作法-整合 (含UI)、功能驗收/單元。
  • 釐清開發人員與QA單位各自關於測試的職掌與相關技能。
  • 撰寫高品質的測試案例 (test case)並橋接實作的自動化測試 (automation test)。
  • 使用Mock的技術,隔離測試所造成對環境的影響,讓測試可以更富彈性。
  • 運用開源的開發工具與測試框架 (framework),大幅降低測試的成本與提升軟體的品質。

關於本課程的介紹:

TDD (Test-Driven Development),測試先行的觀念已逐漸被軟體開發單位接受。但如何達成自動化的測試?要測試的是哪一類型程式?如何撰寫測試測試 …等,一般開發人員甚或 QA 單位仍顯模糊。

對於 Developer 而言,利用如 .NET Unit 測試框架,撰寫以類別為單位的功能性與單元性的測試程式,是確保需求功能的正確性。

而為了達成驗收交付的目的,圖形界面操作的自動化測試,在高精確度驗收與大型的專案中仍是需要的。所以在本次課程中,我們也會介紹如何利用 GUI 的測試框架,包括在 Web UI 環境中,來達成 Web表單、輸入數據等自動化操作。

同時課程也整合了從 GUI 的自動化操作到連結後端系統的功能性物件的整合性測試 (integration test),一氣呵成,全部自動化,花一次工即可。

課程內容同時也說明了,對於自動化測試的環境建置,以及如何利用現今通用流行的 Mock,來隔離測試所造成對環境的影響,讓測試可以更靈活可行。

TDD.NET 課程大綱

閱讀全文 »

程式設計的招式對打練習方案-Kata

「The Clean Coder (有中譯版)」一書內所提及的「程式設計柔道場 (Coding Dojo)」的理念很有意思:

「把每一段可用來模擬程式設計問題內的解決過程案例 (case study)稱為 Kata (對打),其最終目標就是在不斷的練習當中以達純熟的直覺反應式寫碼動作。」

每一個 Kata 都必須伴隨著 TDD (Test Driven Development)、亦即測試先行的反覆測試建置。

有個 Uncle Bob (Clean Coder 原作者)提供最經典的範例:「保齡球 (The Bowling Game)」,這個練習約約要 30 分鐘 (我是不太相信這麼短 !^^),在測試階段會經歷衝突,而後在建置階段達到高潮。

我這裡提供下所查詢到的一些討論 Kata 的文章與範例:
o http://katas.softwarecraftsmanship.org/
o http://butunclebob.com/ArticleS.UncleBob.TheBowlingGameKata
o http://www.peterprovost.org/blog/2012/05/02/kata-the-only-way-to-learn-tdd/

爾後個人的實戰案例,例如「烏龜販售系統」,也打算以開源 (open-source)、簡單設計 (simple design)並整理成 Kata 的範例供學員們練習。藉此從其中學習到 Enterprise MVC、Service-Oriented、TDDRe-factoring 等觀念,透過草稿式的設計與直接程式寫碼階段來理解與應用。

[備註] 安裝與整合 xUnit 測試框架@VS2012

開發環境:Visual Studio 2012, Update 1 (必須)。

說明:VS2012 已整合各測試框架的 Test Runner,包括 NUnit, xUnit 等。藉由標準的介面,可讓各類測試框架於 VS2012 內的 Test Explorer 歸納測試方法 (methods),並執行測試、瀏覽測試結果。

xUnit 可說是繼老牌 NUnit 的後起之秀。關於兩者之間的比較,可參考-xuint和其他的單元測試框架的比較。個人尤為欣賞 xUnit 的 DDT (Data Driven Test)的機制-Theory,可參考這一篇-xUnit Theory, the Data Driven Unit Test

xUnit Theory 可讓測試方法具有參數 (parameters),而能接收多個資料來源 (InlineData, PropertyData, ClassData, ExcelData, OleDB/Sql ServerData)的資料輸入,讓測試機制更能充分利用測試數據。一個 Theory 可參考如下的寫法。

 1: [Theory]
 2: [InlineData(1, 2, 3)]
 3: [InlineData(3, 4, 7)]
 4: [InlineData(30, 10, 40)]
 5: public void Add_AddDataValues_ReturnsExpectedResult(int first, int second, int expected)
 6: {
 7:     var actualResult = Calculator.Add(first, second);
 8:  
 9:     Assert.Equal(expected, actualResult);
10: }

安裝:兩個 xUnit 套件是必要安裝的 (全於 VS2012 內安裝)。

  1. xUnit.net runner for Visual Studio 2012 extension
  2. 利用 NuGet 安裝 xUnit.NET。

閱讀全文 »

[單元課程(03/28)] 自動化測試 by C# 實作演練 一日遊

線上報名與詳細課程資訊請至:
http://www.hsdc.com.tw/course/unit-course_automation-test-by-csharp_1day_20100328

 o 日期:2010/03/28 (星期日) AM 9:30 ~ PM 17:00 (共 6.5 小時)
 o 地點:中國生產力中心,台北市承德路二段81號B1(首府經貿大樓)。
     http://www.cpc.tw/Train/Place.aspx
 o 費用:NT$1,800, 含稅。舊生或三人同行: NT$1,500。
 o 同課程可保留再旁聽乙次的權利 (報名時註明舊生旁聽即可)。
 o 下午均附有免費從外特購精緻的咖啡與點心。

§課程說明 --------------------------------------------------------------------

TDD (Test-Driven Development),測試先行的觀念已逐漸被軟體開發單位接受。但如何達成自動化的測試?要測試的是哪一類型程式?如何撰寫測試測試 ...等,可能一般 Developer 仍顯模糊。

HSDc. 團隊將多年來輔導諸多單位,並協助其撰寫測試程式的經驗,整理成範本。利用一天的時間,詳述說明從需求整理、測試案例,到整個測試程式的產出,每一個階段步驟除了有完整的圖文解說與程式碼以外,還設有階段完整的目標,以瞭解該階段實作的目的。

對於 Developer 而言,撰寫功能性物件的測試程式,如利用 NUnit or JUnit 等測試框架,是確保需求功能的正確性。

而對於 End User 而言,因直接面臨的是 GUI 畫面的操作,若有些高精確要求如政府標案等,往往連畫面的操作步驟都不得出錯,而導致開發團隊甚而還要撰寫畫面操作的詳述說明與撰寫數千條以上的圖型測試案例報告,花了相當多的時間卻仍一再需要重複人工的操作,可說是浪費太多不必要的精力與人力了。

為了達成驗收交付的目的,圖形介面操作的自動化測試,在高度要求或大型的專案中仍是需要的。所以,在本次課程中,我們也會介紹如何利用 GUI 的測試框架,在 ASP.NET 的 Web 環境中,以達成自動操作圖形表單、自動輸入數據。

同時,我們也整合了從 GUI 的自動操作到按下按鍵、然後到後端的控制型功能物件 (Control Object),由 NUnit 測試框架自動驗證需求功能的正確性。一氣呵成,全部自動化,花一次工即可。

本次課程是利用 C#.NET,相關的測試框架 (Watin and NUnit)均支援 .NET Framework。但測試的觀念與作法其實都是一樣的,要移轉到 Java 的環境下,也是相當輕而易舉,自然,本課程也是適合 Java 的 Developer 等。

上課學員除了收到本顧問團隊所親自撰寫的教材外,還可以拿到一片自動安裝的光碟,內含了教材電子文檔(PDF)、測試環境建置所有需要的應用軟件(全為免費)、案例分析的原始程式碼與測試程式碼等。以及涵蓋了 HSDc. 歷屆研討會簡報資料。

上課過程中,更是歡迎學員自行帶平日工作所碰過的案例問題與疑問,講師群均非常樂意協助解決(不怕被考倒,只怕不問),亦可以當成課堂上的討論案例。

對了,每一天的課程,我們均有免費提供下午茶點,包括小蜜蜂咖啡、茶飲、美味的吊鐘燒與餅乾甜點等。品味咖啡的同時,學習軟體設計思維,那會是一件令人相當愉悅的快樂學習之旅。

閱讀全文 »

軟體思維顧問

專職軟體輔導與教育訓練的獨立顧問。輔導企業資訊單位如何有效組織系統開發與維護;輔導開發人員達成有效的專業分工。傳授如何把軟體作軟 (Keeping Software Soft)的技能,得以提昇系統的彈性/延展,並進而創造系統的再利用價值。

Personal