测试CouchDB视图,过滤器,列表,节目等

时间:2012-06-22 16:44:31

标签: testing couchdb

我可以使用哪些测试框架来测试视图,以及我的CouchDB的mapreduce函数,过滤器,列表,节目等?

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

我在writing a test suite for the CouchDB API发现了一篇博文,但是从2010年开始,我想知道自那以后发生了什么。

1 个答案:

答案 0 :(得分: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) {
}