C#压力测试 – 模拟对给定共享资源的多次访问

前端之家收集整理的这篇文章主要介绍了C#压力测试 – 模拟对给定共享资源的多次访问前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如何在c#单元测试中模拟/压力测试大约100个访问给定共享资源(例如数据库)的用户

解决方法

假设您正在访问真正的数据库,那么您正处于集成测试的范围内.最简单的方法是从多个线程访问资源.例如:
[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()(例如)的逻辑设置为virtual并将该测试写入在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();
    }
}
原文链接:https://www.f2er.com/csharp/97094.html

猜你在找的C#相关文章