51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1472|回复: 2
打印 上一主题 下一主题

Web Api使用VS实现自动化测试

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-3-6 14:16:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
进入到项目开发的后期,测试变得尤为重要。模拟用户使用场景,根据测试用例建立自动化测试就
成为了下一个开发目标。
期间也找了不少的测试工具,针对于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、项目进行配置,停止录制

添加web服务请求;
添加上下文参数,上下文参数类似于公共变量,可以在所有测试中使用,而在测试中,如果要使用到
上下文参数,使用{{参数名}}即可。上下文参数对应的代码为e.WebTest.Context,接下来作动态参
数时会讲到;
添加验证规则,此处添加的验证规则是全局的验证规则,比如访问时间不能超过5s等
添加自定义的web测试插件,web测试插件可以修改全局的访问地址、参数、变量等



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等的情况。
添加全局插件





  1. [Description("全局")]
  2.     public class ContextPlugin : WebTestPlugin
  3.     {
  4.         private bool m_parseDependents = true;

  5.         public override void PreWebTest(object sender, PreWebTestEventArgs e)
  6.         {
  7.             // TODO: Add code to execute before the test.
  8.         }

  9.         public override void PostWebTest(object sender, PostWebTestEventArgs e)
  10.         {
  11.             // TODO: Add code to execute after the test.
  12.         }

  13.         public override void PreRequest(object sender, PreRequestEventArgs e)
  14.         {
  15.             // e.Request.Url = e.Request.Url + "/growing/test/123";
  16.             // 在QueryString中加入参数
  17.             e.Request.QueryStringParameters.Add("id", "1");
  18.         }

  19.         // Properties for the plugin.
  20.         [DefaultValue(true)]
  21.         [Description("All requests will have their ParseDependentsRequests property set to this value")]
  22.         public bool ParseDependents
  23.         {
  24.             get
  25.             {
  26.                 return m_parseDependents;
  27.             }
  28.             set
  29.             {
  30.                 m_parseDependents = value;
  31.             }
  32.         }
  33. }
复制代码
方法5:使用上一个测试的返回值作为参数,由于提取规则的实现,就可以实现完全模拟客户端访
问api的情况,这也是实现自动化测试的根本。比如登录后,自动捕获UserId,方便以后的测试使用UserId。
下面的示例流程为,首先从Seminars中获取列表,取第一个列表的SeminarId作为下一个测试的Id;
建立自定义的JSON提取规则JsonExtractionRule.cs,根据JSON的键名提取对应的值。
  1. [DisplayName("Extract JSON rule")]

  2.     [Description("Custom extraction rule for extracting values from JSON web response generated by web performance test")]

  3.     public class JsonExtractionRule : ExtractionRule
  4.     {

  5.         public String Token { get; set; }

  6.         public override void Extract(object sender, ExtractionEventArgs e)
  7.         {
  8.             var jsonString = e.Response.BodyString;
  9.             var list = Newtonsoft.Json.JsonConvert.DeserializeObject<List<JObject>>(jsonString);
  10.             var json = list.First();
  11.             JToken jToken = null;
  12.             if (json == null)
  13.             {
  14.                 e.Success = false;
  15.                 e.Message = "Response received not in JSON format";
  16.             }

  17.             else
  18.             {
  19.                 jToken = json.SelectToken(Token);
  20.                 if (jToken == null)
  21.                 {
  22.                     e.Success = false;
  23.                     e.Message = String.Format("{0} : Not found", Token);
  24.                 }

  25.                 else
  26.                 {
  27.                     e.Success = true;
  28.                     e.WebTest.Context.Add(this.ContextParameterName, jToken);
  29.                 }
  30.             }
  31.         }
  32.     }
  33. }
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
 楼主| 发表于 2018-3-6 14:19:50 | 只看该作者

在第二个测试中,使用定义到的“DynamicId”值作为参数


6、自定义验证规则的实现
新建自定义验证规则ValidateRules;
我们验证返回的数组数量为4则为通过;

  1. [DisplayName("Result count validation rule")]

  2.     [Description("This rule checks to see the REST API returns number of items requested")]

  3.     public class ValidateResultCode : ValidationRule
  4.     {
  5.         public override void Validate(object sender, ValidationEventArgs e)
  6.         {

  7.             var jsonString = e.Response.BodyString;
  8.             var list = Newtonsoft.Json.JsonConvert.DeserializeObject<List<JObject>>(jsonString);


  9.             if (list.Count == 3)
  10.             {
  11.                 e.IsValid = true;
  12.             }

  13.             else
  14.             {
  15.                 e.IsValid = false;
  16.             }
  17.         }
  18.     }
复制代码

运行测试,结果如下


7、根据webtest建立负载测试


具体参数没有深入研究,选择以上建立的测试,完成,并运行负载测试



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-14 13:27 , Processed in 0.058457 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表