C# 단위 테스트에서 주어진 공유 리소스 (예 : 데이터베이스)에 액세스하는 약 100 명의 사용자를 시뮬레이션/스트레스 테스트 할 수 있습니까?C# 스트레스 테스트 - 주어진 공유 리소스에 대한 다중 액세스 시뮬레이션
4
A
답변
4
단위 테스트를 통해 유용한로드 테스트를 수행 할 수 없습니다. 부하 테스트는 완전히 다른 목표를 가진 별도의 활동입니다. 단위 테스트는 코드가 사양에 맞게 기능 함을 증명해야합니다. 부하 테스트는 병목 현상을 찾아서 해결할 수있는 방법입니다.
-1
무료 유틸리티 인 WCAT http://www.iis.net/downloads/community/2007/05/wcat-63-(x86)으로 성능 및로드 테스트를 수행했습니다. 지금은 조금 날짜가 있지만 시작하기 쉽고, 온라인 기사가 많이 있으며 유연한 것처럼 보입니다.
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();
}
}
아,하지만 단원 테스트 프레임 워크를 실행 컨텍스트로 사용할 수 있습니다. – Gutzofter