Son*_*Ali 6 c# unit-testing stress-testing simulate
如何在ac#单元测试中模拟/压力测试约100个用户访问给定的共享资源(例如数据库)?
Eli*_*sha 11
假设您正在访问真正的数据库,那么您正处于集成测试的范围内.最简单的方法是从多个线程访问资源.例如:
[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);
}
Run Code Online (Sandbox Code Playgroud)
由于无法控制线程流,因此该测试不具有确定性.例如,如果要确保可以同时打开100个连接,则可以在逻辑中放置一个钩子,AccessDB()以便在关闭与DB的连接之前强制它等待.
例如,而不是以前的线程操作:
try
{
AccessDB(sychObject);
}
catch(Exception)
{
wasExceptionThrown = true;
}
Run Code Online (Sandbox Code Playgroud)
启动所有线程后,确保有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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8896 次 |
| 最近记录: |