12

Perlの単体テストとモックオブジェクトにどのフレームワークとツールをお勧めしますか?

私は既存のPerlアプリケーションを持っています。これは主にデータベースへのアクセス、ファイルの読み取りと書き込みを行います。このアプリケーションは基本的にバッチジョブタイプのアプリケーションであり、ファイルやデータベースから大量のファイルを読み取り、データベースに多数の新しいファイルやいくつかのデータを書き込みます。

現在、アプリケーションには単体テストがありませんが、アプリケーションをリファクタリングして、優れた単体テストを実行したいと思います。

オブジェクトの単体テストとモック作成にどのフレームワークとツールをお勧めしますか?たとえば、JavaのHamcrestJMockに似たものはありますか?

また、Perl用の優れたBDD(ビヘイビア駆動開発)ベースのテストフレームワークはありますか?

4

4 に答える 4

12

テストフレームワークに関しては、Test :: Classを使用するのが好きです。これにより、JUnitと同様の方法で優れた単体テスト階層を設定できます。リンクされたドキュメントはかなり良い概要を提供しますが、Perlテストの規則にまだ精通していない場合は、Perlテストの標準出力形式であるTest::SimpleおよびTAPのドキュメントを確認してください。

モックには、Test :: Mock :: Classがあります。これは、アプリケーションが依存するCPANモジュールなど、直接制御できないライブラリのモッククラスを設定するのに役立ちます。

また、データベースのものをモックするための特別な機能を提供する優れたTest::MockDBIもあります。

于 2009-10-05T09:53:50.793 に答える
7

friedoの答えは他のすべてをカバーしていると思うので、BDDビットについて少し追加します。

このPerlmonksのディスカッションBehaviorDrivenDevelopment:perlの推奨ツールをざっと見てください。

私はあなたを正しい方向に向けるかもしれないいくつかのツールだと思います:

このSOの質問も参照してください:私のPerlによるCucumberの書き直しを確認できますか?

これのいくつかが役立つことを願っています。

/ I3az /

于 2009-10-05T10:12:35.563 に答える
6

最近、MooseX :: Declareを使用して、「実際のオブジェクト」をモックオブジェクトとして使用しています。

次のようなインターフェイスを実行するデータベースドライバがあるとします。

role Database {
    requires 'connect';
    requires 'query';
};

次に、データベースを使用する次のようなコードがあります。

class FooPage {
    has 'database' => (
        is       => 'ro',
        does     => 'Database',
        required => 1,
    );

    method get_foo() {
        $self->database->query({ foo => 42 });
    }

    method render_page(Str $user) {
        "Hello, $user.  Here is a foo for you: ". $self->get_foo;
    }
};

今、これをテストしたいと思います:

use Test::More tests => 2;
use MooseX::Declare;

my $fake_database = class with Database {
    has 'data' => ( is => 'ro', isa => 'HashRef' );
    has 'connected' => ( is => 'rw', isa => 'Bool' );

    method connect() { $self->connected(1) }
    method query(HashRef $query) { $self->data->{$query->{foo}} }
};

my $test_database = $fake_database->name->new(
    data => {
        42 => 'OH HAI',
    },
};

my $foo_page = FooPage->new( database => $test_database );
is $foo_page->get_foo, 'OH HAI', 'got correct foo';
is $foo_page->render_page('jrockway'),
   'Hello, jrockway.  Here is a foo for you: OH HAI',
 'got rendered page';

簡潔な構文がありますが、モックオブジェクトとしての「実際の」Mooseクラスの全機能に注目してください。便利で、無限に柔軟です。

(これらは単なる例です...それはまた、はるかに優れたものになる可能性があります。)

于 2009-10-05T10:55:24.747 に答える
4

これはフレームワークではありませんが、最高のテストブックの1つは、優れたPerlテストです。Perlのテストフレームワークの推奨事項も記載されている開発者向けノートブックTest::Moreです。

于 2009-10-05T09:44:01.000 に答える