《测试用例:supertest》

    app.js: 其中有个 fibonacci 接口。fibonacci 的介绍见: 。

    fibonacci 函数的定义为 ,调用函数的路径是 ‘/fib?n=10’,然后这个接口会返回 ‘55’。函数的行为定义如下:

    • 当 n === 0 时,返回 0;n === 1时,返回 1;
    • n > 1 时,返回 fibonacci(n) === fibonacci(n-1) + fibonacci(n-2),如 fibonacci(10) === 55;
    • n 不可大于10,否则抛错,http status 500,因为 Node.js 的计算性能没那么强。
    • n 也不可小于 0,否则抛错,500,因为没意义。

    test/main.test.js: 对 app 的接口进行测试,覆盖以上所有情况。

    1. 学习 supertest 的使用 (https://github.com/tj/supertest )
    2. 复习 mocha,should 的使用

    这是连续第三节课讲测试了..我自己都烦..看着烦的可以考虑跳下一课。

    OK,基础知识前面都讲得很多了,这节课我不会事无巨细地写过程了。

    噢,对了,说到 fibonacci,Node 中文圈的大神 @苏千( ) 写过一个页面,对各种语言的 fibonacci 效率进行了测试:http://fengmk2.cnpmjs.org/blog/2011/fibonacci/nodejs-python-php-ruby-lua.html 。其中,Node 的表现不知道比 Python 和 Ruby 高到哪里去了,与 CPU 谈笑风生。怀疑 js 的人啊,都 too simple,sometimes naive。

    先来介绍一下 supertest。supertest 是 superagent 的孪生库。他的作者叫 tj,这是个在 Node.js 的历史上会永远被记住的名字,因为他一个人撑起了 npm 的半边天。别误会成他是 npm 的开发者,他的贡献是在 Node.js 的方方面面都贡献了非常高质量和口碑的库,比如 mocha 是他的,superagent 是他的,express 是他的,should 也是他的,还有其他很多很多,比如 koa,都是他的。如果你更详细点了解一些 Node 圈内的八卦,一定也会像我一样对 tj 佩服得五体投地。他的 github 首页是: 。

    假使你作为一个有志之士,想要以他为榜样,跟随他前进的步伐,那么我指条明路给你,不收费的:http://tour.golang.org/

    将使你有一个 app: var app = express();,想对它的 get 啊,post 接口啊之类的进行测试,那么只要把它传给 supertest:var request = require('supertest')(app)。之后调用 requset.get('/path') 时,就可以对 app 的 path 路径进行访问了。它的 API 参照 superagent 的来就好了: 。

    我们来新建一个项目

    然后安装我们的依赖(记得去弄清楚 npm i --savenpm i --save-dev 的区别):

    1. "devDependencies": {
    2. "mocha": "^1.21.4",
    3. "should": "^4.0.4",
    4. },
    5. "dependencies": {
    6. "express": "^4.9.6"

    接着,编写 app.js

    好了,启动一下看看。

    1. $ node app.js

    然后访问 http://localhost:3000/fib?n=10,看到 55 就说明启动成功了。再访问 http://localhost:3000/fib?n=111,会看到 n should <= 10

    对了,大家去装个 nodemon https://github.com/remy/nodemon

    $ npm i -g nodemon

    启动我们的应用试试,然后随便改两行代码,就可以看到 nodemon 帮我们重启应用了。

    那么 app 写完了,接着开始测试,测试代码在 test/app.test.js。

    完。

    有两种思路

    1. 在 supertest 中,可以通过 var agent = supertest.agent(app) 获取一个 agent 对象,这个对象的 API 跟直接在 superagent 上调用各种方法是一样的。agent 对象在被多次调用 getpost 之后,可以一路把 cookie 都保存下来。

      1. var supertest = require('supertest');
      2. var app = express();
      3. var agent = supertest.agent(app);
      4. agent.post('login').end(...);
      5. // then ..
      6. agent.post('create_topic').end(...); // 此时的 agent 中有用户登陆后的 cookie

    这里有个相关讨论:

    Nodeclub 里面的测试使用的技术跟前面介绍的是一样的,should mocha supertest 那套,应该是很容易看懂的: