改善 GitHub 项目代码质量:测试

TDD

虽然接触的TDD时间不算短,然而真正在实践TDD上的时候少之又少。除去怎么教人TDD,就是与人结对编程时的switch,或许是受限于当前的开发流程。

偶然间在开发一个物联网相关的开源项目——Lan的时候,重拾了这个过程。不得不说提到的一点是,在我们的开发流程中测试是由相关功能开发人员写的,有时候测试是一种很具挑战性的工作。久而久之,为自己的开源项目写测试变成一种自然而然的事。有时没有测试,反而变得没有安全感。

一次测试驱动开发

之前正在重写一个物联网的服务端,主要便是结合CoAP、MQTT、HTTP等协议构成一个物联网的云服务。现在,主要的任务是集中于协议与授权。由于,不同协议间的授权是不一样的,最开始的时候我先写了一个http put授权的功能,而在起先的时候是如何测试的呢?

curl--user root:root-X PUT-d'{ "dream": 1 }'-H"Content-Type: application/json"http://localhost:8899/topics/test

我只要顺利在request中看有无req.headers.authorization,我便可以继续往下,接着给个判断。毕竟,我们对HTTP协议还是蛮清楚的。

if(!req.headers.authorization){

res.statusCode=401;

res.setHeader('WWW-Authenticate','Basic realm="Secure Area"');

returnres.end('Unauthorized');

}

可是除了HTTP协议,还有MQTT和CoAP。对于MQTT协议来说,那还算好,毕竟自带授权,如:

mosquitto_pub-u root-P root-h localhost-d-t lettuce-m"Hello, MQTT. This is my first message."

便可以让我们简单地完成这个功能,然而有的协议是没有这样的功能如CoAP协议中是用Option来进行授权的。现在的工具如libcoap只能有如下的简单功能

coap-client-m get coap://127.0.0.1:5683/topics/zero-T

于是,先写了个测试脚本来验证功能。

varcoap=require('coap');

varrequest=coap.request;

varreq=request({hostname:'localhost',port:5683,pathname:'',method:'POST'});

...

req.setHeader("Accept","application/json");

req.setOption('Block2',[newBuffer('phodal'),newBuffer('phodal')]);

...

req.end();

写完测试脚本后发现不对了,这个不应该是测试的代码吗? 于是将其放到了spec中,接着发现了上面的全部功能的实现过程为什么不用TDD实现呢?

说说TDD

测试驱动开发是一个很”古老”的程序开发方法,然而由于国内的开发流程的问题——即开发人员负责功能的测试,导致这么好的一项技术没有在国内推广。

测试驱动开发的主要过程是:

先写功能的测试

实现功能代码

提交代码(commit -> 保证功能正常)

重构功能代码

而对于这样的一个物联网项目来说,我已经有了几个有利的前提:

已经有了原型

框架设计

TDD思考

通常在我的理解下,TDD是可有可无的。既然我知道了我要实现的大部分功能,而且我也知道如何实现。与此同时,对Code Smell也保持着警惕、要保证功能被测试覆盖。那么,总的来说TDD带来的价值并不大。

然而,在当前这种情况下,我知道我想要的功能,但是我并不理解其深层次的功能。我需要花费大量的时候来理解,它为什么是这样的,需要先有一些脚本来知道它是怎么工作的。TDD变显得很有价值,换句话来说,在现有的情况下,TDD对于我们不了解的一些事情,可以驱动出更多的开发。毕竟在我们完成测试脚本之后,我们也会发现这些测试脚本成为了代码的一部分。

在这种理想的情况下,我们为什么不TDD呢?

功能测试

轻量级网站测试TWilltwill was initially designed for testing Web sites, although since then people have also figured out that it’s good for browsing unsuspecting Web sites.

之所以说轻量的原因是他是拿命令行测试的,还有DSL,还有Python。

除此之外,还可以拿它做压力测试,这种压力测试和一般的不一样。可以模拟整个过程,比如同时有多少人登陆你的网站。

不过,它有一个限制是没有JavaScript。

看了一下源码,大概原理就是用requests下载html,接着用lxml解析html,比较有意思的是内嵌了一个DSL。

这是一个Python的库。

pip install twill

Twill 登陆测试

1.启动我们的应用。

2.进入twill shell

twill-sh

-=Welcometo twill!=-

current page:*empty page*

3.打开网页

>>go http://127.0.0.1:5000/login

==>at http://127.0.0.1:5000/login

current page:http://127.0.0.1:5000/login

4.显示表单

>>showforms

Form#1

## ## __Name__________________ __Type___ __ID________ __Value__________________

1csrf_token hidden csrf_token1423387196##5005bdf3496e09b8e2fbf450 ...

2email email emailNone

3password password passwordNone

4login submit(None)登入

current page:http://127.0.0.1:5000/login

5.填充表单

formclear1

fv1email test@tes.com

fv1password test

6.修改action

formaction1http://127.0.0.1:5000/login

7.提交表单

>>submit

Note:submitisusingsubmit button:name="login",value="登入"

current page:http://127.0.0.1:5000/

发现重定向到首页了。

Twill 测试脚本

当然我们也可以用脚本直接来测试login.twill:

go http://127.0.0.1:5000/login

showforms

formclear1

fv1email test@tes.com

fv1password test

formaction1http://127.0.0.1:5000/login

submit

go http://127.0.0.1:5000/logout

运行

twill-sh login.twill

结果

>>EXECUTING FILE login.twill

AT LINE:login.twill:0

==>at http://127.0.0.1:5000/login

AT LINE:login.twill:2

Form#1

## ## __Name__________________ __Type___ __ID________ __Value__________________

1csrf_token hidden csrf_token1423387345##7a000b612fef39aceab5ca54 ...

2email email emailNone

3password password passwordNone

4login submit(None)登入

AT LINE:login.twill:3

AT LINE:login.twill:4

AT LINE:login.twill:5

AT LINE:login.twill:6

Settingactionforform(,)to('http://127.0.0.1:5000/login',)

AT LINE:login.twill:7

Note:submitisusingsubmit button:name="login",value="登入"

AT LINE:login.twill:9

==>at http://127.0.0.1:5000/login

--

1of1files SUCCEEDED.

一个成功的测试诞生了。

Fake Server

实践了一下怎么用sinon去fake server,还没用respondWith,于是写一下。

这里需要用到sinon框架来测试。

当我们fetch的时候,我们就可以返回我们想要fake的结果。

vardata={"id":1,"name":"Rice","type":"Good","price":12,"quantity":1,"description":"Made in China"};

beforeEach(function(){

this.server=sinon.fakeServer.create();

this.rices=newRices();

this.server.respondWith(

"GET",

"http://localhost:8080/all/rice",

[

200,

{"Content-Type":"application/json"},

JSON.stringify(data)

]

);

});

于是在 afterEach 的时候,我们需要恢复这个server。

afterEach(function(){

this.server.restore();

});

接着写一个jasmine测试来测试

describe("Collection Test",function(){

it("should get data from the url",function(){

this.rices.fetch();

this.server.respond();

varresult=JSON.parse(JSON.stringify(this.rices.models[0]));

expect(result["id"])

.toEqual(1);

expect(result["price"])

.toEqual(12);

expect(result)

.toEqual(data);

});

});

github 检查代码质量_07. 改善 GitHub 项目代码质量:测试相关推荐

  1. 统计java代码行数_统计项目代码行数

    今天测试告知需要项目的代码行数,项目怎么也有十万左右的代码行数,想想就想奔溃了, Eclipse一定有这方面的统计,应该也有统计工具,于是上网查了一番,果然找到了. 1.我要查询的文件类型为*.xml ...

  2. 转: 借助GitHub托管你的项目代码

    转自:http://www.cnblogs.com/edisonchou/p/5990875.html 备注: 原贴关于github使用说明,非常详细易懂.建议看原帖. 借助GitHub托管你的项目代 ...

  3. 在linux下载github代码,linux 定时下载github最新代码

    场景:网站的代码在github上托管,静态网站部署在服务器上,每次自己修改完本地代码后,提交到github上,需要自己去服务器上执行git pull 拉取最新代码, 为了解决这种操作,自己再服务器上  ...

  4. 耗时三年,14 万行,50 年前阿波罗 11 号登月的全部代码都能在 GitHub 找到了!...

    本文转自大数据文摘,作者:易琬玉 50 年前的今天,美国宇航员尼尔森·阿姆斯特朗从阿波罗 11 号飞船登月舱走出,在月球表面留下了人类登月的第一个脚印. AR 应用 "JFKmoonshot ...

  5. 耗时三年,14万行,50年前阿波罗11号登月的全部代码都能在GitHub找到了!

    大数据文摘出品 作者:易琬玉 50年前的今天,美国宇航员尼尔森·阿姆斯特朗从阿波罗11号飞船登月舱走出,在月球表面留下了人类登月的第一个脚印. 美国总统肯尼迪1961年就设定了登月目标.阿波罗计划历时 ...

  6. 从0开始学习 GitHub 系列之「01.初识 GitHub」----转载自stormzhang 原创文章

    1. 写在前面 我一直认为 GitHub 是程序员必备技能,程序员应该没有不知道 GitHub 的才对,没想到这两天留言里给我留言最多的就是想让我写关于 GitHub 的教程,说看了不少资料还是一头雾 ...

  7. 如何阅读一份深度学习项目代码?

    犹豫很久要不要把读代码这个事情专门挑出来写成一篇推文.毕竟读代码嘛,大家可能都会读.而且笔者个人读的和写的代码量也并不足以到指导大家读代码的程度.但笔者还是决定大胆地写一点:就当是给自己设立今后读代码 ...

  8. 深度学习项目代码阅读建议

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自|机器学习实验室 犹豫很久要不要把读代码这个事情专门挑出来写 ...

  9. 如何看懂一个深度学习的项目代码

    搞深度学习的人,两大必备日常除了读论文之外就是读代码. 深度学习项目代码,小到几百行的测试demo,大到成千万行的开源项目,读起来方法肯定各有不同. 如下图Mask R-CNN项目代码和PyTorch ...

最新文章

  1. 5软件开发与软件测试
  2. Android JetPack Lifecycle源码解析
  3. 中山网络推广浅谈网站为什么迟迟不收录?该怎么办?
  4. html5+CSS3实现的炫酷超链接特效
  5. linux 操作系统详解,Linux操作系统详解
  6. LDR指令和LDR伪指令区别
  7. Java16-day07【Map(概述、特点、功能、遍历)、HashMap集合练习、集合嵌套、Collections、模拟斗地主升级版】
  8. 红队中易被攻击的一些重点系统漏洞整理
  9. Java剪切板操作大全
  10. std::tostring_枚举:如何正确使用name()和toString()方法
  11. InnoDB undo tablespace使用及原理
  12. 亚洲诚信亮相2018天翼智能生态博览会
  13. AT:配置/禁用PSM模式和设置T3324/T3412
  14. 大众mpv_最便宜的大众MPV来啦!1.4T6AT,空间比宝骏730还宽裕
  15. linux之fstab文件详解
  16. 微信公众号的图片引用
  17. 全国计算机演示文稿,全国计算机统考押题——演示文稿
  18. Jupyter 安装与应用
  19. 非API接口限制介绍
  20. 提升linux对ntfs分区的写入性能

热门文章

  1. 四川省房产测绘实施细则[2010版]-2
  2. 查找、检索 算法-总结5 多路查找树/B~树/B+树
  3. win10 vs2017 引用 “windows.h” 报很多错误
  4. 生活随记-防蚊子咬的办法
  5. 毕业答辩mysql会提问什么_毕业答辩一般会问哪些问题?
  6. 计算机语言学与机器翻译,论计算机语言学之中机器翻译发展现状
  7. 电动助力转向 (EPS )全国产化电子元件推荐方案
  8. qualcomm平台移植MTP驱动程序
  9. 判断是否以元音字母结尾--正则
  10. 99999款PS笔刷合集,简直就是绘画神器(全网最全系列)