2012-06-22 3 views
8

Какие тестовые рамки доступны для тестирования видов, и это map и reduce функции, фильтры, списки, шоу и т. Д. Моего CouchDB?Тестирование CouchDB-просмотров, фильтров, списков, шоу и т. Д.

В идеале каркас позволяет модулю тестировать каждую функцию, а также обеспечивать поддержку для тестирования данного набора представлений, фильтров и т. Д. В отношении набора данных на экземпляре CouchDB.

Я нашел сообщение в блоге на writing a test suite for the CouchDB API, но это с 2010 года, и мне было интересно, что с того времени произошло.

ответ

4

Я бы использовал рамки TDD Expresso для Node.js. Накладные расходы на запись приложения Node.js не будут потрачены впустую.

Установка Node.js на странице загрузки: nodejs.org/download

Убедитесь, что вы также получаете НПМ (Node.js менеджер пакетов).

С каркасом expresso вы можете легко протестировать любую из функций RESTful в CouchDB.

Вот пример 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) { 
} 
Смежные вопросы