【问题标题】:What are the good frameworks for unit-testing and mock objects in Perl?Perl 中用于单元测试和模拟对象的好的框架是什么?
【发布时间】:2009-10-05 09:39:44
【问题描述】:

您会推荐哪些框架和工具用于在 Perl 中进行单元测试和模拟对象?

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

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

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

另外,有没有好的基于 BDD(行为驱动开发)的 Perl 测试框架?

【问题讨论】:

    标签: perl unit-testing mocking bdd


    【解决方案1】:

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

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

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

    【讨论】:

    • Test::Class 是一个很棒的基于对象的测试工具;它是轻量级的,可与 Test::More 和所有与 Test::Builder 相关的单元测试工具一起使用。
    【解决方案2】:

    只是添加一点关于 BDD 的内容,因为我认为friedo 的答案涵盖了其他所有内容。

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

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

    另请参阅这个 SO 问题:Can you review my Perl rewrite of Cucumber?

    希望这能有所帮助。

    /I3az/

    【讨论】:

      【解决方案3】:

      最近,通过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 类作为您的模拟对象。方便,无限灵活。

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

      【讨论】:

      • 这看起来很酷,但如果我还没有使用 Moose,我可能会跳过这个。
      【解决方案4】:

      它不是一个框架,但最好的测试书籍之一是优秀的Perl Testing: A Developer's Notebook,它还推荐了 Perl 的测试框架,例如Test::More.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-12
        • 1970-01-01
        • 2017-01-17
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多