<div dir="ltr">2008/9/12 rochelle hsu <span dir="ltr">&lt;<a href="mailto:rjhome@gmail.com">rjhome@gmail.com</a>&gt;</span><br><div class="gmail_quote"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div dir="ltr"><span style="font-family: Simsun; font-size: 16px;"><pre>Abuse Test::Base to test everything</pre><pre>请问有这个模块的介绍吗,个人比较感兴趣。</pre></span></div></blockquote></div>Test::Base 是一个 CPAN 模块:<br><br><a href="http://search.cpan.org/perldoc?Test::Base">http://search.cpan.org/perldoc?Test::Base</a><br>
<br>CPAN 上有不少文档。<br><br>我几年前刚接触时是通过看 Ingy dot net 的一个 talk 幻灯片学会的,呵呵。最简单的一个示例是:<br><br># foo.t<br>use Test::Base;<br><br>plan tests =&gt; 1 * blocks();<br><br>sub add ($$) {<br>&nbsp;&nbsp;&nbsp; $_[0] + $_[1];<br>}<br><br>run {<br>&nbsp;&nbsp;&nbsp; my $block = shift;<br>
&nbsp;&nbsp;&nbsp; my $name = $block-&gt;name;<br>&nbsp;&nbsp;&nbsp; #warn $name;<br>&nbsp;&nbsp;&nbsp; my $input = $block-&gt;input;<br>&nbsp;&nbsp;&nbsp; if (!defined $input) { die &quot;No --- input specified for $name&quot;; }<br>&nbsp;&nbsp;&nbsp; my $got = eval $input;<br>&nbsp;&nbsp;&nbsp; my $expected = $block-&gt;output;<br>
&nbsp;&nbsp;&nbsp; chomp($expected);<br>&nbsp;&nbsp;&nbsp; like $got, $expected, &quot;$name - answer okay&quot;;<br>};<br><br>__DATA__<br><br>=== TEST 1: add<br>--- input<br>1+2<br>--- output<br>3<br><br><br><br>=== TEST 2: sub<br>--- input: 1-2-3<br>
--- output: -4<br><br><br><br>=== TEST 3: sub<br>--- input: 1-2-3<br>--- output: -4<br><br>我写了一个小脚本可以自动对这里的 foo.t 进行"格式化",比如序号重编,空行调整等等:<br><br><a href="http://svn.openfoundry.org/openapi/trunk/bin/reindex">http://svn.openfoundry.org/openapi/trunk/bin/reindex</a><br>
<br>没有这个 reindex 脚本,使用 Test::Base 会感觉失败测试的准确定位有些困难,呵呵。毕竟失身测试的行号在这里已经没什么意义了,我们依赖于这里的 TEST 1, TEST 2 等编号来定位。<br><br>Test::Base 是一个很好的数据驱动的测试框架。我用它组织了 OpenResty 的测试集,可以以多种不同的方式(HTTP 或者进程内或者 mocking 方式)运行同一个测试集。我还用它结合 JavaScript::SpiderMonkey 对一些没有太多 DOM 操作的 .js 文件进行单元测试(比如 <a href="http://svn.openfoundry.org/openapi/trunk/demo/Onccf/t/01-pod2html.t">http://svn.openfoundry.org/openapi/trunk/demo/Onccf/t/01-pod2html.t</a> ),用它对 GNU make 性质的外部程序进行测试(比如 <a href="http://svn.openfoundry.org/mdom/branches/gmake/t/gmake/sanity/simple.t">http://svn.openfoundry.org/mdom/branches/gmake/t/gmake/sanity/simple.t</a> ),用它对 Haskell 编写的编译器进行测试(比如 <a href="http://svn.openfoundry.org/openapi/trunk/haskell/t/view/emit-frags.t">http://svn.openfoundry.org/openapi/trunk/haskell/t/view/emit-frags.t</a> ),用它测试了我的除了 OpenResty 以外的多个 CPAN 模块,包括一个 Perl 6 正则引擎 Pugs::Compiler::Rule :))<br>
<br>Happy abusing Test::Base!<br><br>-agentzh<br></div>