资源预览内容
第1页 / 共34页
第2页 / 共34页
第3页 / 共34页
第4页 / 共34页
第5页 / 共34页
第6页 / 共34页
第7页 / 共34页
第8页 / 共34页
第9页 / 共34页
第10页 / 共34页
亲,该文档总共34页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第第8章章 JUnit测试工具简介测试工具简介JUnit概述概述 1运用运用JUnit编写测试编写测试2测试的内容测试的内容 3主主要要内内容容8.1 JUnit概述JUnit是一个开源的java测试框架,它是Xuint测试体系架构的一种实现。JUnit最初由Erich Gamma 和 Kent Beck所开发。在JUnit单元测试框架的设计时,设定了三个总体目的,第一个是简化测试的编写,这种简化包括测试框架的学习和实践测试单元的编写;第二个是使测试单元坚持耐久性;第三个那么是可以利用既有的测试来编写相关的测试。 8.2 运用JUnit编写测试 1、构建单元测试 测试代码必需求做的事情: 预备测试所需求的各种条件创建一切必需的对象,分配必要的资源等 调用要测试的方法 验证被测试方法的行为和期望能否一致 完成后清理各种资源(Internal Only) (Delivered)8.2 运用JUnit编写测试 1、构建单元测试 测试代码用普通的方式编写和编译 当执行测试代码的时,从来不直接运用产品代码8.2 运用JUnit编写测试 2、JUnit的各种断言 JUnit提供了一些辅助函数,用于协助确定某个被测试函数能否任务正常。通常把一切这些函数统称为断言。 每一个断言assert方法都会记录能否失败了断言为假或有错误了遇到一个预料外的异常的情况,并经过JUnit的一些类来报告这些结果当一个失败或者错误出现的时候,当前测试方法的执行流程将会被中止,但是位于同一个测试类中的其它测试将会继续运转。 8.2 运用JUnit编写测试 2、JUnit的各种断言 assertEquals assertEquals( Sting message, expected, actual ) 相等性测试 expected是期望值通常都是硬编码的,actual是 被 测 试 代 码 实 践 产 生 的 值 ,message是一个可选的音讯,假设提供的话,将会在发生错误时报告这个音讯。 如想用断言来比较浮点数在Java中是类型为float或者double的数,那么需指定一个额外的误差参数。 assertEquals(Sting message, expected, actual, tolerance) 8.2 运用JUnit编写测试 2、JUnit的各种断言 assertNull assertNull(Sting message,java.lang.Object object)assertNotNull(Sting message,java.lang.Object object) 验证一个给定的对象能否为null(或者为非null),假 设 答 案 为 否 , 那 么 将 会 失 败 。Message参数是可选的。8.2 运用JUnit编写测试 2、JUnit的各种断言 assertSame assertSame(Sting message,expected,actual)验证expected参数和actual参数所援用的能否为同一个对象,假设不是将会失败。Message参数是可选的assertNotSame(Sting message,expected,actual)验证expected参数和actual参数所援用的能否 为 不 同 的 对 象 , 如 一 样 将 会 失 败 。Message参数是可选的8.2 运用JUnit编写测试 2、JUnit的各种断言 assertTrue assertTrue(Sting message,Boolean condition)验证给定的二元条件能否为真,假设为假将会失败。Message参数是可选的。assertFalse(Sting message,Boolean condition)验证给定的二元条件能否为假;假设不是的话为真,该测试将会失败,message参数是可选的。 8.2 运用JUnit编写测试 2、JUnit的各种断言 FailFail(Sting message)将会使测试立刻失败,其中message参数是可选的。这种断言通常被用于标志某个不应该被到达的分支8.2 运用JUnit编写测试 2、JUnit的各种断言 普通而言,一个测试方法包含有多个断言,由于需求验证该方法的多个方面以及内在的多种联络。当一个断言失败的时候,该测试方法将会被中止,从而导致该方法中余下的断言这次就无法执行了,此时只能是在继续测试之前先修复这个失败的测试。依此类推,不断地修复一个又一个的测试,沿着这条途径渐渐前进。8.2 运用JUnit编写测试 3、JUnit框架 import junint.framework.*;public class Testsimple extends TestCase public TestSimple (String name) super(name);public void testAdd() assertEquals(2,1+1);public void testAdds() assertEquals(2,1+14); assertEquals(4,2+2); assertEquals(-8,-12+4);8.2 运用JUnit编写测试 4、JUnit 测试的组成 一个测试类包含一些测试方法;每个方法包含一个或者多个断言语句;测试类也能调用其它测试类:单独的类、包、甚至一个完好的系统;可以经过创建test suite来获得 。8.2 运用JUnit编写测试 4、JUnit 测试的组成 任何测试类都能包含一个名为suite的静态方法:public static Test suite();可以提供suite()方法来前往任何想要的测试集合没有siute()方法JUnit会自动运转一切的test方法。但是能够需求手工添加特殊的测试,包括其它suite。 8.2 运用JUnit编写测试 4、JUnit 测试的组成 import junit.framework.*;public class TestClassOne extends TestCase public TestClassOne(String method) super(method);public void testAddition() assertEquals(4,2+2);public void testSubtraction() assertEquals(0,2-2);8.2 运用JUnit编写测试 4、JUnit 测试的组成 import joint.framework.*;public class TestClassComposite extends TestCase public TestClassComposite(String method) super(method); static public Test suite() TestSuite suite =new TestSuite(); /Grab everything: suite.addTestSuite(TestClassOne.class); /Use the suite method: suite.addTest(TestClassTow.suite(); return suite; 8.2 运用JUnit编写测试 4、JUnit 测试的组成Per-method的Setup和Tear-down 每个测试的运转都应该是相互独立的;从而可以在任何时候,以恣意的顺序运转每个单独的测试。为此,在每个测试开场之前,都需求重新设置某些测试环境,或者在测试完成之后,需求释放一些资源。JUnit的TestCase基类提供两个方法供改写,分别用于环境的建立和清理:protected void setup();protected void teardown(); 8.2 运用JUnit编写测试 4、JUnit 测试的组成Per-method的Setup和Tear-down 假设对于每个测试,都需求某种数据库衔接。这时只须在setup和teardown方法中分别建立和释放衔接: public class Test DB extends TestCase private connection dbConn; protected void setup() dbConn =new Connection(“oracle,1521, “fred,foobar); dbConn.connect();protected void teardown() dbConn.disconnect(); dbConn=null;public void testAccountAccess() /Uses dbConn xxx xxx xxxxxx xxx xxxxxxxxx; xx xxx xxx xxxx x xx xxxx;public void testEmployeeAccess() /Uses ddbConn xxx xxx xxxxxx xxx xxxxxxxxx; xxxx x x xx xxx xx xxxx; 8.2 运用JUnit编写测试 4、JUnit 测试的组成Per-suite SetUp和Tear-down 在某些情况下,须为整个test suite设置一些环境,以及在test-suite中的一切方法都执行完成后做一些清理任务。要到达这种效果,需求per-suite setup和per-suite tear-down。 Per-suite 的setup要复杂些。需求提供所需测试的一个suite 无论经过什么样的方法 并且把它包装进一个TestSetup对象。 8.2 运用JUnit编写测试 4、JUnit 测试的组成Per-suite SetUp和Tear-down import junit.framework.*;import junit.extensions.*;public class TestClassTow extends TestCase private static TSP tsp; public TestClassTow (String method) super(method);/This one takes a few hourspublic void testLongRunner() assertEquals(2300,tsp.shortestPath(50);public void testShort Test() assertEquals(140,tsp.shortestPath(5);public void testAnotherShortTest() assertEquals(586,tsp.shortestPath(10);public static Test suite() TestSuite suite=new TestSuite (); /only include short tests suite.addTest(new TestClassTow(“testShortTest); suite.addTest(new TestClassTow (“testAnotherShortTest); TestSetup wrapper=new TestSetup(suite) protected void setUp() OoeTimeSetUp();protected void tearDown() oneTimeTearDown();return wrapper8.2 运用JUnit编写测试 4、JUnit 测试的组成Per-suite SetUp和Tear-down public static void onetimeSetUp() /one-time initialization code goes heretsp =new TSP();tsp.loadCities(“EasternSeaboard);public static void oneTimeTearDown() /one-time cleanup code goes here tsp.releaseCities(); 8.2 运用JUnit编写测试 5、自定义Junit断言 在某些环境下,譬如要处置一个特殊的数据类型,或者处置对多个测试都共享的一系列操作,那么假设有自定义的断言,将会更加方便。 在测试代码中,需求把公共的测试代码抽取到方法中去,并且在测试用例中运用这些方法。思索从TestCase承继一个类并且运用这个子类来进展一切的测试。 8.2 运用JUnit编写测试 5、自定义Junit断言 import junit.framework.*; /*project-wide base class for Testing*/ public class ProjectTest extends TestCase /* *Assert that the amount of money is an even *number of dollars (no cents) *param message Text message to display if the * assertion fails *param amount Money object to test * */ public void assertEvenDollars(String message,Money amount) assertEquals(message,amount.asDouble()-(int)amount.asDouble(),0.0,0.001); /*/* *Assert that the amount of money is an even *Assert that the amount of money is an even * * *param amount Money object to test *param amount Money object to test * * */ */ public void assertEvenDollars (Money amount) public void assertEvenDollars (Money amount) assertEvenDollars(“ assertEvenDollars(“,amount);,amount); 8.2 运用JUnit编写测试 6、JUnit和异常JUnit框架可以捕获任何异常,并且把它报告为一个错误,这些都不需求参与。JUnit不只是让一个断言失败,而是可以跟踪整个堆栈,并且报告bug的堆栈调用顺序;当需求查找一个失败测试的缘由时,这将非常有用。 8.2 运用JUnit编写测试 7、JUnit测试骨架 用JUnit写测试真正所需求的就三件事:一个import语句引入一切junit.framework.*下的类。一个extends语句让他的类从TestCase承继。一个调用super(string)的构造函数。许多IDE至少会提供这些。这样写出来的类可以运用JUnit的test runner运转,并且自动执行类中一切test方法。 8.2 运用JUnit编写测试 7、JUnit测试骨架 但是有时不从JUnit的runner运转,而是可以直接运转一个测试类会更方便一些。而且每个测试运转前和后的方法名又是什么?可以制造一个骨架来提供一切这些特性并且做得相当简单。8.3 测试的内容 1、结果能否正确 2、边境条件 3、检查反向关联 4、运用其他手段来实现交叉检查 5、强迫产生错误条件 6、性能特性 8.3 测试的内容 1、结果能否正确 对于测试而言,首要的也是最明显的义务就是查看所期望的结果能否正确验证结果。运用数据文件 对于许多有大量测试数据的测试,能够会思索用一个独立的数据文件来存储这些测试数据,然后让单元测试读取该文件。 多留意一下测试数据。不论文件中的还是代码中的测试数据,都很有能够是不正确的。 代码本身能否并没有测试任何异常的情况。 8.3 测试的内容 2、边境条件 Conformance 一致性 值能否和预期的一致。Ordering 顺序性 值能否如应该的那样,是有序或者无序的。Range 区间性 值能否位于合理的最小值和最大值之内。Reference 依赖性 代码能否援用了一些不在代码范围之内的外部资源。Existence 存在性 值能否存在例如,能否非 null,非0,在一个集合中等等。Cardinatity 基数性 能否恰好有足够的值。Time 相对或者绝对的时间性 一切事情的发生能否是有序的?能否是在正确的时辰?能否恰好及时?8.3 测试的内容 3、检查反向关联 对于一些方法可以运用反向的逻辑关系来验证它们 为了检查某条记录能否胜利地插入了数据库,也可以经过查询这条记录来验证 留意:当同时编写了原方法和它的反向测试时,一些 bug 能够会被两个函数中都出现的错误所掩盖。在能够的情况下,应该运用不同的原理来编写反向测试。8.3 测试的内容 4、其他手段来实现交叉检查 计算一个量会有一种以上的算法,可运用剩下算法中的一个来交叉测试结果可以充分利用一些比较弱的版本来检查新写的超级美丽的版本,看它们能否产生了一样的结果 运用类本身不同组成部分的数据,并且确信它们能“合起来8.3 测试的内容 5、强迫产生错误条件 该当可以经过强迫引发错误,来测试本人的代码是如何处置一切这些真实世界中的问题的。 内存耗光。磁盘用满。时钟出问题。网络不可用或者有问题。系统过载。调色板颜色数目有限。显示分辨率过高或者过低。
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号