2014-01-28 65 views
0

我正在一個長期忽略測試軟件的PHP項目中工作。 業務邏輯充滿了硬編碼的依賴關係,並通過一些手工製作的(Oracle)SQL直接訪問數據庫。如何對業務邏輯和數據訪問代碼進行單元測試

由於複雜的數據庫設置,對(複雜)數據庫夾具的嚴格壓縮以及缺少內存中解決方案,我已經放棄嘗試構建自動化集成測試。

對我來說,它看起來是最好的開始,是測試業務邏輯。因此,我想,我需要重構代碼以從業務邏輯中獲取數據訪問代碼。儘管如此,我還是有一些基本的設計問題:

  1. 什麼是封裝/擺脫這種複雜的SQL的首選方法? 有什麼設計模式有一些好的提示,如何以可配置的方式從數據源獲取數據?注入Propel Active Query對象在某些情況下似乎有所幫助,但在複雜的情況下,他們很難模擬我的猜測。
  2. 有沒有很好的本書關於軟件架構+單元測試需要大量使用他們的數據庫的應用程序?

回答

1

要回答你的第二個問題:Working Effectively with Legacy Code是你需要的東西:它介紹了幾種模式,打破依賴關係,以一個代碼測試。

關於你的第一個問題:這取決於你目前的情況。以下是深入書中所描述的幾個例子:

例1 - 提取和覆蓋呼叫

如果你有一個像(例如CLASSE不是在PHP,但你會得到的想法)

class MyClass { 
    int getNbEligibleItems(){ 
     List<Item> rawItems = readInDb(); 
     //Now count elegible ones 
    } 

    List<Item> readInDb(){ 
     //Directly call DB and return a raw list 
    } 
} 

然後,你可以做readInDb虛擬的,並使用一個測試模擬:

class TestableMyClass : MyClass { 
    override List<Item> readInDb(){ 
     //Return a list of hard code test items 
    } 
} 

例2 - 參數化的構造

如果你有這樣的

class MyClass { 
    private IDbReader _reader; 

    MyClass(){ 
     _reader = new DbReader(); 
    } 

    int work(){ 
     List<item> items = _reader.read(); 
     //Work with items 
    } 
} 

類然後將有可能改變構造函數

MyClass() : this(new DbReader()){ } 

    MyClass(IDbReader reader){ 
     _reader = reader; 
    } 

因此,這將有可能嘲笑分貝測試

所以,簡而言之:有很多技術可以幫助你的情況。我們需要一些代碼才能更具體。我建議讀這本書,因爲它提供了很多答案。

+0

只是爲了清楚起見,上面的代碼示例是用Java編寫的,而不是PHP。它在PHP中的工作方式與語法略有不同。 – bdsl

相關問題