Perl中单元测试和模拟对象的优秀框架是什么?

时间:2009-10-05 09:39:44

标签: perl unit-testing mocking bdd

您建议在Perl中使用哪些框架和工具进行单元测试和模拟对象?

我有一个现有的Perl应用程序,主要用于数据库访问,读写文件。该应用程序基本上是一个批处理作业类型的应用程序,它从文件和数据库中读取大量内容,并将一堆新文件和一些东西写入数据库。

该应用程序目前没有任何单元测试,但我希望重构应用程序能够进行良好的单元测试。

您会为单元测试和模拟对象推荐哪些框架和工具?例如类似于Java的HamcrestJMock的东西?

此外,Perl是否有基于BDD(行为驱动开发)的测试框架?

4 个答案:

答案 0 :(得分:12)

就测试框架而言,我喜欢使用Test::Class,它允许您以类似于JUnit的方式设置好的单元测试层次结构。链接文档提供了非常好的概述,但如果您还不熟悉Perl测试约定,请查看Test::SimpleTAP的文档,这是Perl测试的标准输出格式。

对于模拟,有Test::Mock::Class,这对于为直接控制之外的库设置模拟类很有用,比如应用程序所依赖的CPAN模块。

还有优秀的Test::MockDBI,它提供了用于模拟数据库内容的特殊工具。

答案 1 :(得分:7)

只是添加一点关于BDD位,因为我认为覆盖其他地方的炒作答案。

快速浏览一下Perlmonks讨论Behavior Driven Development: suggested tools for perl?

我认为一些可能指向正确方向的工具:

另见这个问题:Can you review my Perl rewrite of Cucumber?

希望其中一些有用。

/ I3az /

答案 2 :(得分: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';

注意你如何使用简洁的语法,但是“真实”的全部功能 驼鹿类作为你的模拟对象。方便,无限灵活。

(这些只是示例......它也可能更好。)

答案 3 :(得分:4)

它不是一个框架,但最好的测试书籍之一是优秀的Perl Testing: A Developer's Notebook,它也提供了Perl测试框架的建议,例如: Test::More