Kansoの単体テストを書く方法

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

ありがとう。

10
ありがとう。しかし、Caolanのポイントは非常に洞察力があります。私の技術は、厳密に言えば「単体テスト」かもしれません。しかし最終的には、ブラウザーの動作を確認するために機能的または統合テストが必要です。
追加された 著者 JasonSmith,
JasonSmith、Caolan、Ryan Ramageの回答をチェックしてください。それらはすべて正確で有用です。私はJasonSmithから答えを受け入れました。なぜなら、それは自分の最善を尽くしているからです。
追加された 著者 nrw,

3 答え

KansoアプリはCouchDBアプリです。しかし、今のところCouchDBを無視するのが最善の方法です。重要なのはこれです: KansoアプリはNode.jsアプリです。 Node.jsアプリケーションをテストするのと同じ方法でそれらをテストしてください。それらが文書化されたCouchDB APIに準拠していることをテストすれば、大丈夫です。

Ideally, we might want to run tests actually in CouchDB. The JavaScript engines are different (V8 vs. SpiderMonkey); the environments are different. However in practice, it is so much easier to test Node.js code. (Also, a whole class of JavaScript bugs are absent on both platforms: third-party code setting global variables, changing built-in types, changing prototypes—those are all browser issues. Node.js and CouchDB are both pristine and predictable.)

_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 コマンドの使用方法と似ています)。

。app.js に非常にシンプルなCouchアプリを作ってみましょう:

// 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
    }
  }
}

I ran kanso push http://例.iriscouch.com/so_hello and I can see my app here:

テストの追加

ノードタップが好きなので、それを使ってみましょう。しかし、主なポイントは、これはちょうど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 install を実行して、ノードタップパッケージを取得します。 (Node.jsで作業するときは、 $ PATH に常に ./ node_modules/.bin があります。グローバルインストールではなく、そこにプロジェクトの権利がある。

次に、おそらく 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

コードを変更して、「ハロー、ワールド」のハードコードを返します(つまり、 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. (/private/tmp/j/test/show_function.js:23:5)
          - Test. (native)
          - Test. (events.js:88:20)
          - Test.emit (/private/tmp/j/node_modules/tap/lib/tap-test.js:103:8)
          - GlobalHarness. (/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
10
追加された
ちなみに、単体テストのほうがはるかに簡単なので、すべての仕事をKanso 具体的にに変換しました。
追加された 著者 JasonSmith,

JasonSmith同様、可能であればNode.jsを使ってテストすることをお勧めします。しかし、CouchAppの性質上、あなたはモックしたくないブラウザAPIとやりとりしたり、テストする必要があるためブラウザの範囲内で動作するため、ブラウザで実行する単体テストを書く必要があります。 。

ブラウザベースの単体テストを実行するとき、私はノードキットテストスイートを実行するためのインタフェースを自動的に提示するために一緒にハッキングした小さなKansoパッケージをいくつか使用します。今のところ縁が少し荒いですが、仕事が終わります。

kanso.json

kanso.jsonファイルにnodeunitとnodeunit-testrunnerパッケージを追加し、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 をブラウザに表示すると、テストディレクトリ内のテストスイートを個別に実行するための基本的なインターフェイスが表示されます。

希望が役立ちます。

6
追加された

私はカンソのアプリケーションをテストするのに役立ついくつかのプロジェクトを持っています:

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

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

特徴:

ノード-Couchappプロジェクト

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

  • Travisのサポート
  • 今回は、kansoフォルダに複数のテストかん子プロジェクトを作成します。パッケージディレクトリのsymlink trickを再度使用する
6
追加された
また、あなたは、 github.com/kanso/couch-fakerequest をご覧になることもできます。テストのショー、リスト、および更新機能を支援します。
追加された 著者 Ryan Ramage,