您好,欢迎访问三七文档
当前位置:首页 > 中学教育 > 初中教育 > 软件测试实验-单元测试工具JUNIT
武汉轻工大学软件测试实验报告实验一单元测试工具JUNIT姓名:李娅娅学号:1505110015班级:软工1503指导老师:丁月华1.实验目的了解自动化测试工具JUnit的架构、功能,学习如何下载、安装JUnit,掌握使用JUnit对Java程序进行单元测试的方法。2.实验步骤2.1导入jar包右击项目名,单击BuildPath中的AddLibraries..选择UserLibariry。新建一个存放Junit的包的库将junit-4.7.jar导入Jar包导入完成。2.2编写第一个Junit测试类2.2.1Calculator类编写被测试类Calculator:(拷贝)privatestaticintresult;//静态变量,用于存储运行结果publicvoidadd(intn){result=result+n;}publicvoidsubstract(intn){result=result-1;//Bug:正确的应该是result=result-n}publicvoidmultiply(intn){}//此方法尚未写好publicvoiddivide(intn){result=result/n;}publicvoidsquare(intn){result=n*n;}publicvoidsquareRoot(intn){for(;;);//Bug:死循环}publicvoidclear(){//将结果清零result=0;}publicintgetResult(){returnresult;}}2.2.2CalculatorTest类编写CalculatorTest类,用于测试Calculator类:(拷贝)publicclassCalculatorTest{privatestaticCalculatorcalculator=newCalculator();@BeforepublicvoidsetUp()throwsException{calculator.clear();}@TestpublicvoidtestAdd(){calculator.add(2);calculator.add(3);assertEquals(5,calculator.getResult());}@TestpublicvoidtestSubstract(){calculator.add(10);calculator.substract(2);assertEquals(8,calculator.getResult());}@Ignore(Multiply()Notyetimplemented)@TestpublicvoidtestMultiply(){}@TestpublicvoidtestDivide(){calculator.add(8);calculator.divide(2);assertEquals(4,calculator.getResult());}}2.2.3运行测试在类名上右击,选择RunAsJunitTest得到Junit面板,并显示了哪些测试是成功的,哪些是失败的以及哪些是未执行(直接跳过了):2.3使用JUnit对Money类进行单元测试2.3.1Money类(拷贝)publicclassMoney{privateintfAmount;//货币余额privateStringfCurrency;//货币类型publicMoney(intamount,Stringcurrency){fAmount=amount;fCurrency=currency;}publicintamount(){returnfAmount;}publicStringcurrency(){returnfCurrency;}publicMoneyadd(Moneym){//add方法把两个Money对象相加,合成一个Money对象returnnewMoney(amount()+m.amount(),currency());}publicbooleanequals(ObjectanObject){//equals方法判断两个Money对象是否相等if(anObjectinstanceofMoney){MoneyaMoney=(Money)anObject;returnaMoney.currency().equals(currency())&&amount()==aMoney.amount();}returnfalse;}}现在要对Money类的add方法进行测试,步骤如下:2.3.2MoneyTest类(1)创建对象定义几个Money类的对象Moneyresult;Moneym12CHF=newMoney(12,CHF);Moneym14CHF=newMoney(14,CHF);Moneyexpected=newMoney(26,CHF);//预期的运行结果(2)addTest()在MoneyTest类中编写testAdd方法,对Money类中的add()方法进行测试:@TestpublicvoidtestAdd(){result=m12CHF.add(m14CHF);assertTrue(expected.equals(result));//判断运行结果是否与预期值相同}(3)testEquals()@TestpublicvoidtestEquals(){assertTrue(!m12CHF.equals(null));assertTrue(!m12CHF.equals(m14CHF));assertEquals(m12CHF,m12CHF);assertEquals(m12CHF,newMoney(12,CHF));}2.3.3运行测试测试通过2.4Fixture和几个标签Fixture的含义就是“在某些阶段必然被调用的代码”。比如我们上面的测试,由于只声明了一个Calculator对象,他的初始值是0,但是测试完加法操作后,他的值就不是0了;接下来测试减法操作,就必然要考虑上次加法操作的结果。这绝对是一个很糟糕的设计!我们非常希望每一个测试都是独立的,相互之间没有任何耦合度。因此,我们就很有必要在执行每一个测试之前,对Calculator对象进行一个“复原”操作,以消除其他测试造成的影响。因此,“在任何一个测试执行之前必须执行的代码”就是一个Fixture,我们用@Before来标注它,如前面例子中的setUp()方法所示:这里不在需要@Test标注,因为这不是一个test,而是一个Fixture。同理,如果“在任何测试执行之后需要进行的收尾工作”也是一个Fixture,使用@After来标注。2.4.1代码测试publicclassTTest{@BeforeClasspublicstaticvoidbeforeClass(){System.out.println(beforeClass);}@AfterClasspublicstaticvoidafterClass(){System.out.println(afterClass);}@Beforepublicvoidbefore(){System.out.println(before);}@TestpublicvoidtestAdd(){intz=newT().add(5,3);assertThat(z,is(8));assertThat(z,allOf(greaterThan(5),lessThan(10)));}@Test(expected=java.lang.ArithmeticException.class,timeout=100)publicvoidtDivide(){intz=newT().divide(8,0);}@Afterpublicvoidafter(){System.out.println(after);}}2.4.2运行结果在控制台中得到运行结果:在Junit选型卡中得到:(1)结果分析在Junit选项卡中由于代码找不到T类,而使方法运行错误。在控制台中输出两次before和两次after,是因为在类中test了两个方法,每运行一个方法,@before和@after下的方法就是默认执行。2.4.3标签学习(1)@Test测试方法(2)@Before使用了该元数据的方法在每个测试方法执行之前都要执行一次,一般做初始化方法。(3)@After使用了该元数据的方法在每个测试方法执行之后要执行一次,一般用于释放资源。(4)@ignore该元数据标记的测试方法在测试中会被忽略。你可以为该标签传递一个String的参数,来表明为什么会忽略这个测试方法。比如:@lgnore(“该方法还没有实现”),在执行的时候,仅会报告该方法没有实现,而不会运行测试方法。(5)@BeforeClass所有测试开始之前运行,一个测试类只能有一个,并且必须声明为publicstatic。该方法在内存中只存在一份实例,比较适合加载配置文件。(6)@AfterClass:所有测试结束之后运行,一个测试类只能有一个,并且必须声明为publicstatic。通常用来对资源进行清理,比如关闭数据库的连接。(备注:为什么需要@BeforeClass和@AfterClass,我们来看看他们是否适合完成如下功能:有一个类是负责对大文件(超过500兆)进行读写,他的每一个方法都是对文件进行操作。换句话说,在调用每一个方法之前,我们都要打开一个大文件并读入文件内容,这绝对是一个非常耗费时间的操作。如果我们使用@Before和@After,那么每次测试都要读取一次文件,效率及其低下。这里我们所希望的是在所有测试一开始读一次文件,所有测试结束之后释放文件,而不是每次测试都读文件。JUnit的作者显然也考虑到了这个问题,它给出了@BeforeClass和@AfterClass两个Fixture来帮我们实现这个功能。从名字上就可以看出,用这两个Fixture标注的函数,只在测试用例初始化时执行@BeforeClass方法,当所有测试执行完毕之后,执行@AfterClass进行收尾工作。)JUnit4的单元测试用例执行顺序为:@BeforeClass-@Before-@Test-@After-@AfterClass。每一个测试方法的调用顺序为:@Before-@Test-@After。可以根据以上给定的标记来构造测试类中的测试方法,一般说来遵守以下约定:类放在test包中类名用XXXTest结尾方法用testMethod命名2.5限时测试@Test(timeout=value),例如@Test(timeout=1000)2.5.1被测源代码2.5.2测试代码@Test(timeout=1000)publicvoidtestSquareRoot(){calculator.squareRoot(4);assertEquals(2,calculator.getResult());}2.5.3运行测试在测试代码中Timeout参数表明了设定的时间,单位为毫秒,因此1000就代表1秒,测试的方法超过了设定的时间表示失败。2.6异常测试对除法运算中的“除0异常”进行测试2.7综合练习2.7.1测试代码publicclassCalculatorTest{privatestaticCalculatorcalculator=newCalculator();@BeforeClasspublicstaticvoidbeforeClass(){System.out.println(beforeClass);}@AfterClasspublicstaticvoidafterClass(){System.out.println(afterClass);}@Beforepublicvoidbefore(){System.out.println(before);}@Afterpublicvoidafter(){System.out.printl
本文标题:软件测试实验-单元测试工具JUNIT
链接地址:https://www.777doc.com/doc-5570948 .html