2009-10-05 3 views
12

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

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

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

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

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

ответ

12

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

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

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

+0

Test :: Class - фантастический инструмент для объектно-ориентированного тестирования; он легкий и работает с Test :: Больше и все тестовые инструменты, связанные с Test :: Builder. –

4

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

7

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

Иметь быстрый взгляд на это обсуждение Perlmonks Behavior Driven Development: suggested tools for perl?

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

Также см это так вопрос: Can you review my Perl rewrite of Cucumber?

Надежда некоторых это помогает.

/I3az/

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'; 

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

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

+0

Это выглядит чертовски здорово, но если бы я не использовал Moose, я бы, вероятно, пропустил это. –

Смежные вопросы