B.1测试函数

 
:测验 name
:测验 namequiet|normal|verbose
:测验 ("name“,”安静|正常|冗长“,fid)
:测验 ("name“,”安静|正常|冗长“,filename)
:成功= 测验 (…)
:[n,nmax,nxmail,nbug,nskip,nrtskip,回归] = 测验 (…)
:[密码,idx] = 测验 ("name“,”grabdemo“)
:测验 解释fid)
:测验 解释filename)

从加载路径匹配中的第一个文件执行内置自检name.

测验可以以命令或函数形式调用。测试的精确操作从模式(交互式或观察)、返回级别的组合决定(轻声的,典型的,冗长的),以及是否使用日志文件或摘要输出变量。

默认模式当测验从命令行调用是交互的。在这种模式下,将运行测试,直到第一个错误被消除,或者所有测试都成功完成。在批处理模式下,所有测试都将运行,而不考虑任何失败,并收集结果以进行返回。需要用户交互的测试,即演示块,永远不会以批处理模式运行。

批处理模式可通过以下方式启用:1)使用第三层指定日志文件filenamefid,或2)指定输出参数,例如成功,n

可选的第二个参数确定要生成的输出量以及要运行的测试类型。默认值为典型的。除非启用了详细返回,否则指定输出参数将禁止打印最终汇总消息和任何中间警告。

轻声的

当所有测试都通过时,打印一条摘要消息,或者当失败时,打印带有第一个错误测试结果的错误。不要运行需要用户交互的测试。

典型的

在测试执行期间显示有关跳过的测试或失败的xtest的警告消息。当所有测试都通过时,打印一条摘要消息,或者当失败时,打印带有第一个错误测试结果的错误。不要运行需要用户交互的测试。

冗长的

执行前显示测试。打印所有警告消息。在交互模式下,运行所有测试,包括那些需要用户交互的测试。

可选的第三个输入参数指定了应该写入测试结果的日志文件。日志文件可以是字符串(filename)或打开的文件描述符ID(fid). 要启用批处理,但仍将结果打印到屏幕上,请使用标准输出对于fid.

仅使用单个输出参数调用时成功,测验如果所有测试都成功,则返回true。如果使用多个输出参数调用,则成功测试的数量(n),文件中的测试总数(nmax),xtest故障的数量(nxmail),从于已知错误而失败的测试数(nbug),从于缺少函数而跳过的测试数(nskip),从于运行时条件而跳过的测试数(nrtskip),以及回归次数(回归)返回。

用例

测试sind⇒通过5次测试中的5次[n,nmax]=测试(“sind”)⇒n=5最大值=5

附加调用Syntax

如果第二个参数是字符串“grabdemo”,任何内置演示块的内容都会被提取,但不会被执行。所有代码块的文本被连接并返回为密码具有idxbeinga是每个演示块末端位置的向量。有关从文件中提取演示块的更简单方法,详见实例.

如果第二个参数是解释然后name被忽略,并且对中使用的线符号的解释测验输出返回被写入从指定的文件filenamefid.

详见: 明确肯定,失败,演示,实例,错误.

测验扫描命名脚本文件,查找以标识符“”开头的行%!’. 前缀被去除,行的剩余部分通过Octave解释器进行处理。如果代码生成错误,则称测试失败。

自从eval()将在遇到第一个错误时停止,您必须将测试划分为多个块,并分别评估单独块中的任何内容。块从有效关键字引入,如测验,作用明确肯定紧随其后'%!’.块是通过Python中的缩进来定义的。以'开头的行%!<空白>'是前面块的一部分。

例如

%!测试错误(“此测试失败!”)%!test“测试不会失败。它不会返回错误”

当测试失败时,您将看到以下内容:

*****测试错误(“此测试失败!”)!!!!!测试失败了这个测试失败了!

通常,为了测试某个东西是否有效,您需要断言它返回了正确的值。真正的测试可能看起来像

%!测验a= [1, 2, 3; 4, 5, 6]; B=[1;2];%!预料a; 2.a];%! get=克朗(b,a);%! if(any)size(expect)!=size(get))%!错误(“错误的大小:应为%d,%d,但得到的是%d,%d”,%!大小(应为),大小(获得));%!elseif(any(any(expect!=get))%!错误(“没有得到预期的结果。”);%!endif

为了简化过程,请使用明确肯定作用例如,使用明确肯定之前的测试被简化为:

%!测验a= [1, 2, 3; 4, 5, 6];b= [1; 2];%! 断言(克朗(b,a), [a; 2.a]);

明确肯定可以接受一个公差,这样你就可以解决或相对地比较结果。例如,以下全部成功:

%!测试断言(1+eps,1,2*eps)#绝对错误%!测试断言(100+100*eps,100,-2*eps)#相对错误

您也可以自己进行比较,但仍有assertgenerate错误:

%!测试断言(isempty([]))%!测试断言([1,2;3,4]>0)

因为明确肯定在测试块中经常单独使用,有一种简写形式:

%!明确肯定

其相当于:

%!测试断言(…)

偶尔,一组测试将取决于在Octave中是否具有可选函数。在测试这些块之前,必须检查所需函数的可用性。A.%!证明HAVE_XXX只有在Octave是使用函数编译的情况下,块才会运行有_XXX’. 例如稀疏单值分解,svds(),取决于是否具有ARPACK图书馆的所有测试svds以…开始

%!证明HAVE_ARPACK

回顾配置h__octave_config_info__(“构建函数”)以查看要检查的一些可能值。

有时,在开发过程中,有一个测试本应有效,但却失败了。您仍然希望保留测试,因为当最终代码准备好时,测试应该会通过,但您可能无法立即修复它。为了避免这些已知故障的不必要的错误返回,请在块上符号xtest而不是测验:

%!xtest断言(1==0)%!xtest失败(“success=1”,“error”)

在这种情况下,将运行测试,并返回任何失败。但是,测试不会中止,后续测试块将正常处理。的另一个用途xtest是给统计学家的,他们大部分时间都应该通过,但偶尔会失败。

每个块都在其自己的函数环境中进行评估,这意味着一个块中定义的变量不会自动与其他块共享。如果确实要共享变量,则必须将它们语句为共享在使用之前。例如,以下内容语句了变量a,给它一个初始值(defaultis empty),然后在随后的几个测试中使用它。

%!共享a%!a= [1, 2, 3; 4, 5, 6];%!断言(kron([1;2],a), [a; 2.a])%!断言(kron([1,2],a), [a2.a])%!断言(kron([1,2;3,4],a), [a2.a; 3.a4.a])

您可以同时共享多个变量:

%!共享a,b

对共享变量的修改从一个测试持续到下一个测试只有如果测试成功。因此,如果一个测试修改了共享变量,那么后面的测试就无法知道共享变量的预期值,因为前面测试的通过/失败状态是未知的。因此,不建议在测试中修改共享变量。

您还可以共享测试函数:

%!作用a=fn(b)%!a2.b;%!endfunction%!断言(fn(2),4)

请注意,当语句新闻共享块时,所有前一个变量和值都将丢失。

记住这一点%!作用开始一个新的区块,并且%!结束函数结束此块。请注意,在启动新块之前,以'开头的行%!<空间'将作为注释丢弃。以下内容与上面的示例几乎相同,但没有任何作用。

%!作用a=fn(b)%!a2.b;%!endfunction%!断言(fn(2),4)

因为后面有一个空格%!这个明确肯定语句并没有开始一个新的块,这一行被视为注释。

错误和警告块类似于测试块,但只有当代码生成错误时,它们才会成功。您可以使用可选的正则表达式来检查错误的文本是否正确图案例如

%!错误<passs!>错误(“此测试通过!”)

如果代码没有生成错误,则测试失败。例如

%!error“这是一个错误,因为它成功了。”

生产

*****error“这是一个错误,因为它成功了。”!!!!!测试失败:没有错误

尽可能地自动化测试是很重要的,尽管有些测试需要用户交互。这些可以隔离到演示块中,如果您处于批处理模式,则仅在使用调用时运行演示或者冗长的的参数测验。代码在执行之前显示。例如

%!演示%!t=[0:0.01:2*pi];xt);%! 情节t,x);%! # 您现在应该在图形窗口中看到一个正弦波

生产

funcname示例1:t=[0:0.01:2*pi];xt); 情节t,x); # 现在,您应该在图形窗口中看到一个正弦波。按<enter>继续:

请注意,演示块不能使用任何共享变量。这样它们就可以自己执行,而忽略所有其他测试。

如果要临时禁用测试块,请将#代替块类型。这将创建一个注释块,该注释块在日志文件中回显显示但未执行。例如

%!#演示%!t=[0:0.01:2*pi];xt);%! 情节t,x);%! # 您现在应该在图形窗口中看到一个正弦波

以下琐碎的代码片段提供了使用il、assert、error和xtest的示例:

作用输出=必须_be_zero(输入如果输入!= 0)error(“Nonzero input!”)endif输出=输入;endfunction%!失败(“must_be_zero(1)”)%!assert(must_be_zero(0),0)%!错误<Nonzero>must_be_zero(1)%!xtest错误(“此代码生成错误”)

将其放入文件时必须_be_zero.m,并且运行测试,我们看到

测试必须_be_zero详细⇒>>>>> /路径/到/must_be_zero.m*****失败(“must_be_zero(1)”)*****断言(must_be_ezero(0),0)*****错误<Nonzero>must_be_0ero(1)*****xtest错误(“此代码生成错误”)!!!!!已知故障此代码生成错误通过4次测试中的3次(1次预期故障)

块类型摘要:

%!测验
%!测试<消息>

检查整个块是否正确。如果<消息>存在,测试块被解释为xtest.

%!证明HAVE_XXX
%!证明哈维XXX,哈维YYY…
%!证明HAVEXXX、HAVEYYY…;运行时_COND
%!证明…<消息>

仅当Octave是使用函数编译时才检查块有_XXX. 运行时_COND是一个可选表达式,用于在执行测试时评估以检查是否满足某些条件。如果运行时_COND为false,则跳过测试。如果<消息>存在时,测试块被解释为xtest.

%!xtest
%!xtest<消息>

检查块,返回测试失败,但不要中止测试。如果<消息>如果存在,则在测试失败时显示消息文本,如下所示:

!!!!! 已知错误:消息

如果消息是一个整数,它将被解释为Octave错误跟踪器的错误ID,并返回为

!!!!! 已知错误:https://octave.org/testfailure/?BUGid

其中BUG-ID是整数错误号。其目的是允许对已知问题进行更清晰的记录。

如果message是前面有星号的整数(例如。,*12345),它被解释为已关闭的错误返回的id。这通常意味着在这个测试中探测到的问题已经解决。如果此类测试失败,则从返回为回归测验作用

!!!!! 回归:https://octave.org/testfailure/?BUGid
%!错误
%!错误<消息>
%!警告
%!警告<消息>

检查是否有正确的错误或警告信息。如果<消息>如果已应用,则将其解释为期望与错误或警告消息匹配的正则表达式模式。

%!演示

演示仅在交互模式下执行。

%!#

议论忽略块中的所有内容

%!共享x、y、z

语句在多个测试中使用的变量。

%!作用

定义一个用于多个测试的函数。

%!结束函数

关闭函数定义。

%!断言(x,y,tol)
%!断言<消息>(x,y,tol)
%!失败(代码、模式)
%!失败<消息>(代码,模式)

的速记员%!测试断言(x,y,tol)%!测试失败(代码、模式)如果<消息>存在,测试块被解释为xtest.

当编码测试时,Octave约定是以块类型开头的行末尾没有分号。然而,块中的任何代码都是正常的Octave代码,并且通常会有一个尾随的分号。例如

##裸块实例化%!assert(sin(0),0)

但是

##具有正常Octave代码%!的测试块!测验assert(sin(0),0);

您还可以为内置函数和您自己的C++函数创建测试脚本。要做到这一点,请将一个具有裸函数名(no.mextension)的文件放在加载路径的目录中,它将被测验作用或者,您可以将测试直接嵌入到C++代码中:

/*%!test disp(“这是一个测试”)*/

#如果0%!test disp(“这是一个测试”)#endif

然而,在这种情况下,原始源代码需要位于加载路径上,并且用户必须记住输入test(“funcname.cc”).

 
:明确肯定 (cond)
:明确肯定 (cond,错误消息)
:明确肯定 (cond,错误消息, …)
:明确肯定 (cond,消息_id,错误消息, …)
:明确肯定 (观察,预期)
:明确肯定 (观察,预期,tol)

如果不满足指定的条件,则会返回错误。

明确肯定可以用三种不同的方式调用。

明确肯定cond)
明确肯定cond,错误消息)
明确肯定cond,错误消息, …)
明确肯定cond,消息_id,错误消息, …)

使用单个参数调用cond,明确肯定如果cond为false(数字零)。

任何其他参数都会传递给错误函数进行处理。

明确肯定观察,预期)

如果观察到的与预期的不一样,则返回错误。

请注意观察预期可以是标量、向量、矩阵、字符串、元胞数组或结构体。

明确肯定观察,预期,tol)

如果观察到与预期不相同,但数值数据的相等比较使用公差,则返回错误tol.

如果tol是正的,那么它是一个绝对公差,如果abs(观察-预期)>腹肌(tol).

如果tol为负,则为相对公差,如果abs(观察-预期)>腹肌(tol * 预期).

如果预期为零tol将始终被解释为不溶性耐受。

如果tol不是标量,其维度必须与的维度一致观察预期并且在按个元件的基础上进行测试。

详见: 失败,测验,错误,isequal.

 
:status= 失败 (密码)
:status= 失败 (密码,图案)
:status= 失败 (密码警告
:status= 失败 (密码警告图案)

如果返回true密码失败,错误消息匹配图案,否则会返回错误。

密码必须采用字符串的形式,该字符串通过伊瓦林函数,即(带引号的)字符串常量或字符串变量。

请注意,如果密码成功运行,而不是失败,打印的错误为:

预期错误<.>但一个也没有

如果使用两个参数调用,则返回值只有在密码失败,错误消息包含图案(区分大小写)。如果代码失败,错误与中指定的错误不同图案则返回的消息是:

预期<图案>但得到了<实际错误的文本>

尖括号不是输出的一部分。

使用调用时警告参数失败如果执行代码没有返回警告,则将返回错误。

详见: 明确肯定,错误.


版权所有 © 2024 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号