2010-04-20 51 views

回答

4

你根本無法通過單元測試做任何有用的負載測試。負載測試是一個完全不同目標的單獨活動。您的單元測試應證明代碼符合規範。負載測試是爲了尋找瓶頸,這樣你就可以解決這些問題。

+0

啊,但是你可以使用你的單元測試框架來充當你的運行環境。 – Gutzofter 2010-04-20 18:37:45

7

假設你正在訪問真正的數據庫,你正處於集成測試的範圍。最簡單的方法是從多個線程訪問資源。例如:

[Test] 
public void SimpleStressTest() 
{ 
    bool wasExceptionThrown = false; 
    var threads = new Thread[100]; 
    for(int i = 0; i < 100; i++) 
    { 
     threads[i] = 
      new Thread(new ThreadStart((Action)(() => 
      { 
       try 
       {       
        AccessDB(); 
       } 
       catch(Exception) 
       { 
        wasExceptionThrown = true; 
       } 

      }))); 
    } 

    for(int i = 0; i < 100; i++) 
    { 
     threads[i].Start(); 
    }  
    for(int i = 0; i < 100; i++) 
    { 
     threads[i].Join(); 
    } 

    Assert.That(wasExceptionThrown, Is.False); 
} 

此測試不確定,因爲您無法控制線程流。例如,如果要確保可以同時打開100個連接,可以在AccessDB()的邏輯中放置一個掛鉤,這將強制它在關閉與數據庫的連接之前等待。

例如,而不是以前的線程操作:

try 
{       
    AccessDB(sychObject); 
} 
catch(Exception) 
{ 
    wasExceptionThrown = true; 
} 

開始的所有線程後請確保您有100個線程等待的sychObject,然後才釋放並加入線程。通過使CloseConnection()(例如)虛擬的邏輯相同可以實現,並針對繼承類CloseConnection()中的等待編寫測試。例如:

public class DataBase 
{ 
    public void AccessDB() 
    { 
     // Do logic here before closing connection 
     CloseConnection(); 
    } 

    protected virtual void CloseConnection() 
    { 
     // Real Logic to close connection 
    } 
} 

public class FakeDataBase : DataBase 
{ 
    ManualResetEvent sychObject; 

    public FakeDataBase(ManualResetEvent sychObject) 
    { 
     this.sychObject = sychObject; 
    } 

    override protected void CloseConnection() 
    { 
     sychObject.WaitOne(); 
     base.CloseConnection(); 
    } 
}