2012-06-22 34 views
8

Các khung kiểm tra nào có sẵn để kiểm tra chế độ xem và chức năng mapreduce, bộ lọc, danh sách, chương trình ... của CouchDB của tôi?Thử nghiệm chế độ xem CouchDB, bộ lọc, danh sách, hiển thị, vv

Lý tưởng nhất là khuôn khổ cho phép đơn vị kiểm tra từng chức năng, cũng như cung cấp hỗ trợ để kiểm tra một tập hợp các lượt xem, bộ lọc, vv đối với tập dữ liệu trên một cá thể CouchDB.

Tôi đã tìm thấy bài đăng trên blog trên writing a test suite for the CouchDB API nhưng từ năm 2010 và tôi đã tự hỏi điều gì đã xảy ra kể từ đó.

Trả lời

4

Tôi sẽ sử dụng khung công tác TDD Expresso cho Node.js. Chi phí của việc viết một ứng dụng Node.js sẽ không phải là một nỗ lực lãng phí.

Cài đặt Node.js từ trang tải: nodejs.org/download

Hãy chắc chắn rằng bạn cũng nhận được (Node.js quản lý gói) NPM.

Với khung công tác biểu thức, bạn có thể dễ dàng kiểm tra bất kỳ chức năng RESTful nào trong CouchDB.

Đây là thử nghiệm một mẫu Node.js rằng giao tiếp với 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); 
    } 
} 

Trong thư mục giống như bạn đã tập tin này được lưu trữ thực hiện lệnh này:

npm install expresso 

Chạy thử nghiệm bằng cách phát hành lệnh này:

node_modules/expresso/bin/expresso test.js 

Đây là đầu ra bàn điều khiển từ lệnh trên:

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 

Bạn có thể dễ dàng mở rộng các thử nghiệm với thêm

exports.testname = function(beforeExit, assert) { 
} 
Các vấn đề liên quan