Каковы хорошие фреймворки для модульного тестирования и макетов объектов в Perl? - PullRequest
12 голосов
/ 05 октября 2009

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

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

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

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

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

Ответы [ 4 ]

12 голосов
/ 05 октября 2009

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

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

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

7 голосов
/ 05 октября 2009

Просто добавлю немного о BDD, потому что ответ «фридо», я думаю, охватывает все остальное.

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

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

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

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

/ I3az /

6 голосов
/ 05 октября 2009

В последнее время, с 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';

Обратите внимание, что у вас есть лаконичный синтаксис, но полная мощь "реального" Класс лося как ваш фиктивный объект. Удобный и бесконечно гибкий.

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

4 голосов
/ 05 октября 2009

Это не фреймворк, но одна из лучших книг по тестированию - это превосходное Тестирование Perl: записная книжка разработчика , в котором также есть рекомендации по тестовым фреймворкам для Perl, например, Test::More.

...