资源预览内容
第1页 / 共51页
第2页 / 共51页
第3页 / 共51页
第4页 / 共51页
第5页 / 共51页
第6页 / 共51页
第7页 / 共51页
第8页 / 共51页
第9页 / 共51页
第10页 / 共51页
亲,该文档总共51页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
MATLAB 中论坛技术专栏系列 MATLAB 单元测试框架 MATLAB 中论坛出品 目录 0.1什么是框架 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 0.2基于函数的单元测试的构造 . . . . . . . . . . . . . . . . . . . . . . . . . . . .1 0.3getArea 函数的单元测试: 版本 I . . . . . . . . . . . . . . . . . . . . . . . . .3 0.4getArea 函数的单元测试: 版本 II 和版本 III. . . . . . . . . . . . . . . . . .8 0.5测试的准备和清理作: Test Fixtures . . . . . . . . . . . . . . . . . . . . . .11 0.6验证法: Types of Qualification . . . . . . . . . . . . . . . . . . . . . . . . .15 0.7测试法论和测试驱动开发. . . . . . . . . . . . . . . . . . . . . . . . . .19 0.7.1开发流程概述. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .19 0.7.2测试驱动开发:fibonacci 例. . . . . . . . . . . . . . . . . . . . . . . . .21 0.7.3测试驱动开发:算符重载和量纲分析. . . . . . . . . . . . . . . . . . . . .25 0.8基于类的单元测试 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .38 0.8.1getArea 函数的基于类的单元测试. . . . . . . . . . . . . . . . . . . . . . .38 0.8.2MVC GUI 的基于类的单元测试. . . . . . . . . . . . . . . . . . . . . . . .40 作者简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .46 更多 MATLAB 中文论坛技术文章. . . . . . . . . . . . . . . . . . . . . . . . . .47 1 MATLAB 单元测试框架1 0.1什么是框架 从逻辑上来说,框架 (Framework),是个向对象和设计模式更加复杂的结构,但 读者不担,虽然框架在结构上模式要复杂,但是学习起来要设计模式简单得多。我 们这介绍的不是关于如何设计框架,是介绍如何利现成的框架为程计算服务,理解 设计模式不是使框架的前提,甚不理解向对象,也可以享受框架给我们程计算带 来的便利。 设计模式教给我们的是编程的指导思想,没有现成的代码可以直接套,模式每次的使 ,都要通过重新编程来实现;框架,是包装好的即时可以使的代码,可以直接的反复 被使。设计模式处理的是软件程序设计中的局部的为,框架处理的是更系统。模式 是组成框架的基,框架的设计和实现包含中多种模式。设计模式的应范围很,框架 通常限定了应范围,如:单元测试框架保证我们在算法开发的同时能够保证已有的程序 功能不会退化,性能测试框架保证算法性能不退化,便的较不同算法的性能。 0.2基于函数的单元测试的构造 在附录?中介绍 inputParser 的时候,我们通过不断改进 getArea 函数对输参数的处 理法,引这样个观点:个可靠的科学程计算项必须有套测试系统,才能防 开发的过程中算法退化,程项的推进必须在算法开发和算法测试之间不断迭代完成。在 附录?的最后, 还根据直觉提出了个测试系统所应该有的基本功能。在本章中,我们将学 习 MATLAB 从 R2013a 开始提供的测试解决案:MATLAB 单元测试 (MATLAB Unit Tests)。MATLAB 单元测试框架可以接受不同格式的测试件,本书介绍两种,种是基于 函数 (Function-Based) 的,另种基于类件 (Class-Based) 如图1所,先介绍基于函数的单 元测试。 MATLAB单元测试框架 Function-Based 用户提供测试函数 Class-Based 用户提供测试类 图 1单元测试 Framework 和两个风格的单元测试 MATLAB 基于函数的单元测试构造很简单,户通过个主测试函数和若局部测 试函数x(Local Function) 来组织各个测试。测试的运则交给 MATLAB 的单元测试 Framework 去完成。 主测试函数和局部测试函数看上去和普通的 MATLAB 函数没有区别,如图2所,只 是命名上有些规定已,这些特殊的规定是为了 Framework 可以和测试函数契合规定 的。 x也叫做测试点 2MATLAB 中论坛技术专栏 testmainfunc.m function tests = testmainfunc . end function testPoint1(testCase) .1 end function testPoint2(testCase) .2 end 图 2简单的主测试函数和若局部的测试函数构成的个单元测试 命名规则如下:主函数的名称由户任意指定,和其他的 MATLAB 函数件样,该 件的名称需要和函数的名称的相同. (如果主函数的名称是testmainfunc, 该件名称则 是testmainfunc.m)。 在主函数中, 必须调个叫做functiontests 的函数, 搜集该函数中 的所有局部函数,产个包含这些局部函数的函数局部的测试矩阵并返回给 Framework, 如下所: testmainfunc.m function tests = testmainfunc tests = functiontests(localfunctions);% 主测试函数中必须要有这个命令 end . 其中localfunctions 是个 MATLAB 函数,来返回所有局部函数的函数句柄。 局部函数的命名必须以test 开头,局部函数只接受个输参数,即测试对象, 即下 例中的形参 testCase testmainfunc.m . function testPoint1(testCase)% 只接受一个输入参数 testCase.verifyEqual(.); end function testPoint2(testCase)% 只接受一个输入参数 testCase.verifyEqual(.); end . 其中 testCase 由单元测试 Framework 提供, 即 Framework 将动的调该函数,并且提供 testCase 参数。 按照规定,要运单元测试中的所有测试,必须调 runtests 函数 command line runtests(testmainfunc.m) 下我们基于函数的单元测试来给 getArea 函数的构造其单元测试。 MATLAB 单元测试框架3 0.3getArea 函数的单元测试: 版本 I 先给主测试件起个名字叫做 testGetArea,该名字是任意的,为了便于理解名字 通常包含 test, 并包含要测试的主要函数的名字: testGetArea.m function tests = testGetArea tests = functiontests(localfunctions); end 在该主函数中,localfunctions 将搜集所有的局部函数,构造函数句柄数组并返回测试矩阵。 这然会有个问题,这个 tests 句柄数组将返回给谁,这就要了解 Framework 是如何和 测试相互作的。如图3所,整个测试从runtests(testmainfunc.m) 命令开始,命 令函数,Framework 将先调 testGetArea 的主函数,得到所有的局部函数的函数句柄, 如空箭头线段所,然后 Framework 再负责调每个测试局部函数,并且把 testCase 当做参数提供给每个局部函数, 如虚线线段所。我们可以把 Framework 想象成个流 线,户只需要通过runtests(testmainfunc.m) 把”testmainfunc.m” 放到流线上并且 打开开关” 就可以了。它是 MATLAB 的类 matlab.unittest.FunctionTestCase 的对象。 runtests(testmainfunc.m) Framework 把工作交给Framework 从运行runtests开始 testGetArea 得到所有局部函数的函数句柄 依次调用每个局部函数 并提供testCase作为参数 图 3单元测试 Framework 和测试函数的相互作 返回的 testCase 是类 matlab.unittest.FunctionTestCase 的对象,有很多成员验证 法可以提供给户调,回忆我们的第版的 getArea 函数如下, 要求函数接受两个参数, 并且都是数值类型: 第一版的 getArea 函数 function a = getArea(wd,ht) p = inputParser; p.addRequired(width, isnumeric); % 检查输入必须是数值型的 p.addRequired(height,isnumeric); p.parse(wd,ht); 4MATLAB 中论坛技术专栏 a = p.Results.width*p.Results.height;% 从 Results 处取结果 end 我们先给这个 getArea 写第个测试点,确保测试 getArea 函数在接受两个参数的时 候,能给出正确的答案 testGetArea.m function tests = testGetArea tests = functiontests(localfunctions); end % 添加了第一个测试点 function testTwoInputs(testCase) testCase.verifyTrue(getArea(10,22)=220,!=220); testCase.verifyTrue(getArea(3,4)=12,!=12); end 我们给 testGetArea.m 添加个局部函数叫做 testTwoInputs, 按照规定,该局部函数的名 字要以 test 开头,后的名字要能够尽量反应该测试点的实际测试的内容。verifyTrue 是 个 testCase 对象所持的法,它来验证其第个参数,作为个表达式,是否为真。 verifyTrue 的第个参数接受字符串,在测试失败时提供诊断提。 个很常见的问题是: getArea 是个极其简单的函数,内部的作就是把两个输相 乘,在这验证getArea(10,22) = 220 真的有必要吗?请读者记住这个问题,它是单元测 试的精要之。 下我们来运这个测试: command line results =runtests(testGetArea) Running
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号