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

Posted

技术标签:

【中文标题】C# 压力测试 - 模拟对给定共享资源的多次访问【英文标题】:C# Stress Test - Simulate multiple access to a given shared resource 【发布时间】:2011-02-10 04:53:09 【问题描述】:

如何在 c# 单元测试中模拟/压力测试大约 100 个访问给定共享资源(例如数据库)的用户?

【问题讨论】:

【参考方案1】:

假设您正在访问真正的数据库,那么您就在集成测试的范围内。最简单的方法是从多个线程访问资源。例如:

[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() 的逻辑(例如)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();
    

【讨论】:

【参考方案2】:

您根本无法通过单元测试对任何内容进行有用的负载测试。负载测试是一项具有完全不同目标的单独活动。您的单元测试应证明代码功能符合规范。负载测试是为了找到瓶颈,以便您解决它们。

【讨论】:

啊,但是您可以使用您的单元测试框架作为您的运行上下文。【参考方案3】:

我使用名为 WCAT http://www.iis.net/downloads/community/2007/05/wcat-63-(x86) 的免费实用程序完成了性能和负载测试。它现在有点过时了,但是很容易上手,网上有很多关于它的文章,而且看起来很灵活。

【讨论】:

以上是关于C# 压力测试 - 模拟对给定共享资源的多次访问的主要内容,如果未能解决你的问题,请参考以下文章

分布式压测概念

网站服务器如何做访问压力测试?

使用webbench工具测试网站访问压力

Jmeter做压力测试的心得

测试网站的高并发量访问压力

Jmeter接口压测快速入门