【问题标题】:Testing CouchDB views, filters, lists, shows etc测试 CouchDB 视图、过滤器、列表、显示等
【发布时间】:2012-06-22 16:44:30
【问题描述】:

有哪些测试框架可用于测试视图以及我的 CouchDB 的 mapreduce 函数、过滤器、列表、显示等?

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

我在 writing a test suite for the CouchDB API 上找到了一篇博文,但它是 2010 年的,我想知道从那以后发生了什么。

【问题讨论】:

    标签: testing couchdb


    【解决方案1】:

    我会为 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) {
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      • 2017-06-26
      • 2015-09-09
      • 1970-01-01
      • 2013-01-17
      相关资源
      最近更新 更多