Каковы хорошие рамки для модульного тестирования и mock-объектов в Perl?
Какие рамки и инструменты вы бы порекомендовали для модульных тестов и макетов объектов в Perl?
У меня есть существующее приложение Perl, в основном доступ к базе данных, чтение и запись файлов. Приложение в основном представляет собой пакетный тип работы приложения, он читает кучу материала из файлов и базы данных и записывает в базу несколько новых файлов и некоторых материалов.
В настоящее время приложение не имеет никакого модульного теста, но я бы хотел, чтобы рефакторинское приложение имело хорошие модульные тесты.
Какие рамки и инструменты вы бы порекомендовали для модульного тестирования и насмешек? Например, что-то похожее на Hamcrest и JMock Java?
Кроме того, существуют ли какие-либо хорошие основы тестирования BDD (Behavior Driven Development) для Perl?
Ответы
Ответ 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 класс как ваш макет объекта. Удобный и бесконечно гибкий.
(Это просто примеры... это также может быть намного лучше.)
Ответ 4
Это не фреймворк, но одна из лучших тестовых книг - отличный Perl Testing: ноутбук для разработчиков, который также имеет рекомендации тестовые рамки для Perl, например Test::More
.