Visual Studio Load测试以模拟数据驱动方式中的许多用户?
题
我正在尝试加载测试Web服务。
我有一个简单的方法,需要2个发出的params发送到Web服务并返回响应,并且我从此方法创建了一个单元测试。
因为我想要 需要要测试各种不同的输入,有效地测试服务,我将CSV设置为一个1000行作为单元测试的数据源。
我可以运行这个单位测试,它将通过所有行旋转,顺序地使用不同的值调用Web服务。
然而,这不是我需要的。我需要每行对应于不同的线程上的不同的用户,使用负载测试配置包括思考时间,旋转载重用户,测试混合配置等。
我可以通过从单元测试和硬编码值删除我的数据源来实现这一点。 ,但这是一个基本缺陷的测试: 以真的测试Web服务,我需要每个用户要发送不同的值并获得不同的结果。
...
所以,如何将数据源挂钩到负载测试,并且具有加载测试启动每个用户的单位测试实例,具有不同的值?
解决方案
我最终使用这个答案作为指南: https://stackoverflow.com/a/7813465/237723
而不是从控制台应用程序方法和负载测试创建单元测试单元测试,我创建了一个简单的ASP.NET Web表单,拍摄了输入并称为Web服务。
我使用这种新表单录制了一个Web性能测试,并创建了一个负载测试来运行该WPTEST。
-
录制测试后,我将CSV添加为该测试的DataSource。
-
有2个'请求'录制:初始获取和后续帖子。 确保您留下它们!我删除了favicon.ico请求,因为它不存在。 (这些预防措施可以避免)
通过扩展POST请求,我修改了与我的2个Web服务输入相对应的TextBox参数的属性,以从CSV中的相应列中获取其值。
我将DataSource Access方法更改为“不自动移动光标”(您必须将DataSource展开到表,并通过右键单击/ F4编辑其属性。)
我然后创建了根据正在运行的UserID(int)手动移动光标的WebTestPlugin(从链接答案)。这将对应于用户实例根据步骤计划对负载测试旋转。创建此类后,构建项目,然后将其添加到您的Web性能测试中。
public class webtestplugin : WebTestPlugin
{
public override void PreWebTest(object sender, PreWebTestEventArgs e)
{
base.PreWebTest(sender, e);
e.WebTest.MoveDataTableCursor("DataSource1", "addresses#csv", e.WebTest.Context.WebTestUserId);
}
}
. 其他提示
只是为了回答你的问题,我很确定这不能从一个mstest和nunit的框中完成(此方法不会粘在此方案中)。
但是,恕我直言,只是不要去那里......从我的经验中,模拟〜1000个用户出来的一台机器将产生坏的结果,因为测试将遇到各种客户端限制 - 线程池问题,外向和传入的交通问题等。我不是说这不能克服,但它扭曲足以考虑不同的方法。
我实际上不建议使用负载测试工具(其中许多包括在内)在这种情况下,因为它简单地写出自己的小工具并跳过配置问题和第3曲线的学习曲线派对。
我所建议的,正在写自己的工具,并从单独的机器运行它。它不必通过测试框架运行(我无法让自己称之为单位测试,因为它不是),控制台应用程序将完成技巧。以下是让您入门的一些代码:
private ConcurrentBag<string> logs = new ConcurrentBag<string>();
public void GetLoad(int numberOfUsers, List<string> myParams)
{
var users = new string[numberOfUsers];
for (int i = 0; i < numberOfUsers; i++)
{
users[i] = string.Format("LoadTest{0}", i + 1);
}
var userThreads = new List<Thread>();
for (int i = 0; i < numberOfUsers; i++)
{
int index = i;
userThreads.Add(new Thread(()=> CallWebService(users[index], myParams[index])));
}
Parallel.ForEach(userThreads, thread=>thread.Start());
foreach (var userThread in userThreads)
{
userThread.Join();
}
var outputFilename = string.Format("LoadTest.{0}Users.txt", numberOfUsers);
File.AppendAllLines(outputFilename, logs);
}
.