进入到项目开发的后期,测试变得尤为重要。模拟用户使用场景,根据测试用例建立自动化测试就成为了下一个开发目标。
期间也找了不少的测试工具,针对于Web Api比较简单的有PostMan或者嵌入项目中的Web Api Test Client甚至于 Fiddler,但这些都不足以进行连续的测试。一些老牌的测试工具,如loadrunner、QTP等又过于臃肿,且重点在于网站测试,快速掌握又只能以录制为主。既然使用visual studio开发的web api,那么使用visual studio自带的测试项目不是能够更好的融合吗,而且有了编程基础,自动化测试会做得更好。
其实微软提供了丰富的测试框架,从单元测试到顺序测试、性能测试和压力测试,之前之所以排斥不用,还是因为先入为主觉得太复杂,既然单元测试能够满足需求,就没必要再深入研究。
如果测试人员局限于于写测试用例,UI功能测试,那基本上测试生涯也就止步不前。如果测试人员开始着手敲敲代码,就会发现原来测试领域也有很大的一片天地。
以下项目主要实现了对api的自动化测试和压力测试,涉及到参数化、提取规则和验证规则。
微软提供的测试api:http://northwindapi.cloudapp.net
1、建立项目
2、新建web性能测试
3、项目进行配置,停止录制
4、配置请求并测试
4.1、添加上下文参数
Host= http://northwindapi.cloudapp.net
ParaId=0
4.2、修改web请求Url:{{Host}}/api/Seminars,请求修改为Get
运行测试,查看结果
5、请求参数的修改
方法1:添加QueryString
测试结果,将只返回SeminarId为1的数据
方法2:使用全局上下文参数
方法3:添加WebTestRequestPlugin,使用代码改变请求参数,使用Plugin改变参数可以实现参数的计算
public class QSPlugin : WebTestRequestPlugin
{
public override void PostRequest(object sender, PostRequestEventArgs e)
{
}
public override void PreRequest(object sender, PreRequestEventArgs e)
{
// 在QueryString中加入参数
e.Request.QueryStringParameters.Add("id", "1");
}
}
添加请求插件,选择QSPlugin
方法4:添加WebTestPlugin,建立ContextPlugin,全局插件用于对于所有请求的公共参数如sign,timespan,appkey等的情况。
添加全局插件
[Description("全局")]
public class ContextPlugin : WebTestPlugin
{
private bool m_parseDependents = true;
public override void PreWebTest(object sender, PreWebTestEventArgs e)
{
// TODO: Add code to execute before the test.
}
public override void PostWebTest(object sender, PostWebTestEventArgs e)
{
// TODO: Add code to execute after the test.
}
public override void PreRequest(object sender, PreRequestEventArgs e)
{
// e.Request.Url = e.Request.Url + "/growing/test/123";
// 在QueryString中加入参数
e.Request.QueryStringParameters.Add("id", "1");
}
// Properties for the plugin.
[DefaultValue(true)]
[Description("All requests will have their ParseDependentsRequests property set to this value")]
public bool ParseDependents
{
get
{
return m_parseDependents;
}
set
{
m_parseDependents = value;
}
}
}
方法5:使用上一个测试的返回值作为参数,由于提取规则的实现,就可以实现完全模拟客户端访问api的情况,这也是实现自动化测试的根本。比如登录后,自动捕获UserId,方便以后的测试使用UserId。
下面的示例流程为,首先从Seminars中获取列表,取第一个列表的SeminarId作为下一个测试的Id;
建立自定义的JSON提取规则JsonExtractionRule.cs,根据JSON的键名提取对应的值。
[DisplayName("Extract JSON rule")]
[Description("Custom extraction rule for extracting values from JSON web response generated by web performance test")]
public class JsonExtractionRule : ExtractionRule
{
public String Token { get; set; }
public override void Extract(object sender, ExtractionEventArgs e)
{
var jsonString = e.Response.BodyString;
var list = Newtonsoft.Json.JsonConvert.DeserializeObject>(jsonString);
var json = list.First();
JToken jToken = null;
if (json == null)
{
e.Success = false;
e.Message = "Response received not in JSON format";
}
else
{
jToken = json.SelectToken(Token);
if (jToken == null)
{
e.Success = false;
e.Message = String.Format("{0} : Not found", Token);
}
else
{
e.Success = true;
e.WebTest.Context.Add(this.ContextParameterName, jToken);
}
}
}
}
}
在第二个测试中,使用定义到的“DynamicId”值作为参数
6、自定义验证规则的实现
新建自定义验证规则ValidateRules;
我们验证返回的数组数量为4则为通过;
[DisplayName("Result count validation rule")]
[Description("This rule checks to see the REST API returns number of items requested")]
public class ValidateResultCode : ValidationRule
{
public override void Validate(object sender, ValidationEventArgs e)
{
var jsonString = e.Response.BodyString;
var list = Newtonsoft.Json.JsonConvert.DeserializeObject>(jsonString);
if (list.Count == 3)
{
e.IsValid = true;
}
else
{
e.IsValid = false;
}
}
}
7、根据webtest建立负载测试
具体参数没有深入研究,选择以上建立的测试,完成,并运行负载测试
8、参考网站
http://developer.51cto.com/art/201006/206971_all.htm
http://www.thisdevmind.com/2014/12/27/using-visual-studio-web-test-for-automating-api-testing/
http://www.cnblogs.com/Binhua-Liu/archive/2012/08/30/2663078.html
https://msdn.microsoft.com/en-us/library/bb514192.aspx
https://blogs.msdn.microsoft.com/densto/2007/03/19/dynamic-querystring-correlation-custom-extraction-rules-and-webtest-plug-in/
http://magustest.com/blog/automationtesting/adding-web-test-verifaction-rule/#more-516
以下为本次示例代码:
http://download.csdn.net/detail/wuwo333/9588351