繁体   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