2010-04-20 7 views

답변

4

단위 테스트를 통해 유용한로드 테스트를 수행 할 수 없습니다. 부하 테스트는 완전히 다른 목표를 가진 별도의 활동입니다. 단위 테스트는 코드가 사양에 맞게 기능 함을 증명해야합니다. 부하 테스트는 병목 현상을 찾아서 해결할 수있는 방법입니다.

+0

아,하지만 단원 테스트 프레임 워크를 실행 컨텍스트로 사용할 수 있습니다. – Gutzofter

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()의 논리에 후크를 배치하면 DB 연결을 종료하기 전에 대기하게됩니다. 대신 이전 스레드 행동의 예를 들어

:

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

모든 스레드를 시작한 후 당신이 sychObject에서 대기 100 개 스레드를 만 다음을 해제하고 스레드에 가입해야합니다. 로직을 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(); 
    } 
}