单元测试C#中如何在多个线程中重复运行TestMethod

本文关键字:线程 运行 TestMethod 单元测试 | 更新日期: 2023-09-27 18:22:07

我有TestMethod,我需要在不同的N个线程中运行它N次。我想这样做是为了测试我的WebMethod的行为——我可以在一瞬间从不同的线程获得几个请求。

在单元测试C#中,我如何在多个线程中重复运行TestMethod?如何设置TestMethod的调用量?

单元测试C#中如何在多个线程中重复运行TestMethod

IMHO最简单的方法是:

创建一个一次性运行测试的测试方法。

创建一个LoadTest单元测试,并将您的测试方法分配为唯一的测试。

设置要同时运行的测试数。

您可以创建N个任务,启动所有任务,然后等待它们完成。您可以在任务中使用Assert方法,当它们失败时,将抛出AssertionFailedException,并且当使用async/await时,您可以在父线程上轻松捕获该异常。我相信MsTest支持Visual Studio 2012(或2013)中测试方法的async关键字。类似这样的东西:

// no TestMethod attribute here
public Task TestMyWebMethodAsync() 
{
    return Task.Run(() => 
      {
        // add testing code here
        
        Assert.AreEqual(expectedValue, actualValue);
      });                
}
[TestMethod]
public async void ParallelTest() 
{
    try {
        const int TaskCount = 5;
        var tasks = new Task[TaskCount];
        for (int i = 0; i < TaskCount; i++) 
        {
            tasks[i] = TestMyWebMethodAsync();
        }
        
        await Task.WhenAll(tasks);
        
    // handle or rethrow the exceptions
    } catch (AssertionFailedException exc) {
        Assert.Fail("Failed!");
    } catch (Exception genericExc) {
        Assert.Fail("Exception!");
    }
}

如果你有Visual Studio的高级版或终极版,那么你可以通过创建负载测试来简化这一过程:

https://learn.microsoft.com/en-us/previous-versions/azure/devops/test/load-test/run-performance-tests-app-before-release