软件工程综合实践专题 个人博客作业 软件测试 单元测试 JUnit
关于JUnit:
JUnit是由 Erich Gamma 和 Kent Beck 编写的一个Java语言的单元测试框架,也是一个回归测试框架(regression testing framework)。Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。Junit是一套框架,继承TestCase类,就可以用Junit进行自动测试了。
单元测试:
单元测试,是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。其中,单元测试再往上就是集成测试。
再在这里,由于我们的代码部分还未完成,我们先使用网上找的一段代码来进行演示
1 package test; 2 import java.util.Scanner; 3 public class Main{ 4 boolean enough; 5 double charge; 6 int discount; 7 8 Main(double cos,double num,double paid) { 9 //System.out.println("收银台收款程序2.0"); 10 Scanner scan=new Scanner(System.in); 11 //System.out.println("请输入商品单价:"); 12 double cost=cos; 13 //System.out.println("请输入商品数量:"); 14 double number=num; 15 double money=cost*number; 16 if (money<500){ 17 //System.out.println("未满500不打折"); 18 discount=10; 19 } 20 else if(money>=500&&money<1000){ 21 money=money*0.8; 22 //System.out.println("满500打8折"); 23 discount=8; 24 } 25 else if(money>=1000){ 26 money=money*0.6; 27 //System.out.println("满1000打6折"); 28 discount=6; 29 } 30 //System.out.println("应付金额:"+money); 31 //System.out.println("实付金额:"); 32 double net=paid; 33 double change=net-money; 34 if(net>=money){ 35 this.enough = true; 36 this.charge = change; 37 //System.out.println("找零"+change); 38 } 39 else if(net<money){ 40 double lack=money-net; 41 this.enough = false; 42 this.charge = lack; 43 //System.out.println("您给的钱少了,还差"+lack+"元。"); 44 } 45 } 46 public boolean getEnough() { 47 return enough; 48 } 49 public double getCharge() {
50 return charge; 51 } 52 public int getDiscount() { 53 return discount; 54 } 55 }
这是一个用Java语言写的类,我们将使用JUnit框架对其进行单元测试。
首先我们先来看一下测试的脚本代码:
package test; import org.junit.Assert; import org.junit.Test; public class MainTest { @Test //测试 getCharge()方法 public void testdiscount1(){ Main test = new Main(10,3,40); Assert.assertEquals(test.getDiscount(),10); } @Test public void testdiscount2(){ Main test = new Main(50,10,40); Assert.assertEquals(test.getDiscount(),8); } @Test public void testdiscount3(){ Main test = new Main(120,10,40); Assert.assertEquals(test.getDiscount(),6); } @Test //测试 getEnough()方法 public void testEnough(){ Main test = new Main(10,3,20); Assert.assertEquals(test.getEnough(), false); } @Test //测试 getCharge()方法 public void testCharge(){ Main test = new Main(10,3,40); Assert.assertEquals((int)test.getCharge(),10); } }
在界面中我们看到的应该是这个样子的。我们先来看一下测试脚本,首先是要引入org.junit.Assert这样的一个包,然后再在里面编写测试代码。在这段代码里我们可以看到,在每个测试方法的前一行都有一个“@Test”做标识符,告诉这个框架我在这里写的是测试方法。如果不写这个@Test的话,在JUnit执行自动测试的时候则不会执行这个方法里面的测试内容。在下面我们先来演示一下,鼠标右键点击这个.java文件,然后让他Run As Junit Test,我们就可以在Eclipse左边得到以下结果:
我们可以看到,5个测试用例,全部被执行了一遍。这个时候,我们删掉一个@Test标签试一下:
我们在这里把testEnough这个方法的标签注释掉,然后再运行一下:
所以,在这里,我们就会发现,在测试结果里,并没有出现testEnough这个方法的测试结果。所以,由此可以看出,这个标签是不能省略的。
既然讲到了JUnit,那么就顺便再提一下Coverage覆盖测试吧
在eclipse中点击工具栏的 help--install new software,然后在选项中找到Coverage选项,然后点击Add,之后一路Next就行
然后右键点击测试类就会发现,你的菜单栏里多了一个Coverage As,这个就是覆盖率测试。我们Run一下试试看:
这里我们可以看到我们的测试脚本代码里有许多的绿色底色,这个代表着这个测试方法被使用了。现在我们再把切换到Main函数里去看看:
我们可以看到,还有出现了黄色的底色,这个表示被覆盖到了的测试分支。
然后在最底部,我们可以看到有一个Coverage的数据,这个表示的是测试脚本的覆盖率。当然,这里我们所有的分支都测试到了,所以覆盖率为100%。
我们现在再注释掉一个再试试看:
现在我们可以看到这些红色的底色,这就代表这一部分没有被测试到,所以我们的测试覆盖率也不再是100%。
以上就是关于JUnit单元测试和Coverage测试覆盖率的内容