8

哪些测试框架可用于测试我的 CouchDB 的视图及其map功能reduce、过滤器、列表、显示等?

理想情况下,该框架允许对每个功能进行单元测试,并提供支持以针对 CouchDB 实例上的数据集测试给定的一组视图、过滤器等。

我找到了一篇关于为 CouchDB API 编写测试套件的博客文章,但它是从 2010 年开始的,我想知道从那以后发生了什么。

4

1 回答 1

4

我会为 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) {
}
于 2013-01-04T10:44:09.473 回答