如何使用xml在MSTest中创建参数化性能测试
本文关键字:创建 参数 性能测试 MSTest 何使用 xml | 更新日期: 2023-09-27 18:01:03
我需要使用MSTest(LoadTests(和Visual Studio 2010生成一些性能测试。我需要对restful服务进行测试并收集度量。
我创建了一个集成测试,请求一个URL(像http://hostname/get/201212
之类的restful或任何ID(。后来,我创建了一个负载测试,并设法执行了数千次集成测试,并调查了响应时间和服务器指标(CPU负载、内存等(
现在我需要执行类似的场景,但每个测试都需要从包含数千个的给定XML中读取不同的ID。这个想法是不缓存任何内容。
到目前为止,我尝试/思考了什么
- "冒泡排序"解决方案是创建数千个测试,每个测试都有一个id。这是不可行的
- 下一种方法是创建一个读取xml的测试,对其进行迭代并发出请求。这种方法的问题是,我将结束一个需要几分钟才能运行的大测试
- 我有一个可能的解决方法,使用[ClassInitialize]从XML加载所有ID,并使用[TestInitialize]在每次测试执行时更改全局变量
我不确定最后一个选择是否是最好的MSTests中是否有任何机制允许我使用从XML读取的不同ID执行LoadTest
我不喜欢回答自己的问题,但我把这个放在这里是为了将来有同样问题的人参考。
为什么其他第三个选项是错误的
第三个选项的问题是,在一个有1000次迭代、ID列表为1000的LoadTest中,LoadTest用第一个ID运行了1000次,而不是1000次,每个ID都有一个ID。我使用了某种nosql探查器来证明这一点。
使用以下解决方案,如果我的Loadtest有1000次迭代,而我的csv列表有1000个ID,则将执行1000个测试,每个测试都有一个ID。如果你的LoadTest有更多的迭代,比如2000,那么在LoadTest 1001中,它将从csv列表的开头重新开始。
我的解决方案
注意:此解决方案使用csv文件。它可以很容易地适应使用另一个不同的DataSource,如xml、excel、SQL server中的表等。
实现这一点的正确选项是创建一个具有DataSource属性的测试。例如,您创建了一个csv文件,其中包含要在测试中使用的ID。我的csv文件示例:
ID
1003002-20121211120000
1004071-20121211120000
您需要在测试中添加DataContext:
private TestContext testContextInstance;
public TestContext TestContext
{
get { return testContextInstance; }
set { testContextInstance = value; }
}
最后,你的测试应该是这样的:
[TestMethod,DeploymentItem("DataOrigin''list.csv"), DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "|DataDirectory|''list.csv", "list#csv", DataAccessMethod.Sequential)]
public void TestScenario_1_DATADRIVEN()
{
// PREPARATION
string ID = TestContext.DataRow["ID"].ToString();
string querystring = CreateQueryWithErrorDebug(ID);
// EXECUTION
string result = RunXCCQuery(querystring);
// ASSERTS
Assert.IsTrue(result.Length > 0);
Assert.IsTrue(result.Contains(ID));
}
DeploymentItem属性复制csv文件DataSource属性读取它并遍历它。
这一行是测试从TestContext中读取的地方。
string ID = TestContext.DataRow["ID"].ToString();
CSV文件中有n个ID将导致测试运行n次,每个ID一个。
我在调查中发现了一些有用的链接:
- MSDN信息
- StackOverflow中的这个问题
- MSDN关于如何访问不同DataSource的说明
"冒泡排序"解决方案是创建数千个测试,每个测试都有一个id。不可行的
完全同意。这是不可能的。
下一种方法是创建一个读取xml的测试,并对其进行迭代并提出请求。这种方法的问题在于,我将结束进行一次需要几分钟时间的大测试。
这种方法不是负载测试。一次只有一个测试发送一个请求。
我认为最好的方法是第三种有一些变化的方法。我解决类似问题的方法是:
- 创建一个类(比如
DataInput
(,为每个测试提供不同的数据 DataInput
正在从scv文件中读取数据,并具有提供我想要的数据的静态方法(例如getNextUserName(- 在
[ClassIntialize]
中,我创建了一个静态DataInput
对象 - 在
[TestInitialize]
中,我通过从DataInput
获取数据来创建对其余服务的实际请求
这样所有的测试都有不同的数据。