




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、用XUnit做白盒测试、黑盒测试1目录XUnit介绍 1、基础概念 2、为什么要XUnit 3、XUnit的一般结构XUnit与白盒测试 1、用PHPUnit做PHP单元测试 2、用CppUnit做C+单元测试XUnit与黑盒测试 1、用RubyUnit做黑盒测试2XUnit介绍1、基础概念 什么是单元测试 单元测试是最小粒度的测试,以测试某个功能或代码块。 简言之,就是验证开发者代码的最小集合(函数)是否正确实现了功能 单元测试的任务 1 模块接口测试;2 模块局部数据结构测试;3 模块边界条件测试;4 模块中所有独立执行通路测试;5 模块的各条错误处理通路测试。 3XUnit介绍单元测试的
2、优点1、它是一种验证行为。 程序中的每一项功能都是测试来验证它的正确性2、它是一种设计行为。 编写单元测试将使我们从调用者观察、思考。特别是先写测试(test-first),迫使我们把程序设计成易于调用和可测试的,即迫使我们解除软件中的耦合。3、它是一种编写文档的行为。 单元测试是一种无价的文档,它是展示函数或类如何使用的最佳文档。4、它具有回归性。 自动化的单元测试避免了代码出现回归,编写完成之后,可以随时随地的快速运行测试。 4XUnit介绍什么是XUnit XUnit系列是单元测试的一种模式,是一种测试思想与模型的集合,JUnit,CUnit,CppUnit,PHPUnit等单元测试框架
3、都是它的成员。 这些单元测试框架的思想与使用方式基本一致。只是针对了不同的语言实现。5XUnit介绍2、为什么要XUnit请看下面一段代码(此代码为伪代码):#maxnum.php=$b?$a:$b;#返回a,b的最大值?6XUnit介绍现在要对其功能进行测试,即单元测试编写测试代码:运行,测试结果:223”B”Hoho,简单!7XUnit介绍 可是当函数复杂,测试函数超级多的时候,这样输出很难定位是针对哪个测试用例,下次测试,还要看一遍测试代码,我们改成:这样就可以定位哪个成功那个失败了输出结果:1,2pass2,2pass2,3passA,Bpass8XUnit介绍上述测试我们做了下面几个
4、工作:1、调用被测函数,做了接口测试2、传递不同参数,测试函数功能3、返回测试结果,生成了简单的测试报告可是:1、万一一个测试用例发生异常,整个测试只能停止2、函数每条语句都测试到了吗?像复杂函数,怎么判断?3、每个测试结果我们都要用笨重的if.else+echo来判断成功还是失败吗4、函数抛异常测试怎么做呢9XUnit介绍可能你可以想出办法来解决这些问题,但为什么不试试已有的单元测试框架呢?3、XUnit一般结构XUnit是单元测试框架的一个大家族,它具有:Test Fixtures 针对函数的测试代码文件,即上面写的测试代码Test Suites 测试套件,用来组织测试代码Assertio
5、n 断言,简化测试结果判断,即替if.elseTest Execution 启动测试Test Result 生成详细的测试结果及报告10XUnit介绍用PHPUnit编写的测试代码举例: public function test_maxnum_1_2() $this-assertSame(maxnum(1,2),2,1,2参数测试失败); public function test_maxnum_2_3() $this-assertSame(maxnum(2,3),3,2,3参数测试失败); 成功结果失败结果11XUnit介绍可见用PHPUnit Assert函数比较测试结果十分简单;生成的测试
6、报告不仅定位失败用例,且列出详细结果和期望结果差异,且在一个用例失败后,不影响后面用例的执行;另外可生成详细测试报告文件;代码测试覆盖率报告;专门针对异常的测试模板12下面将按照以下步骤来介绍各XUnit1、测试工具安装2、测试框架原理3、生成测试框架4、编写测试用例5、运行测试脚本6、查看测试报告13用PHPUnit做白盒测试1、测试工具安装Linux下:标准安装:Yahoo域下:yinst i phpunit所在路径-/home/y/share/pear/PHPUnitWindows下: install pear: go-pear.bat pear channel-discover pea
7、r.phpunit.de pear install phpunit/PHPUnit pearPHPUnit14用PHPUnit做白盒测试2、测试框架原理TestCase -测试用 例TestSuite - 测试用例集合(套件)Assert - 断言TestResult 测试结果15用PHPUnit做白盒测试3、生成测试框架Linux下运行命令:PHPUnit -skeleton test为待测文件test为生成的测试文件如:PHPUnit -skeleton album.php albumtest.php生成的测试文件,文本结构解释:class UserApiImplTest extends
8、PHPUnit_Framework_TestCase,此类从PHPUnit框架继承 16用PHPUnit做白盒测试public static function main() require_once PHPUnit/TextUI/TestRunner.php; $suite = new PHPUnit_Framework_TestSuite(UserApiImplTest); $result = PHPUnit_TextUI_TestRunner:run($suite); #注册TestSuite,初始TestRunnerprotected function setUp()protected
9、functionTeardown()每条用例执行前后都要进行setup和 teardownpublic function testXXX() 自己编写的测试方法17用PHPUnit做白盒测试4、编写测试用例下面就开始往框架里填测试用例:public function test_maxnum_1_2() $this-assertSame(maxnum(1,2),2,1,2参数测试失败); 框架会自动识别以test开头的函数,认为是testcaseassert函数称为断言, assertSame(maxnum(1,2),2,“1,2参数测试失败”);表示判maxnum(1,2)是否等于2,如果不等
10、于,输出“1,2参数测试失败”;实际不输出,断言失败,PHPUnit也会给出报告Assert函数可以在/PHPUnit/Assert.php中查到,也可以在这个自己添加后调用,系统会判断assert的失败和成功并生成报告,如果没用assert,就只能自己写失败时的输出18用PHPUnit做白盒测试用例要根据函数功能、内部条件分支等设计,需要读懂代码,如测试创建专辑,要测试专辑名称,专辑数达上限后继续创建等异常测试有两种方法:1)在testcase设置捕获异常: public function testException( ) try / 被监控的代码 / Exception $this-fai
11、l(No Exception has been raised.);/如果没有异常则执行这句catch (Exception $expected) /添加捕获异常后的处理代码2)继承PHPUnit2_Extensions_ExceptionTestCase 类setExpectedException(Exception); /添加测试代码 ?19用PHPUnit做白盒测试可在case中添加运行超时设置来测试性能: $this-setMaxRunningTime(2); 运行超时则case失败测试过程中,有些函数依赖其他借口返回结果,而其他接口还没有完成,此时,可以用Mock类模拟接口,保证单元测
12、试正常进行,mock相当生成一个同原来类用相同结构的类被测试类:class helloworldpublic function update($arra) mock使用: . $observer = $this-getMock(helloworld, array(update);/ 设定update()方法的期望值为只被以字符串“something”为参数调用一次。$observer-expects($this-any() -method(update) -with($this-equalTo(foo) -will($this-returnValue(foos); .20用PHPUnit做白盒
13、测试从开发程序角度:编写的程序尽量满足PHPDocumentor格式,代码参考:项目开始阶段,应定义好类名、方法名、参数名、输出类型等,并用文档形式;开发过程中,尽量保持稳定,不要变化太多,更不要随着开发人员的喜好变化写测试脚本角度:编写测试程序,也要尽量有相应的满足PHPDocumentor格式。测试用例要尽量全面,提高代码覆盖率尽量降低测试用例的耦合度测试代码尽量简单,减少调试代码时间测试过程中,注意清理数据21用PHPUnit做白盒测试5、运行测试脚本phpunit test成功结果失败结果22用PHPUnit做白盒测试对每个测试,PHPUnit命令行测试工具打印一个字符表示进程:测试成
14、功打印“.”。运行测试方法是发生了断言失败打印“F”。运行测试方法是发生了错误打印“E”。测试没有完成或测试没有实现打印“I”用phpunit help或phpunit查看帮助,有很多选项,可根据需要选择可以用phpunit log-xml log test生成名为log的xml格式测试报告phpunit coverage-html coverage_path test在log_path中生成测试覆盖率报告注意运行此命令需加载php_xdebug扩展23用PHPUnit做白盒测试6、查看测试报告生成xml格式的log文件为: test_maxnum_2_3(MaxnumTest)2,3 par
15、as failsexpected integer difference got integer D:脩搂脧掳脦脛碌碌碌楼脭陋虏芒脢脭exampleunit.php:34 #尽量使用英文,否则会出现乱码24用PHPUnit做白盒测试生成的测试覆盖率文件:到文件保存的目录中,打开index.html,依次向下查看各模块,各类,各函数的覆盖率举例:专辑测试覆盖率25用CppUnit做白盒测试CppUnit是对C+代码进行单元测试的工具由于C+是编译型的语言,与PHP等解释型语言在编译和运行方法上有所不同简述下:Linux下开发C+代码的步骤1、编写.h,.cpp文件2、命令行运行编译命令g+,或编写
16、makefile文件后运行make命令。生成可执行文件3、运行生成的可执行文件./exefile26用CppUnit做白盒测试1、测试工具安装Linux下:Yahoo机器下:可到dist上直接取包安装: yinst i fa_cppunit 将自动安装cppunit到/home/y/lib(库文件)和 /home/y/include(头文件)下。一般安装:到上下载源代码 tar -zxvf cppunit-1.10.2.tar.gz cd进cppunit-1.10.2目录下。 修改configure的-prefix=install_path(没有root权限的必须要改这 个设置) ./conf
17、igure make make install 复制include目录到install_path/下27用CppUnit做白盒测试Windows下CPPUnit的官方网站上只提供了针对Visual C+的DLL,因此最好要有VC环境,也有极少数支持C+ Builder的参看:28用CppUnit做白盒测试2、测试框架原理CppUnit核心内容主要包括六个方面,1. 测试对象(Test,TestFixture,.):用于开发测试用例,以及对测试用例进行组织管理。2. 测试结果(TestResult):处理测试用例执行结果。TestResult与下面的TestListener采用的是观察者模式(O
18、bserver Pattern)。3. 测试结果监听者(TestListener):TestListener作为TestResult的观察者,担任实际的结果处理角色。4. 结果输出(Outputter):将结果进行输出,可以制定不同的输出格式。5. 对象工厂(TestFactory):用于创建测试对象,对测试用例进行自动化管理。6. 测试执行体(TestRunner):用于运行一个测试。与phpunit框架对比29用CppUnit做白盒测试3、生成测试框架在vc环境下有自动生成测试框架的功能,linux下暂时没有30用CppUnit做白盒测试4、编写测试用例测试步骤:1、首先要在测试类开始声明
19、testsuite CPPUNIT_TEST_SUITE(StringTest); CPPUNIT_TEST(testS添加用例 CPPUNIT_TEST_SUITE_END();2、注册一个testsuite空间的名字CPPUNIT_TEST_SUITE_REGISTRATION(StringTest,”suitename”);3、从注册的TestSuite中获取特定的TestSuite, 没有参数获取未命名的TestSuite. CppUnit:TestFactoryRegistry ®istry = CppUnit:TestFactoryRegistry:getRegistry(“
20、suitename); 4、实例化一个testrunner,并添加testsuite,运行runner.addTest( registry.makeTest() ); runner.run(); 示例程序:class StringTest : public CppUnit:TestFixture CPPUNIT_TEST_SUITE(StringTest); CPPUNIT_TEST(testSwap); CPPUNIT_TEST_SUITE_END();public: void setUp() void tearDown() void testSwap() . ;CPPUNIT_TEST_S
21、UITE_REGISTRATION(StringTest,suitename);int main(int argc, char* argv)CppUnit:TestRunner runner; runner.addTest(CppUnit:TestFactoryRegistry:getRegistry(suitename).makeTest(); runner.run(r);31用CppUnit做白盒测试CppUnit中验证的方法有: CPPUNIT_ASSERT(condition) / 确信condition为真 CPPUNIT_ASSERT_MESSAGE(message, condit
22、ion) / 当condition为假时失败, 并打印message CPPUNIT_FAIL(message) / 当前测试失败, 并打印message CPPUNIT_ASSERT_EQUAL(expected, actual) / 确信两者相等 CPPUNIT_ASSERT_EQUAL_MESSAGE(message, expected, actual) / 失败的同时打印message CPPUNIT_ASSERT_DOUBLES_EQUAL(expected, actual, delta) / 当expected和actual之间差大于delta时失败 32用CppUnit做白盒测试
23、将前面的示例程序中testSwap方法修改为: void testSwap() std:string m_str1 = Hello, world; std:string m_str2 = Hi, cppunit; std:string str1 = m_str1; std:string str2 = m_str2; m_str1.s); CPPUNIT_ASSERT(m_str1 = str2); CPPUNIT_ASSERT(m_str2 = str1); 并将文件保存为Main.cpp33用CppUnit做白盒测试5、运行测试脚本C+语言与PHP运行方式不同,CppUnit的运行方式都写到
24、程序中,使用testrunner,目前有三种: CppUnit:TextUi:TestRunner / 文本方式的TestRunnerCppUnit:QtUi:TestRunner/ QT方式的TestRunnerCppUnit:MfcUi:TestRunner/ MFC方式的TestRunner然后进行编译和链接(编译和链接使用makefile文件,这里不详述)Makfile的例子:注意加上cppunit的所在路径,-l指出要链接的库名,否则会找不到库文件INC_PATH = -I/home/y/includeLIB_PATH = -L/home/y/libmain: Main.cpp g+
25、 -g $(LIB_PATH) -lcppunit -ldl $(INC_PATH) Main.cpp -o main保存为Makefile运行 #make 生成可执行文件main,执行可执行文件./main即可得到结果34用CppUnit做白盒测试6、查看测试报告CppUnit在测试时会打印测试报告要想按需要生成测试报告,需要在程序中使用TestResult,TestListener,Outputter三个类,在main函数中添加 CppUnit:TestResultr;/新建一个result CppUnit:TestResultCollectorrc;/新建一个listener TestResultCollector继承于TestListener r.addListener(&rc);/结果收集器注册到testresult中 CppUnit:TextOutputter o(&rc, std:cout); /*std:cout是将结果以text方式输出到屏幕,要以xml输出至文件可以改成 std:ofstream fd(tt.txt); CppUnit:XmlOutputter o(&rc, fd);*/ o.write(); / 将结果输出 35用CppUnit做白盒测试Outputter下有三个子类:Tex
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025届浙江省杭师大附中高考英语五模试卷含解析
- 重庆綦江区2025届高三二诊模拟考试英语试卷含答案
- 海南省东方市民族中学2025届高三第二次调研英语试卷含解析
- 山东省青州第二中学2025年高三考前热身英语试卷含答案
- 2025届云南省临沧市重点中学高三下学期第五次调研考试英语试题含答案
- 2025届陕西省渭南市三贤中学高三下学期第一次联考英语试卷含答案
- 安徽省合肥三十五中2025届高三第二次联考英语试卷含解析
- 2025届新疆石河子市第二中学高三六校第一次联考英语试卷含答案
- 家庭防水施工合同
- 船体喷字施工方案
- 心肺复苏完整版本
- 220kV变电站电气设备常规交接试验方案
- 银行比较新颖的沙龙活动
- 九年级道德与法治上册 第二单元 民主与法治 第四课 建设法治中国教案 新人教版
- 北京市2024年中考历史真题试卷(含答案)
- 学习《吴军阅读与写作》 (50讲 )
- 房产证代办服务合同
- 尾矿库基本知识
- 财会实操-体育馆的账务处理分录
- DL∕T 1094-2018 电力变压器用绝缘油选用导则
- 2024山东能源集团中级人才库选拔高频考题难、易错点模拟试题(共500题)附带答案详解
评论
0/150
提交评论