Подтвердить что ты не робот

Каковы хорошие рамки для модульного тестирования и mock-объектов в Perl?

Какие рамки и инструменты вы бы порекомендовали для модульных тестов и макетов объектов в Perl?

У меня есть существующее приложение Perl, в основном доступ к базе данных, чтение и запись файлов. Приложение в основном представляет собой пакетный тип работы приложения, он читает кучу материала из файлов и базы данных и записывает в базу несколько новых файлов и некоторых материалов.

В настоящее время приложение не имеет никакого модульного теста, но я бы хотел, чтобы рефакторинское приложение имело хорошие модульные тесты.

Какие рамки и инструменты вы бы порекомендовали для модульного тестирования и насмешек? Например, что-то похожее на Hamcrest и JMock Java?

Кроме того, существуют ли какие-либо хорошие основы тестирования BDD (Behavior Driven Development) для Perl?

4b9b3361

Ответ 1

В терминах тестовых фреймворков мне нравится использовать Test:: Class, который позволяет настроить хорошие иерархии unit test способом аналогично JUnit. Связанная документация дает неплохой обзор, хотя, если вы еще не знакомы с соглашениями об использовании Perl, ознакомьтесь с документацией для Test:: Simple и TAP, который является стандартным форматом вывода для тестов Perl.

Для насмешек существует Test:: Mock:: Class, что полезно для настройки макетных классов для библиотек за пределами вашего прямого управления, как модули CPAN, на которые опирается ваше приложение.

Существует также отличный Test:: MockDBI, который предоставляет специальные возможности для издевательства над вашей базой данных.

Ответ 2

Просто добавлю немного о бит BDD, потому что ответ friedo я думаю, что все еще что-то покрывает.

Быстро посмотрите на это обсуждение Perlmonks Поведенческая разработка: предлагаемые инструменты для perl?

Я думаю, что некоторые инструменты, которые могут указывать вам в правильном направлении:

Также см. этот вопрос SO: Можете ли вы просмотреть мою переписку Perl о огурцах?

Надеюсь, что это поможет.

/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 класс как ваш макет объекта. Удобный и бесконечно гибкий.

(Это просто примеры... это также может быть намного лучше.)