热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Perl的测试框架Test::Base简介及使用方法

本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。

Test::Base是什么?用官方的说法是“数据驱动的测试”。Test::Base是一个测试框架,只要给它提供测试数据,它就能自动进行单元测试,省却了手工编写测试程序的麻烦。

可能有人用过Test::More模块进行自动测试,那么我推荐你使用Test::Base。Test::Base 与Test::More完全兼容,也就是说你可以仅仅将use Test::More;换成use Test::Base; 而不用改动任何其他代码;其次,Test::Base可以提供更为简单的测试方法,让你不必在繁琐的测试程序上花费时间。


我们来看一个具体的例子。下面是我们要测试的程序,函数plural接受一个英文单词,返回它的复数形式。

package My::Test::English;# 返回单词的复数
sub plural {my $word = shift;# 以s/x/sh/ch结尾的情况if ( $word =~ /(s|x|sh|ch)$/ ) {$word .= 'es';}# 以辅音+y结尾的情况elsif ( $word =~ /[^aeiou]y$/ ) {$word =~ s/y$/ies/;}# 以f结尾的情况elsif ( $word =~ /f$/ ) {$word =~ s/f$/ves/;}# 其他情况else {$word .= 's';}return $word;
}1;


让我们来看看如何使用Test::Base对这个函数进行测试。测试程序如下。文件保存为 plural.t,因为测试用例文件的扩展名通常为 .t。

#!/usr/bin/perluse My::Test::English;
use Test::Base;sub plural { My::Test::English::plural(shift) }run_is 'input' => 'expected';__END__=== plural test 1
--- input chomp plural
leaf
--- expected chomp
leaves=== plural test 2
--- input chomp plural
goose
--- expected chomp
geese



该程序执行后结果如下:

D:/perl>perl plural.t
ok 1 - plural test 1
not ok 2 - plural test 2
# Failed test 'plural test 2'
# in plural.t at line 8.
# got: 'gooses'
# expected: 'geese'
1..2
# Looks like you failed 1 test of 2.



可见,未通过的测试用例会很明显地显示出来,省却了用人眼比较的麻烦。

如果你有多个 .t 文件,可以用 prove 命令,它会依次运行每一个 .t,并给出全体的测试结果。

D:/perl>prove
./plural....ok 1/0
./plural....NOK 2# Failed test 'plural test 2'
# in ./plural.t at line 8.
# got: 'gooses'
# expected: 'geese'
# Looks like you failed 1 test of 2.
./plural....dubiousTest returned status 1 (wstat 256, 0x100)
DIED. FAILED test 2Failed 1/2 tests, 50.00% okay
Failed Test Stat Wstat Total Fail Failed List of Failed
-------------------------------------------------------------------------------
./plural.t 1 256 2 1 50.00% 2
Failed 1/1 test scripts, 0.00% okay. 1/2 subtests failed, 50.00% okay.



让我们来分析一下这段程序。

测试程序开头引用了Test::Base,随后定义了一个名为 plural 的函数,以调用 My::Test::English::plural。__END__ 标记之后是测试数据,测试数据的格式如下:

&#61;&#61;&#61; 测试数据标题 --- <输入数据名> [<过滤器1> <过滤器2> ...] 输入数据 --- <预期输出数据名> [<过滤器1> <过滤器2> ...] 预期输出数据

测试数据标题可以随便写&#xff0c;仅仅是标识一个数据的开始。数据名就是 run_is 函数中使用的名称&#xff0c;本例中&#39;input&#39;为输入&#xff0c;&#39;expected&#39;为预期输出。

然后要说明的就是过滤器。Test::Base接收的测试数据都是成对的——一个是输入&#xff0c;一个是预期的输出&#xff0c;而Test::Base会使用输入数据运行被测试函数&#xff0c;如果得到的输出结果等于预期输出&#xff0c;则判定为ok&#xff0c;否则为fail。

默认情况下&#xff0c;传递给Test::Base的测试数据都是字符串&#xff0c;显然不能满足各种各样测试的要求&#xff0c;所以Test::Base提供了filter这个概念&#xff0c;可以通过filter将字符串类型的测试数据转换成所需类型&#xff0c;再进行测试。再进一步&#xff0c;可以将被测试函数也做成一个filter&#xff0c;这样输入数据和预期输出数据分别通过各自的过滤器后得到的结果应该相等&#xff0c;

上例中&#xff0c;chomp过滤器表示去掉数据末尾的换行&#xff0c;plural则为自定义的plural函数。所以上例的过滤器的实际意义就是&#xff1a;

input数据去掉换行后&#xff0c;再用plural函数处理&#xff0c;得到的结果应当与expected数据去掉换行的结果相同。

如果输入数据是数组或散列等复杂数据&#xff0c;则可以使用eval过滤器生成&#xff1a;

&#61;&#61;&#61; test
--- input eval testfunc
{ name &#61;> &#39;google&#39;, url &#61;> &#39;http://www.google.com&#39; }
--- expected chomp
google



其他的默认过滤器可以参考 perldoc Test::Base::Filter。

这就是Test::Base的实质&#xff0c;通过过滤器来生成数据、执行被测试函数&#xff0c;最后与预期结果比较。

上面的程序还可以更简单些。首先&#xff0c;用 filters 可以定义输入数据和预期输出数据的默认过滤器&#xff0c;而不必将过滤器写在每个测试数据上&#xff1a;

filters { &#39;input&#39; &#61;> [ &#39;chomp&#39;, &#39;plural&#39; ], &#39;expected&#39; &#61;> &#39;chomp&#39; };
sub plural { My::Test::English::plural(shift) }__END__&#61;&#61;&#61; plural test 1
--- input
leaf
--- expected
leaves&#61;&#61;&#61; plural test 2
--- input
goose
--- expected
geese



其次&#xff0c;run_is动作可以省略&#xff0c;Test::Base会自动查找测试数据。&#xff08;实际上省略run_is后的默认动作为run_compare&#xff0c;与run_is很相似&#xff0c;有兴趣的可以参考 perldoc Test::Base。&#xff09;

这样最终的测试程序如下&#xff1a;

#!/usr/bin/perluse My::Test::English;
use Test::Base;filters { &#39;input&#39; &#61;> [ &#39;chomp&#39;, &#39;plural&#39; ], &#39;expected&#39; &#61;> &#39;chomp&#39; };
sub plural { My::Test::English::plural(shift) }__END__&#61;&#61;&#61; plural test 1
--- input
leaf
--- expected
leaves&#61;&#61;&#61; plural test 2
--- input
goose
--- expected
geese






推荐阅读
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • 判断编码是否可立即解码的程序及电话号码一致性判断程序
    本文介绍了两个编程题目,一个是判断编码是否可立即解码的程序,另一个是判断电话号码一致性的程序。对于第一个题目,给出一组二进制编码,判断是否存在一个编码是另一个编码的前缀,如果不存在则称为可立即解码的编码。对于第二个题目,给出一些电话号码,判断是否存在一个号码是另一个号码的前缀,如果不存在则说明这些号码是一致的。两个题目的解法类似,都使用了树的数据结构来实现。 ... [详细]
  • Linux防火墙配置—允许转发
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Python教学练习二Python1-12练习二一、判断季节用户输入月份,判断这个月是哪个季节?3,4,5月----春 ... [详细]
  • 在本教程中,我们将看到如何使用FLASK制作第一个用于机器学习模型的RESTAPI。我们将从创建机器学习模型开始。然后,我们将看到使用Flask创建AP ... [详细]
  • 引号快捷键_首选项和设置——自定义快捷键
    3.3自定义快捷键(CustomizingHotkeys)ChemDraw快捷键由一个XML文件定义,我们可以根据自己的需要, ... [详细]
author-avatar
人走茶凉
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有