name
¶
namequiet|normal|verbose
¶
("name“,”安静|正常|冗长“,fid)
¶
("name“,”安静|正常|冗长“,fname)
¶
success=
test (…)
¶
[n,nmax,nxfail,nbug,nskip,nrtskip,nregression] =
test (…)
¶
[code,idx] =
test ("name“,”grabdemo“)
¶
解释fid)
¶
解释fname)
¶
从加载路径匹配中的第一个文件执行内置自检name.
test
可以以命令或函数形式调用。测试的精确操作从模式(交互式或观察)、返回级别的组合决定("quiet"
,"normal"
,"verbose"
),以及是否使用日志文件或摘要返回变量。
默认模式当test
从命令行调用是交互的。在这种模式下,将运行测试,直到第一个错误被消除,或者所有测试都成功完成。在批处理模式下,所有测试都将运行,而不考虑任何失败,并收集结果以进行返回。需要用户交互的测试,即演示块,永远不会以批处理模式运行。
批处理模式可通过以下方式启用:1)使用第三层指定日志文件fname或fid,或2)指定输出参数,例如success,n等
可选的第二个参数确定要生成的输出量以及要运行的测试类型。默认值为"normal"
。除非启用了详细返回,否则指定输出参数将禁止打印最终汇总消息和任何中间警告。
"quiet"
当所有测试都通过时,打印一条摘要消息,或者当失败时,打印带有第一个错误测试结果的错误。不要运行需要用户交互的测试。
"normal"
在测试执行期间显示有关跳过的测试或失败的xtest的警告消息。当所有测试都通过时,打印一条摘要消息,或者当失败时,打印带有第一个错误测试结果的错误。不要运行需要用户交互的测试。
"verbose"
执行前显示测试。打印所有警告消息。在交互模式下,运行所有测试,包括那些需要用户交互的测试。
可选的第三个输入参数指定了应该写入测试结果的日志文件。日志文件可以是字符串(fname)或打开的文件描述符ID(fid). 要启用批处理,但仍将结果打印到屏幕上,请使用stdout
对于fid.
仅使用单个输出参数调用时success,test
如果所有测试都成功,则返回true。如果使用多个输出参数调用,则成功测试的数量(n),文件中的测试总数(nmax),xtest故障的数量(nxfail),从于已知错误而失败的测试数(nbug),从于缺少函数而跳过的测试数(nskip),从于运行时条件而跳过的测试数(nrtskip),以及回归次数(nregression)返回。
用例
test sind ⇒ PASSES 5 out of 5 tests [n, nmax] = test ("sind") ⇒ n = 5 nmax = 5
附加调用Syntax
如果第二个参数是字符串"grabdemo"
,任何内置演示块的内容都会被提取,但不会被执行。所有代码块的文本被连接并返回为code具有idxbeinga是每个演示块末端位置的向量。有关从文件中提取演示块的更简单方法,详见example
.
如果第二个参数是"explain"
然后name被忽略,并且对中使用的线符号的解释test
输出返回被写入从指定的文件fname或fid.
详见: assert,fail,demo,example,error.
test
扫描命名脚本文件,查找以标识符“”开头的行%!’. 前缀被去除,行的剩余部分通过Octave解释器进行处理。如果代码生成错误,则称测试失败。
自从eval()
将在遇到第一个错误时停止,您必须将测试划分为多个块,并分别评估单独块中的任何内容。块从有效关键字引入,如test
,function
或assert
紧随其后'%!’.块是通过Python中的缩进来定义的。以'开头的行%!<whitespace>'是前面块的一部分。
例如
%!test error ("this test fails!") %!test "test doesn't fail. it doesn't generate an error"
当测试失败时,您将看到以下内容:
***** test error ("this test fails!") !!!!! test failed this test fails!
通常,为了测试某个东西是否有效,您需要断言它返回了正确的值。真正的测试可能看起来像
%!test %! a = [1, 2, 3; 4, 5, 6]; B = [1; 2]; %! expect = [ a ; 2*a ]; %! get = kron (b, a); %! if (any (size (expect) != size (get))) %! error ("wrong size: expected %d,%d but got %d,%d", %! size (expect), size (get)); %! elseif (any (any (expect != get))) %! error ("didn't get what was expected."); %! endif
为了简化过程,请使用assert
作用例如,使用assert
之前的测试被简化为:
%!test %! a = [1, 2, 3; 4, 5, 6]; b = [1; 2]; %! assert (kron (b, a), [ a; 2*a ]);
assert
可以接受一个误差范围,这样你就可以解决或相对地比较结果。例如,以下全部成功:
%!test assert (1+eps, 1, 2*eps) # absolute error %!test assert (100+100*eps, 100, -2*eps) # relative error
您也可以自己进行比较,但仍有assertgenerate错误:
%!test assert (isempty ([])) %!test assert ([1, 2; 3, 4] > 0)
因为assert
在测试块中经常单独使用,有一种简写形式:
%!assert (...)
其相当于:
%!test assert (...)
偶尔,一组测试将取决于在Octave中是否具有可选函数。在测试这些块之前,必须检查所需函数的可用性。A.%!testif HAVE_XXX
只有在Octave是使用函数编译的情况下,块才会运行HAVE_XXX’. 例如稀疏单值分解,svds()
,取决于是否具有ARPACK依赖库的所有测试svds
以…开始
%!testif HAVE_ARPACK
回顾config.h或__octave_config_info__ ("build_features")
以查看要检查的一些可能值。
有时,在开发过程中,有一个测试本应有效,但却失败了。您仍然希望保留测试,因为当最终代码准备好时,测试应该会通过,但您可能无法立即修复它。为了避免这些已知故障的不必要的错误返回,请在块上符号xtest
而不是test
:
%!xtest assert (1==0) %!xtest fail ("success=1", "error")
在这种情况下,将运行测试,并返回任何失败。但是,测试不会中止,后续测试块将正常处理。的另一个用途xtest
是给统计学家的,他们大部分时间都应该通过,但偶尔会失败。
每个块都在其自己的函数环境中进行评估,这意味着一个块中定义的变量不会自动与其他块共享。如果确实要共享变量,则必须将它们语句为shared
在使用之前。例如,以下内容语句了变量a,给它一个初始值(defaultis empty),然后在随后的几个测试中使用它。
%!shared a %! a = [1, 2, 3; 4, 5, 6]; %!assert (kron ([1; 2], a), [ a; 2*a ]) %!assert (kron ([1, 2], a), [ a, 2*a ]) %!assert (kron ([1,2; 3,4], a), [ a,2*a; 3*a,4*a ])
您可以同时共享多个变量:
%!shared a, b
对共享变量的修改从一个测试持续到下一个测试只有如果测试成功。因此,如果一个测试修改了共享变量,那么后面的测试就无法知道共享变量的预期值,因为前面测试的通过/失败状态是未知的。因此,不建议在测试中修改共享变量。
您还可以共享测试函数:
%!function a = fn (b) %! a = 2*b; %!endfunction %!assert (fn(2), 4)
请注意,当语句新闻共享块时,所有前一个变量和值都将丢失。
记住这一点%!function
开始一个新的区块,并且%!endfunction
结束此块。请注意,在启动新块之前,以'开头的行%!<space>'将作为注释丢弃。以下内容与上面的示例几乎相同,但没有任何作用。
%!function a = fn (b) %! a = 2*b; %!endfunction %!assert (fn(2), 4)
因为后面有一个空格%!这个assert
语句并没有开始一个新的块,这一行被视为注释。
错误和警告块类似于测试块,但只有当代码生成错误时,它们才会成功。您可以使用可选的正则表达式来检查错误的文本是否正确<pattern>
例如
%!error <passes!> error ("this test passes!")
如果代码没有生成错误,则测试失败。例如
%!error "this is an error because it succeeds."
生产
***** error "this is an error because it succeeds." !!!!! test failed: no error
尽可能地自动化测试是很重要的,尽管有些测试需要用户交互。这些可以隔离到演示块中,如果您处于批处理模式,则仅在使用调用时运行demo
或者verbose
的参数test
。代码在执行之前显示。例如
%!demo %! t = [0:0.01:2*pi]; x = sin (t); %! plot (t, x); %! # you should now see a sine wave in your figure window
生产
funcname example 1: t = [0:0.01:2*pi]; x = sin (t); plot (t, x); # you should now see a sine wave in your figure window Press <enter> to continue:
请注意,演示块不能使用任何共享变量。这样它们就可以自己执行,而忽略所有其他测试。
如果要临时禁用测试块,请将#
代替块类型。这将创建一个注释块,该注释块在日志文件中回显显示但未执行。例如
%!#demo %! t = [0:0.01:2*pi]; x = sin (t); %! plot (t, x); %! # you should now see a sine wave in your figure window
以下琐碎的代码片段提供了使用il、assert、error和xtest的示例:
function output = must_be_zero (input) if (input != 0) error ("Nonzero input!") endif output = input; endfunction %!fail ("must_be_zero (1)") %!assert (must_be_zero (0), 0) %!error <Nonzero> must_be_zero (1) %!xtest error ("This code generates an error")
将其放入文件时must_be_zero.m,并且运行测试,我们看到
test must_be_zero verbose ⇒ >>>>> /path/to/must_be_zero.m ***** fail ("must_be_zero (1)") ***** assert (must_be_zero (0), 0) ***** error <Nonzero> must_be_zero (1) ***** xtest error ("This code generates an error") !!!!! known failure This code generates an error PASSES 3 out of 4 tests (1 expected failure)
%!test
%!test <MESSAGE>
检查整个块是否正确。如果<MESSAGE>
存在,测试块被解释为xtest
.
%!testif HAVE_XXX
%!testif HAVE_XXX, HAVE_YYY, …
%!testif HAVE_XXX, HAVE_YYY …; RUNTIME_COND
%!testif … <MESSAGE>
仅当Octave是使用函数编译时才检查块HAVE_XXX
.
RUNTIME_COND
是一个可选表达式,用于在执行测试时评估以检查是否满足某些条件。如果RUNTIME_COND
为false,则跳过测试。如果<MESSAGE>
存在时,测试块被解释为xtest
.
%!xtest
%!xtest <MESSAGE>
检查块,返回测试失败,但不要中止测试。如果<MESSAGE>
如果存在,则在测试失败时显示消息文本,如下所示:
!!!!! known bug: MESSAGE
如果消息是一个整数,它将被解释为Octave错误跟踪器的错误ID,并返回为
!!!!! known bug: https://octave.org/testfailure/?BUG-ID
其中BUG-ID是整数错误号。其目的是允许对已知问题进行更清晰的记录。
如果MESSAGE
是前面有星号的整数(例如。,*12345
),它被解释为已关闭的错误返回的id。这通常意味着在这个测试中探测到的问题已经解决。如果此类测试失败,则从返回为回归test
作用
!!!!! regression: https://octave.org/testfailure/?BUG-ID
%!error
%!error <MESSAGE>
%!warning
%!warning <MESSAGE>
检查是否有正确的错误或警告信息。如果<MESSAGE>
如果已应用,则将其解释为期望与错误或警告消息匹配的正则表达式模式。
%!demo
演示仅在交互模式下执行。
%!#
议论忽略块中的所有内容
%!shared x,y,z
语句在多个测试中使用的变量。
%!function
定义一个用于多个测试的函数。
%!endfunction
关闭函数定义。
%!assert (x, y, tol)
%!assert <MESSAGE> (x, y, tol)
%!fail (CODE, PATTERN)
%!fail <MESSAGE> (CODE, PATTERN)
的速记员%!test assert (x, y, tol)
或%!test fail (CODE, PATTERN)
如果<MESSAGE>
存在,测试块被解释为xtest
.
当编码测试时,Octave约定是以块类型开头的行末尾没有分号。然而,块中的任何代码都是正常的Octave代码,并且通常会有一个尾随的分号。例如
## bare block instantiation %!assert (sin (0), 0)
但是
## test block with normal Octave code %!test %! assert (sin (0), 0);
您还可以为内置函数和您自己的C++函数创建测试脚本。要做到这一点,请将一个具有裸函数名(no.mextension)的文件放在加载路径的目录中,它将被test
作用或者,您可以将测试直接嵌入到C++代码中:
/* %!test disp ("this is a test") */
或
#if 0 %!test disp ("this is a test") #endif
然而,在这种情况下,原始源代码需要位于加载路径中,并且用户必须记住输入test ("funcname.cc")
.
(cond)
¶
(cond,errmsg)
¶
(cond,errmsg, …)
¶
(cond,msg_id,errmsg, …)
¶
(observed,expected)
¶
(observed,expected,tol)
¶
如果不满足指定的条件,则会返回错误。
assert
可以用三种不同的方式调用。
assert (cond)
assert (cond, errmsg)
assert (cond, errmsg, …)
assert (cond, msg_id, errmsg, …)
使用单个参数调用cond,assert
如果cond为false(数字零)。
任何其他参数都会传递给error
函数进行处理。
assert (observed, expected)
如果观察到的与预期的不一样,则返回错误。
请注意observed和expected可以是标量、向量、矩阵、字符串、元胞数组或结构体。
assert (observed, expected, tol)
如果观察到与预期不相同,但数值数据的相等比较使用误差范围,则返回错误tol.
如果tol是正的,那么它是一个绝对误差范围,如果abs (observed - expected) > abs (tol)
.
如果tol为负,则为相对误差范围,如果abs (observed - expected) >
abs (tol * expected)
.
如果expected为零tol将始终被解释为不溶性耐受。
如果tol不是标量,其维度必须与的维度一致observed和expected并且在按个元件的基础上进行测试。
status=
fail (code)
¶
status=
fail (code,pattern)
¶
status=
fail (code警告
¶
status=
fail (code警告pattern)
¶
如果返回truecode失败,错误消息匹配pattern,否则会返回错误。
code必须采用字符串的形式,该字符串通过evalin
函数,即(带引号的)字符串常量或字符串变量。
请注意,如果code成功运行,而不是失败,打印的错误为:
expected error <.> but got none
如果使用两个参数调用,则返回值只有在code失败,错误消息包含pattern(区分大小写)。如果代码失败,错误与中指定的错误不同pattern则返回的消息是:
expected <pattern> but got <text of actual error>
尖括号不是输出的一部分。
使用调用时"warning"
参数fail
如果执行代码没有返回警告,则将返回错误。
版权所有 © 2024-2025 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-2