2009-10-05 52 views
12

你會推薦哪些框架和工具用於Perl中的單元測試和模擬對象?Perl中的單元測試和模擬對象有什麼好的框架?

我有一個現有的Perl應用程序,主要是數據庫訪問,讀取和寫入文件。該應用程序基本上是一個批處理作業類型的應用程序,它從文件和數據庫中讀取大量文件,並將大量新文件和一些內容寫入數據庫。

該應用程序目前沒有任何單元測試,但我希望重構應用程序具有良好的單元測試。

你會推薦什麼框架和工具來進行單元測試和模擬對象?例如類似於Java的HamcrestJMock的東西?

另外,是否有任何良好的基於​​BDD(行爲驅動開發)的Perl測試框架?

回答

12

在測試框架方面,我喜歡使用Test::Class,它允許您以類似於JUnit的方式設置好的單元測試層次結構。鏈接的文檔給出了一個很好的概述,但如果您不熟悉Perl測試慣例,請參閱Test::SimpleTAP的文檔,這是Perl測試的標準輸出格式。

對於嘲諷,有Test::Mock::Class,這對於爲直接控制之外的庫(例如應用程序所依賴的CPAN模塊)設置模擬類很有用。

還有優秀的Test::MockDBI它提供了嘲笑你的數據庫的東西的特殊設施。

+0

Test :: Class是基於對象的測試的絕佳工具;它是輕量級的,可與Test :: More和所有Test :: Builder相關的單元測試工具一起使用。 – 2009-10-05 19:57:56

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,我可能會跳過這個。 – 2009-10-05 19:59:49

相關問題