AntonyBi

AntonyBi 查看完整档案

深圳编辑哈尔滨工业大学深圳研究生院  |  计算机科学与技术 编辑  |  填写所在公司/组织 passover.blog.51cto.com 编辑
编辑

坚持创业!

个人动态

AntonyBi 赞了文章 · 2018-07-03

去哪儿 http 接口自动化测试实践

背景

越来越多的应用基于前后端分离构建,后端提供数据接口,前端调用接口返回 json 数据渲染到 UI,这个时候保证后端接口数据正确性变的愈来愈重要,接口测试就是来解决这个问题。很多团队,接口测试就是手动运行接口,肉眼比对接口返回的数据,这样的操作流程效率低下,容易出错。使用 YApi 只需要在可视化 GUI 下,配置下每个接口的入参和对 RESPONSE 断言,即可实现对接口的自动化测试,大大提升了接口测试的效率。

准备工作

如果您还未部署 yapi 接口管理平台,可先去示例站点试用。

在创建完项目和接口后,需要进入到测试集页面,导入需要测试的接口。

import-api

基础概念

需要学习的基础概念主要包含测试集、Pre-Script 、Test-Script 三方面。

测试集

在平时的开发过程中,经常遇到的一个问题是每次调试接口都需要重新填写参数,YApi测试集能够保存之前填写的参数,方便下次的调试。每个的请求参数还可以通过前面已请求的接口数据读取,或填写mock随机字符串,通过设置断言脚本验证返回数据的正确性。

case

在测试列表可以看到每个测试用例的 key,还有 开始测试、报告等功能
点击开始测试会按照 case 定义的参数从上往下一个一个进行测试,如果顺序有问题,可以拖动调整
测试完成之后,点击报告查看该次请求的结果

Pre-Script

pre

Pre-Script 包括请求参数处理脚本和响应数据处理脚本两部分。通过自定义 js 脚本方式改变请求的参数和返回的 response 数据。他的使用场景如下:

  • 接口请求参数需要加密及返回 response 解密
  • 接口请求参数需要添加计算 token

请求参数处理脚本示例

以 jquery ajax 为例,假设当前的请求参数是

{
  url: '/api/user?id=1',
  method: 'POST',
  headers: {
    xxx: 'xxx'
  },
  data: {
    type: 1
  }
}

那么公共变量 context 包含以下属性:

context = {
  pathname: '/api/user',
  query: {
    id: 1
  },
  requestHeader: {
    xxx: 'xxx'
  },
  method: 'POST',
  requestBody: {
    type:1
  }
}

假设我们需要在 url 增加一个 token 参数,可以写如下自定义脚本:

返回数据处理脚本示例

在上面的示例请求完成后,假设返回 responseBody={a:1},公共变量 context 包含以下属性:

context = {
  pathname: '/api/user',
  query: {
    id: 1
  },
  requestHeader: {
    xxx: 'xxx'
  },
  method: 'POST',
  requestBody: {
    type:1
  },
  responseData: {
    a:1
  },
  responseHeader: {
    content-type: 'application/json'
    ...
  }
}

假设我们需要修改响应数据 responseBody a 的值为 2,可以填写如下自定义脚本:

Test-Script (测试脚本)

通过自定义脚本断言接口参数或返回 response 数据,在接口用例页面点击 Test 编辑。

支持的公共变量

1.assert
  • assert(value)

    判断 value 是否为 truth, 例如 assert(1) 通过, assert(0) 不通过,只要 value 不是 null, 0, false等值验证通过

  • assert.equal(actual, expected)

    判断 actual 是否等于 expected,例如 assert(1, 1)通过

  • assert.notEqual(actual, expected)

    判断 actual 是否不等于 expected

  • assert.deepEqual(actual, expected)

    假设: actual = {a:1} 是一个对象,即便 expected = {a:1},如果使用 assert.equal 可能也是不相等的,因为在 js 引用的只是对象的一个指针,需要使用 assert.deepEqual 比较两个对象是否相等

  • assert.notDeepEaual(actual, expected)

    深度比较两个对象是否不相等

2.status

http 状态码

3.params

http request params, 合并了 query 和 body

4.body

返回 response body

5.header

返回 response header

6.records

记录的 http 请求信息,假设需要获取 key 为 555 的接口参数或者响应数据,可通过 records[555].params 或 records[555].body 获取

7.log

log(message) 函数,调试时使用,log 信息仅仅在断言失败后打印

示例

assert.equal(body.errcode, 0)
assert.equal(body.data.group_name, 'testGroup')
assert.equal(status, 200)

开始测试

第一步:配置参数

YApi 除了支持常量字符串外,还支持 mock 随机字符串和变量字符串。

Mock参数

Mock 参数每次请求都会生成随机字符串,支持 mockjs 所有占位符

变量参数

YApi 提供了强大的变量参数功能,你可以在测试的时候使用前面接口的 参数返回值 作为 后面接口的参数,即使接口之间存在依赖,也可以轻松 一键测试~

格式:

$.{key}.{params|body}.{path}

例如:现有两个接口,分别是“导航标题”和“文章列表”

文章列表接口需要传参数: 当前标题(id),而这个 id 需要通过 导航标题 的返回值获取,这时应在 文章列表 的参数输入框中根据前者的 key 找到对应 id。

导航标题 的参数和返回值有如下结构:

参数:

返回值:

文章列表 的参数可以如下配置:

其中 $.** 是使用 **动态变量** 的标志,$.269.params 即表示 key 值为 269 用例的请求参数,$.269.body** 即表示 key 值为 269 用例的返回值。

Tips: 上下拖动测试集合的列表项可以调整测试的顺序。

目前yapi中的querybody,headerpathParam的输入参数已经支持点击选择功能。无需自己填写表达式,只需在弹窗中选择需要展示的表达式即可。 输入选项包括常量mock数据,在测试集合中也支持变量选择。
具体用法:单击编辑按钮打开表达式生成器,点击需要的数据创建表达式,这里也可以实时查看表达式结果。

第二步:开始测试

case

后记:

YApi 自动化测试大大简化了接口测试数据准备,和验证环节,目前去哪儿测试团队已经开始使用。未来 YApi 将会持续优化自动化测试功能,希望大家提出大家宝贵的意见。

开源接口管理平台 YApi 官网

Github: YApi github

查看原文

赞 9 收藏 7 评论 0

AntonyBi 赞了回答 · 2016-09-21

JavaScript如何避免拼接html字符串?

1# 模板引擎是一个很好的方案,解决了数据和文档结构的耦合

最简的模板引擎大致是这样的:

function strrep(str,obj){
    return str.replace(/\$\w+\$/gi, function(matchs) {
        var returns = obj[matchs.replace(/\$/g, "")];
        return typeof returns === "undefined" ? "" : returns;
    });
} 
strrep(
    '<img data-original="$thesrc$" class="$theclass$">', {
        "thesrc":"http://s.segmentfault.com/img/logo.png?coiweJ" ,
        "theclass":"fl tc"
    }
)

单纯的模板引擎如:Mustache、Jade、artTemplate、tmpl、kissyTemplate、ejs等等;
前端的有 Model -> View 对应的框架也包含模板引擎,如backbone、avalon、angular等,司徒正美在这个回答里列举了一些MVVM框架,可以了解一下。

2# 文档结构文本不应当在js中以字符串字面量的形式表示

一般而言我们放在HTML中,这带来了一些问题,比如应该放在哪个标签里,如何避免解析和图片自动下载。
目前最好的方案是放在<script type="text/html">或者<script type="text/template">中;
在N年后,也可以把相应的结构放在HTML5定义的新标签<template>中(当它被广泛支持时)。

比如我们用到了jade作为引擎,那么代码大致是这样的:

<script type="text/template" id="theTemplate">
    div.hello
        p#world= introductions
</script>
<script>
    var jade = require('jade') ;
    var template = document.getElementById("theTemplate").innerHTML ;
    var compile = jade.compile(template , options);
    var html = compile({
        introductions: '你好世界'
    });
</script>

3# 注意提防XSS

一般的模板引擎都会默认转义敏感字符,使用之前好好读一下相关的介绍,什么时候不会做转义处理。
如果是自己实现的模板引擎,就需要手动做转义了,一般而言都需要顾及html special chars如<>\/"',以及你自己定义的开始、结束符等。

记住一句话:Play safe.

关注 25 回答 11

AntonyBi 回答了问题 · 2016-06-15

后台管理系统,前端用什么框架开发比较好?

如果是公司使用,而且后台系统较为复杂,推荐dhtmlx

优点:

  1. 整个UI不需要编写HTML和CSS,JS搞定一切,这也意味着后端开发可以直接做,节省人力

  2. 性能超好,加载复杂页面的速度很快,经过测试甩easyUI几条街

  3. 界面比较美观,特别是5.0版本全部用扁平化风格,配色、间距、字体什么调整还有专用工具极其简单

缺点:

  1. 收费(其实也就几千块钱人民币,价格很公道)

  2. 学习成本略高,API文档写的只能算二流

  3. 国内用的很少,基本没中文资料

关注 52 回答 31

AntonyBi 提出了问题 · 2016-04-05

绑定域名的所有图片访问挂了

你们改了什么东西?为什么我早期建立的几个空间全部不能用域名访问了???

你们后台新版界面直接显示的连CDN都没有,而且这两天都一点流量都没有了,这不是开玩笑嘛?!!!
图片描述

速回!!!!

刚才狂刷新了5分钟,突然又可以打开了,怎么那么不稳定???!

关注 7 回答 6

AntonyBi 赞了回答 · 2016-03-08

解决用普通人能听懂的话回答什么是闭包

其实闭包没有那么高深复杂。

仅从规范的角度:

function a() {
    var x = 1, y = 2;
    return function b() {
        console.log(x + y);
    }
}

var f = a();
f();
  1. 在执行a期间,我们可以认为它的局部变量存放在一个内部对象Env里面,a的执行环境保存了对Env的引用。

  2. 在定义b的时候,b也会保存对Env的引用。

  3. a返回时,a的执行环境被销毁,它对Env的引用也就没有了。但是,只要b还可以访问(比如,a通过返回值返回了b)。那么bEnv的引用仍然存在,它仍然可以访问Env中保存的局部变量。

  4. 将来在函数b执行期间,可以通过所谓的作用域链访问到xy

这就是闭包

用图表示就是:

  • 在函数a返回前:

图片描述

  • 在函数a返回后:

图片描述

关注 20 回答 13

AntonyBi 回答了问题 · 2015-09-06

解决如何转义emoji表情,让它可以存入utf8的数据库?

给一个标准的解决方案:

  1. mysql的版本必须为v5.5.3或更高

  2. 把数据库的编码改成utf8mb4 -- UTF-8 Unicode

  3. 然后需要存储emoji表情的字段选择utf8mb4_general_ci

  4. 数据库连接也需要改为utf8mb4

设置完成后,应该可以看到如下类似字符集设置结果。那么可以直接的存入数据库,无需做任何额外的事情了。

mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';  
+--------------------------+--------------------+  
| Variable_name            | Value              |  
+--------------------------+--------------------+  
| character_set_client     | utf8mb4            |  
| character_set_connection | utf8mb4            |  
| character_set_database   | utf8mb4            |  
| character_set_filesystem | binary             |  
| character_set_results    | utf8mb4            |  
| character_set_server     | utf8mb4            |  
| character_set_system     | utf8               |  
| collation_connection     | utf8mb4_unicode_ci |  
| collation_database       | utf8mb4_unicode_ci |  
| collation_server         | utf8mb4_unicode_ci |  
+--------------------------+--------------------+  
 rows in set (0.00 sec) 

关注 55 回答 15

AntonyBi 赞了回答 · 2015-08-18

解决linux环境开发,选什么系统?

如果不想折腾,那么Ubuntu确实是个不错的选择

如果想折腾,那么ArchLinux或者Gentoo,给你相当大的自由度和掌控权
官方的wiki都维护的还不错,可以让你从零开始学习怎么配置

如果发现自己其实离不开例如QQ这类东西,并且对于商业软件也有需求(举个最简单的例子如Office,Adobe家族),那么上Mac OSX吧,完整的BSD环境 + 不错的GUI

关注 41 回答 36

AntonyBi 回答了问题 · 2015-08-13

解决请问应聘JAVA程序员看什么样的面试书比较好(有在看Thinking in Java)?

xx宝典的书就算了吧,都是中国人写出来的东西,非常反感。

Java书籍最经典的自然还是《Thinking in Java》,因为讲的知识面够深够细,没有一定的积累很难完全领会。
此外还是多去看看JVM相关的书籍,会提高你对底层的理解。
有时间,一定要仔细学习Spring的相关知识,开发中最为基础也是最为重要的框架,我发现很多人都是一知半解。

做Java开发,设计模式是必须要非常熟知的,由于Java语言自身的设计限制,很多时候只能用一些其他的手段来提升代码的灵活性。

关注 11 回答 8

AntonyBi 赞了回答 · 2015-08-10

解决 MySQL 半同步复制的概念中,「半」是什么含义

同步复制要求所有的slave确认提交了事务之后master才返回。
异步复制master不管slave直接返回,slave自己有空的时候来复制。
半同步复制master只要有至少一个slave确认提交了事务之后就返回。如果过了timeout也会fallback到异步模式。

mysql 5.5中的半同步复制

关注 5 回答 2

AntonyBi 赞了回答 · 2015-08-10

在python中如何简单优雅地将list分组

直接上代码:

pythona=[1,2,3,4,5,6,7,8,9,10]
for i in range(0,len(a),3):
    b=a[i:i+3]
    print b

如果喜欢简洁可以这样:

python[a[i:i+3] for i in xrange(0,len(a),3)]

不知道算不算优雅?

关注 5 回答 3

认证与成就

  • 获得 63 次点赞
  • 获得 16 枚徽章 获得 0 枚金徽章, 获得 5 枚银徽章, 获得 11 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2014-10-28
个人主页被 444 人浏览