簡體   English   中英

如何在Perl中模擬用於單元測試的子例程?

[英]How can I mock a subroutine for Unit testing in Perl?

在這里,我為需要執行單元測試的子例程提供了偽代碼。

sub get_detail_team(param1,param2){

   my $dbh   = connect to databasehandle
   my sql    = get_sql_details(param1,param2)
   my $sth   = $dbh->prepare($sql)
       $sth->execute()
   my $result = $sth->fetchall_arrayref();

return get_html_content($result,prama)
}

get_sql_details()和get_html_content()也是同一程序包中的子例程。 我們如何對get_detail_team()函數進行單元測試?

我嘗試使用此Test::Mockmodule ,但未獲得確切結果。

我認為這不是嘲笑的好人選。

第一個問題是get_detail_team做兩件事,它獲取數據對其進行格式化。 格式化的數據比數據結構更難測試。 將格式與功能分開可以使測試變得更加容易,並且可以輕松添加更多格式化程序。 一種提取方法重構以后...

sub get_detail_team_data($param1, $param2) {
   my $dbh   = connect_to_database;
   my $sql   = get_sql_details($param1, $param2);
   my $sth   = $dbh->prepare($sql)
   $sth->execute();
   return $sth->fetchall_arrayref();
}

sub get_detail_team($param1, $param2) {
    my $detail_team = get_detail_team_data($param1, $param2);
    return get_html_content($detail_team);
}

現在,我們可以專注於僅測試數據。 看着get_detail_team_data它只是圍繞一個瘦包裝get_sql_details 要測試get_sql_details您需要獲取SQL並查看它是否獲取數據,這應該是get_detail_team_data作用。 你還不如專注於測試get_detail_team_data僅為基本的集成測試get_sql_details 這留下了數據庫連接的問題。

我不太喜歡嘲笑,以至於所有外部服務都已刪除。 如果要編寫SQL,則需要一個SQL數據庫來運行它,否則就不會真正測試該功能。 我將假設存在一個具有與生產數據庫匹配的架構的測試數據庫。 您的測試可以使用所需的任何數據填充它,並在腳本結尾處回滾。

最簡單的方法是編寫connect_to_database以便使用測試環境變量來連接到測試數據庫。 更好的是擁有一個環境變量,該變量控制整個系統在哪里尋找整個測試套件可以利用的配置信息。

get_detail_team並不需要太多測試,它只是一個薄包裝。 為此編寫基本的集成測試,並專注於測試get_html_content ,您只需傳遞數據結構即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM