5

まだ学習中の Pyramid アプリがあります。単体テストを作成することになっていますが、リクエストを作成する方法がわかりません。

Pyramid には a を含むテスト モジュールがあることがわかりますがDummyRequest、これは空白です。これをビューに渡すと、実行中にリクエストに含まれる属性が入力されていないため、明らかに失敗します。

問題は、テスト中にランタイム リクエストのように見えるリクエストを渡す方法です。

4

4 に答える 4

9

単体テスト (機能テストとは異なります) を行うときはいつでも、小さな「単位」をテストしていることに気付きます。このユニット (この場合はあなたのビュー) は、「実際の」リクエストを必要とせず、完全に機能するシステムも必要としません。そのビューは、自分自身を「リクエスト」と呼んでいるオブジェクトが持つ可能性があるものについて一定の期待を持っていますが、それはそれについてであり、実際のリクエストで利用可能なすべてのものを必要とするわけではありません. ここで、モッキングまたはダミー オブジェクトの出番です。ビューをテストしたいので、ビューが機能しているかどうかを確認するために必要なプロパティを含む何かをビューに渡すことができます。次の構成があるとします。

def main():
    config = Configurator()
    config.add_route('user', '/users/{uid}')
    return config.make_wsgi_app()

@view_config(route_name='user', renderer='user_template.mako')
def user_view(request):
    uid = request.matchdict['uid']
    user = find_user(request, uid)
    if user is None:
        raise HTTPNotFound
    return {'user': user}

def find_user(request, uid):
    return request.db.query(User).filter_by(id=uid).first()

これは実際のビューであり、リクエストに 2 つの属性matchdictdb. それを行うことができます:

class Test_user_view(unittest.TestCase):
    def test_it(self):
        req = DummyRequest()
        req.db = DummyDB()
        req.matchdict = {'uid': '3'}
        result = user_view(req)
        self.assertEqual(result['user'].id, 3)

ここで取り上げないのは の実装ですが、ダミーの値を返すDummyDBようにモックアウトする方がよいかもしれません。find_userこれにより、テストがシンプルに保たれ、データベースとの通信に行き詰まることなく、ビュー自体に集中できます。それは別のテストです。

ここでの他の回答は、機能テストをより徹底的にカバーしており、WebTest を使用して、アプリケーション全体が期待どおりに動作していることを確認することを確認する必要がありますが、これは単体テストの領域ではありません。

于 2012-11-21T06:27:21.220 に答える
2

まだ行っていない場合は、ピラミッド ユニット vs 統合 vs 機能テストおよびピラミッド テスト ガイドラインを確認してください。私見では、DummyRequest を使用した単体テストとは対照的に、機能テストから開始すると、多くの場合、より良い結果が得られる傾向があります (つまり、実装と保守が容易になります)。Webtest (ピラミッド ドキュメントの例)またはSeleniumを使用することをお勧めします。ライブラリ (または両方の組み合わせ)。webtest を使用すると、基本的な機能をテストでき、テストは通常​​、Selenium よりも高速に実行されます。Selenium は実際にブラウザーを起動でき、よりきめ細かい制御が可能です。ブラウザーを起動するため、selenium テストの実行には時間がかかる傾向があります。基本的なテスト (特定のページが読み込まれるかどうかの確認など) だけが必要な場合は、Webtest を使用することをお勧めします。テストでブラウザーをさらに制御する必要がある場合 (JavaScript のデバッグなど)、Selenium を試してください。これらのライブラリでテストする方法の例については、上記のリンク先のドキュメントを確認してください。

于 2012-11-21T02:57:34.803 に答える
1

ブライアンの答えは良いと思いますが、「できるだけテストしやすいコードをできるだけ多く書く」というのは便利なマントラだと付け加えます。機能をモジュール化して、使い慣れた要求に依存しない手段で簡単に単体テストできる移植可能なライブラリを作成できる限り、あなたは満足するでしょう。

機能テストは、単体テストよりも一桁難しく、厄介で、遅く、あまり良くありません。Webtest は、Brian が述べたように、Pyramid の目的地です。Selenium は、さらにもう 1 桁硬く、乱雑で、低速です。気をつけて; テストが実際のデータに依存している場合、データが変更されると時間の経過とともに壊れます。モッキングと優れたダミーデータは、それを助けることができます。必要に応じて、より高度で難しい形式のテストを使用しますが、楽しみのためだけではありません。アーキテクチャを使用して、その必要性をある程度減らすことができます。

実際の「どうすればよいか」という質問に答えるには: Webtest のようなものがある場合は、セットアップを行ってから、次のようなことを行います。

response = app.get('/form.html')

次に、必要なすべての情報を含む便利な応答オブジェクトを取得し、アサーションを記述します。ドキュメントのチュートリアルは、私よりもよく説明します。

于 2012-11-21T03:59:42.440 に答える