0 为什么要写测试代码

代码写好了,如果能点或者能看,开发人员一般会自己点点或看看,如果没有发现问题就提交测试;更进一步,代码写好后,运行测试代码,通过后提交测试。将流程抽象下:

功能1编码->功能1测试->用户使用功能1

我们假定功能1测试包括:代码测试+人工测试。如果功能1在用户使用之后不做修改,那么代码测试和人工测试都执行了1次;如果功能1迭代了10测,那么代码测试和人工测试都执行了10测,但编写测试代码只有1次。这是我认为需要写测试代码的原因,换言之,如果需求不迭代,原则上是可以不写测试代码的。

1 什么是功能测试

前面提到的测试为:代码测试和人工测试,想着机器能做的事情,人就不要做了。由于人对系统所有的操作,代码都是可以模拟,所以代码测试可以完成绝大多数人的测试。代码测试大致分为:

图片来源

在图片来源的链接地址中很好的介绍了它们分别是什么,从三角形的比例,可以看出功能测试的数量最少,由于功能测试是用户的视角测试测试软件是否满足需求。这里我简单理解下,功能测试基本等同于用户场景测试,如果理解有误欢迎指正。

还需要说明一件事情,为什么不是写单元测试或者集成测试,而是写功能测试代码,其实单元测试和集成测试对于程序的健壮性绝对是大于功能测试的,而且如果有问题可以快速定位。但就项目情况,我选择功能测试,使用几个连续 Http 请求,完成一个功能点测试。

2 hippie

不得不说前端越来越有意思了,我说的主要是 npm 这个东西。hippie 介绍说是轻便的请求封装,用于 api 测试,具有功能强大和可视化特定。

var api = require('hippie');

describe('#test baidu', function () {

    describe('#首页', function () {

        it('get index return 200 ', function (done) {

            api()

                .header("h1", "v1")

                .get('https://www.baidu.com/')

                .expectStatus(200)

                .end(function (err, res, body) {

                    if (err) throw err;

                    done();

                });

        });

    });

});

示例向百度发了一个 Get 请求,带一个 header 头,有一个返回状态码 200 的假定,end()用于请求结束后对于预期或响应的处理。执行结果如下,

Hippie 的优点就是简便、灵活,大致流程是:请求设置,param 参数对象经过 Serializers 方法处理,方式请求,响应内容经过 parsers 方法处理,验证假定,处理结果。Serializers 可以任意设置请求参数格式,parsers 可以将返回的内容转成对象方面后续处理。

3 swagger-hippie

由于 api 仿 REST 风格,所以使用 swagger 生成接口文档(由于我用的 .netcore,所以链接地址可能有点问题)

swagger-hippie 是在 hippie 的基础上,验证发送的请求必须符合 /swagger/v1/swagger.json 文件的定义,也就是说测试是建立在文档的基础上,个人认为这一点对于团队合作是有益处的。

5 功能测试应用

var SwaggerParser = require('swagger-parser')
var parser = new SwaggerParser()
var path = require('path')
var dereferencedSwagger
var app = require('./server') var hippie = require('hippie-swagger')
var baseUrl = 'http://192.168.1.139:6101'
// var swagger = require('./my-dereferenced-swagger-file'); // see example for how to dereference swagger describe('#用户注册登录', function () {
this.timeout(5000) // very large swagger files may take a few seconds to parse before(function (done) {
// if using mocha, dereferencing can be performed prior during initialization via the delay flag:
// https://mochajs.org/#delayed-root-suite
parser.dereference(path.join(__dirname, './api.swagger.json'), function (err, api) {
if (err) return done(err)
dereferencedSwagger = api
done()
})
}) var mobile = '13812341234';
var password = '123456';
var code = '6666';
describe('#注册', function () {
it('1发送手机号验证码', function (done) {
hippie(dereferencedSwagger)
.header("Accept", "text/plain; charset=utf-8")
.parser(function (body, fn) {
fn(null, body);
})
.base(baseUrl)
.url('/api/Mobile/{mobile}')
.method('GET')
.pathParams({
mobile: mobile
})
.expectStatus(200)
.expectBody("手机验证码已发送成功,请注意查收!")
.end(function (err, res, body) {
if (err) throw err;
done();
});
});
it('2校验手机验证码是否正确', function (done) {
hippie(dereferencedSwagger)
.header("Accept", "text/plain; charset=utf-8")
.parser(function (body, fn) {
fn(null, body);
})
.base(baseUrl)
.url('/api/Mobile')
.method('POST')
.send({
mobile: mobile,
code: code
})
.expectStatus(200)
.expectBody("ok")
.end(function (err, res, body) {
if (err) throw err;
done();
});
});
it('3注册-设置密码', function (done) {
hippie(dereferencedSwagger)
.header("Accept", "text/plain; charset=utf-8")
.parser(function (body, fn) {
fn(null, body);
})
.base(baseUrl)
.url('/api/AccountFt')
.method('POST')
.send({
mobile: mobile,
password: password
})
.expectStatus(200)
.expectBody("ok")
.end(function (err, res, body) {
if (err) throw err;
done();
});
});
});
});

测试结果:

上面完成了一个用户注册场景的3个api的调用测试。

需要说明的有两点

(1)hippie 支持服务器接口测试和 http 接口测试,这里的服务接口是指 js 实现 web 服务器。

(2)对于接收是一个接口返回当做下一个接口参数的场景,可以在end()方法中设置。

RESTful api 功能测试的更多相关文章

  1. 使用JMeter进行RESTful API测试

    使用JMeter进行RESTful API测试 在哪里设置实现最优脚本重用的属性 由于支持云的应用程序通常可以轻松.快速地进行复制和部署,所以可以在多种环境中对其进行测试.如果您需要在多个环境中测试和 ...

  2. 虚拟研讨会:如何设计好的RESTful API?

    http://www.infoq.com/cn/articles/how-to-design-a-good-restful-api/ REST架构风格最初由Roy T. Fielding(HTTP/1 ...

  3. 虚拟研讨会:如何设计好的RESTful API(转)

    原文:虚拟研讨会:如何设计好的RESTful API? REST架构风格最初由Roy T. Fielding(HTTP/1.1协议专家组负责人)在其2000年的博士学位论文中提出.HTTP就是该架构风 ...

  4. Swagger简介,轻松构造restful api的文档

    Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件. Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使 ...

  5. 如何设计好的RESTful API 之好的RESTful API 特征

    原文地址:http://blog.csdn.net/ywk253100/article/details/25654021 导读:设计好RESTful API对于软件架构的可扩展性.可伸缩性和消费者的体 ...

  6. (转载) RESTful API 设计指南

    作者: 阮一峰 日期: 2014年5月22日 网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). 因此,必须有一种统一的机制 ...

  7. Node.js实现RESTful api,express or koa?

    文章导读: 一.what's RESTful API 二.Express RESTful API 三.KOA RESTful API 四.express还是koa? 五.参考资料 一.what's R ...

  8. Restful Api 最佳实践

    Web APIs has become an very important topic in the last year. We at M-Way Solutions are working ever ...

  9. 基于轻量型Web服务器Raspkate的RESTful API的实现

    在上一篇文章中,我们已经了解了Raspkate这一轻量型Web服务器,今天,我们再一起了解下如何基于Raspkate实现简单的RESTful API. 模块 首先让我们了解一下"模块&quo ...

随机推荐

  1. 【K8S】K8S部署Metrics-Server服务

    写在前面 在新版的K8S中,系统资源的采集均使用Metrics-Server服务,可以通过Metrics-Server服务采集节点和Pod的内存.磁盘.CPU和网络的使用率等信息. 读者可参考< ...

  2. 51NOD 1006 最长公共子序列 Lcs 动态规划 DP 模板题 板子

    给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最 ...

  3. Java大数据秋招面试题

    以下为整理的自己秋招遇到的面试题:主要是Java和大数据相关题型:根据印象整理了下,有些记不起来了. 死锁.乐观锁.悲观锁synchronized底层原理及膨胀机制ReetrantLock底层原理,源 ...

  4. Fiddler手机端抓包环境设置与过滤(一)

    一.PC端Fiddler设置 1.安装https 证书 打开Fiddler->Tool->Fiddler Options->HTTPS tab,勾选上并Capture HTTPS C ...

  5. 戴尔服务器ipmi报错

    戴尔服务器ipmi配置完成,用浏览器打开报错 查看器已终止,网络已中断 原因:这个问题是java报错,用火狐打开报错 解决方法: 用IE打开就没问题,IE要用较高版本的,楼主的是win10-IE11

  6. 201771010113 李婷华 《面向java对象程序设计(Java)》第四章学习总结

    一. 理论知识部分 第四章 对象与类 本章主要讲述面向对象程序设计.如何创建标准Java类库中的类对象.如何编写自己的类. 1.面向对象程序设计的几个主要概念: 抽象数据类型.类和对象.封装.类层次( ...

  7. 【Flink】使用之前,先简单了解一下Flink吧!

    目录 Flink简单介绍 概述 无边界数据流和有边界数据流 技术栈核心组成 架构体系 重要角色 Flink与Spark架构概念转换 Flink简单介绍 概述    在使用Flink之前,我们需要大概知 ...

  8. python3语法学习第四天--序列

    序列是Python中最基本的数据结构. 序列中的每个元素都分配一个索引从0开始依此类推. Python有6个序列的内置类型,但最常见的是列表和元组. 序列可以的操作:索引,切片,加,乘,检查成员. 此 ...

  9. 浅析微软的网关项目 -- ReverseProxy

    浅析微软的网关项目 ReverseProxy Intro 最近微软新开了一个项目 ReverseProxy ,也叫做 YARP(A Reverse Proxy) 官方介绍如下: YARP is a r ...

  10. java基础一(标识符、数据类型及注释)

    1.标识符 标识符可以由字母.数字(不能以数字开头).下划线(_).美元符($)组成: 标识符不能包含 @.%.空格等其它特殊字符: 标识符区分大小写: 2.数据类型 int->整型->4 ...