2012-06-22 22 views
8

什么测试框架可用于测试视图,它的mapreduce我的CouchDB的函数,过滤器,列表,显示等?测试CouchDB视图,过滤器,列表,显示等

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

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

回答

4

我会用Node.js的Expresso TDD框架。编写Node.js应用程序的开销不会是浪费。

从下载页面安装的Node.js:nodejs.org/download

确保您还可以获得NPM(node.js的软件包管理器)。

使用expresso框架,您可以轻松测试CouchDB中的任何RESTful功能。

下面是一个简单的node.js测试使用CouchDB通信:

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) { 
} 
测试