10

私は多くの django アプリケーションを作成しており、.django の拡張unittest.TestCaseと実行に慣れていpython manage.py test app_nameます。Kansoアプリを単体テストする同様の簡単な方法はありますか? 最小限の例を提供してください。

ありがとう。

4

3 に答える 3

10

Kanso アプリは CouchDB アプリです。ただし、最善の方法は、現時点では CouchDB を無視することです。重要なことは、Kanso アプリは Node.js アプリであるということです。Node.js アプリをテストするのと同じ方法でテストします。文書化された CouchDB API に準拠していることをテストすれば、問題ありません。

理想的には、実際に CouchDBでテストを実行したいと思うかもしれません。JavaScript エンジンは異なります (V8 と SpiderMonkey)。環境が異なります。ただし、実際には、Node.js コードをテストする方がはるかに簡単です。(また、JavaScript のバグのクラス全体が両方のプラットフォームに存在しません。グローバル変数を設定するサードパーティ コード、組み込み型の変更、プロトタイプの変更など、これらはすべてブラウザーの問題です。Node.js と CouchDB はどちらも元のままで予測可能です。)

_show 関数で「Hello world」を出力するシンプルな Couch アプリを作ってみましょう。

kanso.jsonファイル:

{ "name"   : "hello_world"
, "version": "0.1.0"
, "description": "A simple hello-world Couch app"
, "dependencies": { "node-couchapp": "~0.8.3" }
, "app": "app"
}

kanso install「node-couchapp」依存関係を取り込む次の実行。kanso(コマンドの使用方法がコマンドの使用方法に似ていることに注意してくださいnpm。)

で、非常に単純な Couch アプリを作成しましょう./app.js

// A Couch app that just says hello in a _show function.
module.exports = {
  'shows': {
    'hello': function(doc, req) {
      var who = req.query.who || "world"
      return "Hello, " + who
    }
  }
}

私が走ったkanso push http://example.iriscouch.com/so_helloところ、ここに私のアプリを見ることができます:

テストの追加

ノードタップが好きなので使ってみましょう。しかし要点は、これは Node.js コードの一部に過ぎないということです。お好みの方法でテストしてください。

まず、簡単なpackage.jsonファイル:

{ "name"   : "hello_world"
, "description": "A simple hello-world Couch app"
, "version": "0.1.0"
, "private": true
, "devDependencies": { "tap": "~0.2.3" }
}

npm installnode-tap パッケージを取得するために実行します。(そして./node_modules/.bin、私$PATHは Node.js で作業するときは常に手元に置いています。グローバル インストールではなく、必要なものすべてをプロジェクト内に配置したいと思っています。

次に、おそらくtest/show_function.jsファイル:

var tap = require('tap')

tap.test('The Couch app loads', function(t) {
  t.doesNotThrow(load_app, 'No problem loading the app.js file')
  t.end()

  function load_app() {
    var app = require('../app')
  }
})

tap.test('The show function', function(t) {
  var app = require('../app')
    , hello = app.shows.hello

  t.type(hello, 'function', 'Show function "hello" in the couch app')

  var doc = {}
    , null_req = {'query':{}}
    , john_req = {'query':{'who':'John Doe'}}

  t.equal(hello(doc, null_req), 'Hello, world', '"Hello world" by default')
  t.equal(hello(doc, john_req), 'Hello, John Doe', 'Supports ?who query string')
  t.end()
})

次を実行してテストしますtap test

$ tap test
ok test/show_function.js ................................ 5/5
total ................................................... 5/5

ok

ハードコードされた "Hello, world" を返す (つまり、req.query.whoパラメーターを無視する) ようにコードを変更します。失敗したテストに注意してください。

$ tap test
not ok test/show_function.js ............................ 4/5
    Command: "node" "show_function.js"
    ok 1 No problem loading the app.js file
    ok 2 Show function "hello" in the couch app
    ok 3 "Hello world" by default
    not ok 4 Supports ?who query string
      ---
        file:   /private/tmp/j/test/show_function.js
        line:   23
        column: 5
        stack:  
          - getCaller (/private/tmp/j/node_modules/tap/lib/tap-assert.js:403:17)
          - assert (/private/tmp/j/node_modules/tap/lib/tap-assert.js:19:16)
          - Function.equal (/private/tmp/j/node_modules/tap/lib/tap-assert.js:160:10)
          - Test._testAssert [as equal] (/private/tmp/j/node_modules/tap/lib/tap-test.js:86:16)
          - Test.<anonymous> (/private/tmp/j/test/show_function.js:23:5)
          - Test.<anonymous> (native)
          - Test.<anonymous> (events.js:88:20)
          - Test.emit (/private/tmp/j/node_modules/tap/lib/tap-test.js:103:8)
          - GlobalHarness.<anonymous> (/private/tmp/j/node_modules/tap/lib/tap-harness.js:86:13)
          - Array.0 (native)
        found:  Hello, world
        wanted: Hello, John Doe
        diff:   |
          FOUND:  Hello, world
          WANTED: Hello, John Doe
                         ^ (at position = 7)
      ...
    ok 5 test/show_function.js

    1..5
    # tests 5
    # pass  4
    # fail  1

total ................................................... 4/5

not ok
于 2012-05-04T01:53:23.753 に答える
6

kansoアプリのテストを紹介するのに役立つプロジェクトがいくつかあります。

ダッシュボードコアプロジェクト

https://github.com/ryanramage/dashboard-core

特徴:

ノード-Couchappプロジェクト

https://github.com/kanso/node-couchapp

  • トラビスのサポート
  • 今回は、kansoフォルダー内の複数のテストkansoプロジェクト。再びパッケージディレクトリでシンボリックリンクトリックを使用する
于 2012-05-04T14:39:52.033 に答える
6

JasonSmith のように、可能であれば Node.js を使用してテストすることもお勧めします。ただし、CouchApps の性質上、ブラウザーで実行する単体テストを記述しなければならないことがよくあります。これは、それらがモックしたくないブラウザー API と対話するため、またはさまざまなブラウザーで動作することをテストする必要があるためです。 .

ブラウザーベースの単体テストを行うときは、ハッキングしたいくつかの小さな Kanso パッケージを使用して、nodeunit テスト スイートを実行するためのインターフェイスを自動的に提示します。現時点では、端が少し荒いですが、仕事は完了します。

kanso.json

nodeunit および nodeunit-testrunner パッケージを kanso.json ファイルに追加し、kanso install を実行してリポジトリから取得します。

{
    "name": "example",
    "version": "0.0.1",
    "description": "example app with unit tests",
    "modules": ["lib", "tests"],
    "load": "lib/app",
    "dependencies": {
        "modules": null,
        "properties": null,
        "nodeunit": null,
        "nodeunit-testrunner": null
    }
}

モジュール パスとして「tests」ディレクトリを含めたことに注意してください。そのディレクトリにドロップされたすべてのモジュールは、nodeunit テスト スイートとして使用され、nodeunit-testrunner UI によって表示されます。

書き換え

nodeunit-testrunner パッケージのリライトをアプリに手動で追加する必要があります。私の例では、lib/app.js を次のように編集することを意味します。

exports.rewrites = [
    require('nodeunit-testrunner/rewrites')
];

いくつかのテストを追加

次のようなモジュール lib/foo.js があると仮定します。

exports.hello = function (name) {
    return 'hello ' + name;
};

tests/test-foo.js にモジュールを追加することで、テストを追加できます (これは、tests ディレクトリ内にある限り、任意の名前を付けることができます)。

var foo = require('lib/foo');


exports['test for foo.hello'] = function (test) {
    test.equal(foo.hello('bar'), 'hello bar');
    test.done();
};

次に、アプリをプッシュしてブラウザーでhttp://localhost:5984/example/_design/example/_rewrite/testにアクセスすると、tests ディレクトリ内のテスト スイートを個別にまたはすべて実行するための基本的なインターフェイスが表示されます。それらを次々と。

それが役立つことを願っています。

于 2012-05-04T14:48:25.147 に答える