使用Dredd测试您的API( 二 )


我们首先在项目中添加一个钩子文件(在我们的例子中 , 我们可以将它添加到项目根目录并命名为dredd-hooks.js) 。
有两种方法可以让Dredd使用钩子文件 。一种是手动添加命令参数和我们的钩子文件的路径:
> dredd --hookfiles=dredd-hooks.js

 
另一种方法是编辑我们的dredd.yml文件并通过设置hookfiles属性来更新配置 。
dry-run: nullhookfiles: dredd-hooks.jslanguage: nodejssandbox: falseserver: npm run startserver-wait: 3init: falsecustom: {}names: falseonly: []reporter: apiaryoutput: []header: []sorted: falseuser: nullinline-errors: falsedetails: falsemethod: []color: truelevel: infotimestamp: falsesilent: falsepath: []hooks-worker-timeout: 5000hooks-worker-connect-timeout: 1500hooks-worker-connect-retry: 500hooks-worker-after-connect-wait: 100hooks-worker-term-timeout: 5000hooks-worker-term-retry: 500hooks-worker-handler-host: 127.0.0.1hooks-worker-handler-port: 61321config: ./dredd.ymlblueprint: api-description.apibendpoint: 'http://localhost:9000'现在我们有了文件 , 我们可以开始围绕每个事务编写代码 。Dredd在API蓝图描述文件(.apib)中按名称标识事务 。要在测试运行期间列出事务名称 , 可以添加--names命令参数:> dredd --names 。
在我们的示例中 , 我们有一个名为Users> Create User的事务 , 我们将在代码中引用它 。
当我们的API中有很多端点时 , 挂钩尤其重要 , 我们不希望依赖于它们执行的任何特定顺序 。例如 , 如果我们有一个删除用户的端点 , 为了单独测试它(不依赖于首先运行的Create User端点) , 我们必须在执行测试之前创建一个测试用户 。这是钩子文件的样子:
var hooks = require('hooks');var User = require('../dredd-example/server/api/user/user.service');var testStash = { newUserId: null};hooks.before('Users > Delete User', function(transaction) { hooks.log('Executing hook "before" transaction "Users > Delete User"'); User.save({ email: 'user@test.com', password: '12345' }, function(err, newUser) { if (!err) { hooks.log('New user created'); testStash.newUserId = newUser.id; } else { transaction.fail = 'Unable to create new user'; } })});hooks.after('Users > Delete User', function(transaction) { hooks.log('Executing hook "after" transaction "Users > Delete User"'); // In case the actual test failed, we want to clean up the data if (testStash.newUserId != null) { User.delete(testStash.newUserId); }});上面的代码中有几点需要考虑:
我们声明了一个名为testStash的新变量 , 我们用它来保存跨多个测试钩子的新创建用户的ID 。
在before hook中 , 如果我们无法创建用户 , 我们可以通过使用失败消息设置fail属性来手动测试失败 。
在挂钩后 , 我们从存储中获取用户的ID , 并在测试后通过删除用户来清理它 。
设置模拟服务器使用API?? Blueprint格式记录的API时 , 另一个很酷的功能是我们也可以使用相同的文件来启动模拟服务器来托管我们的端点 。这对前端开发人员特别有用 , 因为他们不必等待API完成和部署 。相反 , 他们可以使用.apib文件来启动模拟服务器 , 将客户端应用程序与它集成 , 并确保真正的API也符合相同的规范 。
该工作的工具称为Drakov , 它也可以通过运行以下命令安装为npm包:
> npm install -g drakov安装完成后 , 我们只需键入以下内容即可将Drakov指向我们的API Blueprint文件:
> drakov -f api-description.apib此命令将使用默认参数运行Drakov并显示以下输出:
> drakov -f api-description.apib[INFO] No configuration files found[INFO] Loading configuration from CLI DRAKOV STARTED[LOG] Setup Route: GET / Get Message[LOG] Setup Route: POST /api/users Create User[LOG] Setup Route: GET /api/users/:id Get User Info[LOG] Setup Route: DELETE /api/users/:id Delete User Drakov 1.0.4 Listening on port 3000现在 , 我们可以对模拟的API执行任何HTTP操作 , 并开始获取文档中定义的HTTP响应 。
最后的话今天提供的工具既简单又直接 , 但也非常强大 。它们涵盖了许多任务 , 包括记录API , 测试实现以及运行模拟服务器以方便使用 。
Dredd有很多选项 , 可以配置各种类型的请求 。它还可以与所有主要的CI工具集成 , 以便重复测试 , 为开发人员提供了一个很好的安全网 。


推荐阅读