Test::Builder::Tester - 测试使用 Test::Builder 构建的测试套件
use Test::Builder::Tester tests => 1;
use Test::More;
test_out("not ok 1 - foo");
test_fail(+1);
fail("foo");
test_test("fail works");
一个模块,可帮助你测试使用 Test::Builder 构建的测试模块。
测试系统旨在通过对要测试的每个测试执行三步流程来使用。此流程从提前使用 test_out
和 test_err
声明要测试的测试套件将使用 Test::Builder 在 stdout 和 stderr 中输出的内容开始。
然后,你可以运行从测试套件中调用 Test::Builder 的测试。此时,Test::Builder 的输出将被 Test::Builder::Tester 安全地捕获,而不是被解释为真正的测试输出。
最后一步是调用 test_test
,它将简单地比较你预先声明的内容与 Test::Builder 实际输出的内容,并将结果以“ok”或“not ok”(带有调试信息)报告回正常输出。
以下是导出为默认值的六个方法。
在调用 `test_test` 之前,预先声明测试套件预期产生的输出的程序。这些程序自动假定每行以 "\n" 结尾。因此
test_out("ok 1","ok 2");
与
test_out("ok 1\nok 2");
相同,甚至与
test_out("ok 1");
test_out("ok 2");
相同。一旦调用了 `test_out` 或 `test_err`(或 `test_fail` 或 `test_diag`),Test::Builder 的所有进一步输出都将被 Test::Builder::Tester 捕获。这意味着在调用 `test_test` 之前,你将无法以正常方式对正常输出执行进一步的测试(除非你手动处理输出文件句柄)
因为 Test::Builder 在每次测试失败时产生的标准失败消息在测试错误输出中会很常见,并且它在 Test::Builder 版本之间发生了变化,所以我们不会强迫你始终像这样使用字符串调用 `test_err`
test_err("# Failed test ($0 at line ".line_num(+1).")");
test_fail
作为一个方便函数存在,可以用来代替。它接受一个参数,即导致失败的行与当前行的偏移量。
test_fail(+1);
这意味着概要中的示例可以更简单地改写为
test_out("not ok 1 - foo");
test_fail(+1);
fail("foo");
test_test("fail works");
由于大多数剩余的预期错误流输出将由 Test::Builder 的 `diag` 函数创建,Test::Builder::Tester 提供了一个方便函数 `test_diag`,你可以用它来代替 `test_err`。
test_diag
函数在传递给它的预期输出的开头添加注释哈希和空格,并在结尾添加换行符,并将其添加到预期的错误输出列表中。因此,与其编写
test_err("# Couldn't open file");
你可以编写
test_diag("Couldn't open file");
记住,Test::Builder 的 diag 函数不会在输出的末尾添加换行符,而 test_diag 会。因此要检查
Test::Builder->new->diag("foo\n","bar\n");
你会执行
test_diag("foo","bar")
不带换行符。
实际执行输出检查测试,将我们从 Test::Builder 捕获的数据(使用 `eq`)与使用 `test_out` 和 `test_err` 声明的数据进行比较。
这会获取影响测试运行方式的名称/值对。
ok
或 not ok
后显示的测试名称。
将其设置为真值,则如果测试发送到输出流的输出与使用 test_out
声明的输出不匹配,测试将忽略此输出。
将其设置为真值,则如果测试发送到错误流的输出与使用 test_err
声明的输出不匹配,测试将忽略此输出。
为方便起见,如果仅传递一个参数,则假定此参数为测试名称(如以上示例所示)。
运行 test_test
后,测试输出将被重定向回 Test::Builder 连接到的原始文件句柄(可能是 STDOUT 和 STDERR),这意味着你运行的任何进一步测试都将正常运行,并导致 Test::Harness 成功/出错。
返回调用函数的行号的实用函数。你可以传递一个偏移量,该偏移量将添加到结果中。这对于找出包含行号的诊断函数的正确文本非常有用。
从本质上讲,这与 __LINE__
宏相同,但 line_num(+3)
惯用语可能更好。
除了六个导出函数之外,还有一个函数只能通过完全限定的函数调用访问。
当调用 test_test
且测试生成的输出与声明的不匹配时,test_test
会打印出调试信息,显示出两个冲突的版本。由于此输出本身就是调试信息,因此可能会混淆 test_test
的输出部分和原始测试的原始输出部分。此外,可能很难发现行尾的无关空格之类的内容,即使输出看起来相似,但这些内容也可能导致测试失败。
为了帮助你,test_test
可以为调试信息着色背景,以区分不同类型的输出。调试输出的背景将被着色为绿色和红色。绿色部分表示执行输出和实际输出中相同的部分,红色部分表示不同的部分。
color
函数确定是否应进行着色。向其传递 true 或 false 值将分别启用或禁用着色,而未带参数调用的函数将返回当前设置。
要从命令行启用着色,你可以像这样使用 Text::Builder::Tester::Color 模块
perl -Mlib=Text::Builder::Tester::Color test.t
或通过直接在 PERL5LIB 中包含 Test::Builder::Tester::Color 模块。
Test::Builder::Tester 无法很好地处理计划。它从未对计划做过任何特殊处理。这意味着 Test::Builder::Tester 外部的计划将影响 Test::Builder::Tester,更糟糕的是,在使用 Test::Builder::Tester 时,计划将影响整体测试。此时,没有计划修复此错误,因为人们已经开始依赖它,并且现在不鼓励使用 Test::Builder::Tester,而鼓励使用 Test2::API::intercept()
。请参阅 https://github.com/Test-More/test-more/issues/667
调用 Test::Builder->no_ending
关闭结束测试。这是必需的,因为否则它会跳出,因为我们运行的测试比严格应该运行的测试多,并且它会将我们正在测试的任何故障记录为真正的故障。
除非 Term::ANSIColor 与你的终端兼容,否则 color 函数不起作用。此外,必须在 Windows 平台上安装 Win32::Console::ANSI 才能输出颜色。
可以通过 GitHub 向作者报告错误(和新功能请求):https://github.com/Test-More/test-more/issues
版权所有 Mark Fowler <[email protected]> 2002、2004。
部分代码取自 Test::More 和 Test::Catch,由 Michael G Schwern <[email protected]> 编写。因此,这些部分版权归 Micheal G Schwern 2001 所有。经许可使用和分发。
此程序是免费软件;你可以根据与 Perl 本身相同的条款重新分发和/或修改它。
感谢 Richard Clamp <[email protected]> 允许我使用他的测试系统来尝试此模块。