哪些测试框架可用于测试我的 CouchDB 的视图及其map
功能reduce
、过滤器、列表、显示等?
理想情况下,该框架允许对每个功能进行单元测试,并提供支持以针对 CouchDB 实例上的数据集测试给定的一组视图、过滤器等。
我找到了一篇关于为 CouchDB API 编写测试套件的博客文章,但它是从 2010 年开始的,我想知道从那以后发生了什么。
哪些测试框架可用于测试我的 CouchDB 的视图及其map
功能reduce
、过滤器、列表、显示等?
理想情况下,该框架允许对每个功能进行单元测试,并提供支持以针对 CouchDB 实例上的数据集测试给定的一组视图、过滤器等。
我找到了一篇关于为 CouchDB API 编写测试套件的博客文章,但它是从 2010 年开始的,我想知道从那以后发生了什么。
我会为 Node.js 使用Expresso TDD 框架。编写 Node.js 应用程序的开销不会白费。
从下载页面安装 Node.js:nodejs.org/download
确保您还获得了 npm(node.js 包管理器)。
使用 expresso 框架,您可以轻松地测试 CouchDB 中的任何 RESTful 函数。
这是一个与 CouchDB 通信的示例 node.js 测试:
var http = require('http');
var url = require('url');
var log_level = 5;
var base_url = 'http://localhost:5984/';
var delete_db_at_end = false;
/**
* This test fetches all the data from a database and verifies that the data is
* returned as it should.
*/
exports.testCouchDBCartoonsAllDocs = function(beforeExit, assert) {
curl('GET', base_url + 'cartoons/_all_docs', null, function(response) {
assert.equal(7, response.total_rows);
assert.equal('Donald Duck', response.rows[1].id);
});
}
/**
* This test creates a database for this test only and deletes it at the end if the
* global parameter delete_db_at_end is set to true, otherwise it is left as is for
* human inspection.
*
*/
exports.testCreateDatabaseTestAddAndDestroy = function(beforeExit, assert) {
var dbname = 'test_db_cartoon';
deleteExistingDatabase(dbname, assert, function(response) {
/* Create the database */
curl('PUT', base_url + dbname, null, function(response) {
assert.equal(true, response.ok);
curl('PUT', base_url + dbname + '/Donald+Duck', '{"publisher":"Walt Disney"}', function(response){
assert.equal(true, response.ok);
assert.equal('Donald Duck', response.id);
curl('GET', base_url + dbname + '/Donald+Duck', null, function(response) {
assert.equal('Donald Duck', response._id);
assert.equal('Walt Disney', response.publisher);
/* Finally we delete the database from CouchDB */
if (delete_db_at_end) {
deleteExistingDatabase(dbname, assert, function(response) {
assert.equal(true, response.ok);
});
}
});
});
});
});
}
/**
* This is a helper function that deletes the database if it exists so
* that the tests can run even if they where interrupted.
*/
function deleteExistingDatabase(dbname, assert, callback) {
curl('GET', base_url + dbname, null, function(response) {
if (response.db_name === dbname) {
log(1, 'About to delete the database ' + dbname);
curl('DELETE', base_url + '/' + dbname, null, function(response) {
callback(response);
});
} else {
callback(response);
}
});
}
/**
* This is a helper method to manage the RESTful sending to the database
*/
function curl(method, urlString, payload, callback) {
log(1, method + ' ' + urlString);
var auth = 'Basic ' + new Buffer('username:password').toString('base64');
log(7, auth);
var options = url.parse(urlString);
options.method = method;
options.headers = {
'Content-Encoding': 'UTF8',
'Content-Type': 'application/json',
'Authorization' : auth
};
log(7, options);
var req = http.request(options, function (res) {
var data = "";
res.setEncoding('UTF8');
res.on('data', function (chunk) {
data += chunk;
});
res.on('end', function (chunk) {
var response = JSON.parse(data);
log(5, response);
callback(response);
});
});
if (payload) {
req.write(payload);
}
req.end();
}
/**
* This simple logger logs message depending on the log_level set at
* the top of this file.
*/
function log(level, message) {
if (level<=log_level) {
console.log(message);
}
}
在存储此文件的同一文件夹中,执行以下命令:
npm install expresso
通过发出以下命令运行测试:
node_modules/expresso/bin/expresso test.js
这是上面命令的控制台输出:
GET http://localhost:5984/cartoons/_all_docs
GET http://localhost:5984/test_db_cartoon
{ error: 'not_found', reason: 'no_db_file' }
PUT http://localhost:5984/test_db_cartoon
{ total_rows: 7,
offset: 0,
rows:
[ { id: 'Batman', key: 'Batman', value: [Object] },
{ id: 'Donald Duck', key: 'Donald Duck', value: [Object] },
{ id: 'Iron Man', key: 'Iron Man', value: [Object] },
{ id: 'Mickey Mouse', key: 'Mickey Mouse', value: [Object] },
{ id: 'Spider-Man', key: 'Spider-Man', value: [Object] },
{ id: 'Superman', key: 'Superman', value: [Object] },
{ id: '_design/select', key: '_design/select', value: [Object] } ] }
{ ok: true }
PUT http://localhost:5984/test_db_cartoon/Donald+Duck
{ ok: true,
id: 'Donald Duck',
rev: '1-1c431dfb2c46991ec999743830a5363b' }
GET http://localhost:5984/test_db_cartoon/Donald+Duck
{ _id: 'Donald Duck',
_rev: '1-1c431dfb2c46991ec999743830a5363b',
publisher: 'Walt Disney' }
100% 2 tests
您可以轻松地扩展测试
exports.testname = function(beforeExit, assert) {
}