深入java--单元测试JUnit

来源:互联网 发布:php qq在线客服代码 编辑:程序博客网 时间:2024/05/21 15:02

一: 

在有些时候,我们需要对我们自己编写的代码进行单元测试(好处是,减少后期维护的精力和费用),这是一些最基本的模块测试。当然,在进行单元测试的同时也必然得清楚我们测试的代码的内部逻辑实现,这样在测试的时候才能清楚地将我们希望代码逻辑实现得到的结果和测试实际得到的结果进行验证对比。单元测试就是通过断言函数,也就是比较函数来进行预期结果和实际结果的比较(都作为参数输入)进行判断是否正确。

  废话少说,上代码:

   首先创建一个java工程,在工程中创建一个被单元测试的Student数据类,如下:


package com.itany.www;public class Student{    private String name;    private String sex;    private int high;    private int age;    private String school;        public Student(String name, String sex ,int high, int age, String school)    {        this.name = name;        this.sex = sex;        this.high = high;        this.age = age;        this.school = school;    }    public String getName()    {        return name;    }    public void setName(String name)    {        this.name = name;    }    public String getSex()    {        return sex;    }    public void setSex(String sex)    {        this.sex = sex;    }    public int getHigh()    {        return high;    }    public void setHigh(int high)    {        this.high = high;    }    public int getAge()    {        return age;    }    public boolean setAge(int age)    {        if (age >25)        {            return false;        }        else        {            this.age = age;            return true;        }                   }        public String getSchool()    {        return school;    }    public void setSchool(String school)    {        this.school = school;    }}

在eclipse下单元测试这个类:  

 

首先导入Junit包:选中java工程,点击鼠标右键--->选择properties---->在窗口中选Java Build Path---->在右侧点击Add Library---->在弹出的窗口列表中选中Junit---->下一步----->Junit 4(我用的是Junit 4)---->finish

这样Junit 4包就导完了,接下来就是创建测试类:

 

将测试类和被测试类放在不同的包中(也可以放在同一个包中,此处只是为了区别),代码如下:

 

测试类1:


package com.itany.test;import junit.framework.TestCase;import org.junit.After;import org.junit.Before;import org.junit.Test;import com.itany.www.Student;public class StudentTest01 extends TestCase{    private Student testStudent;    @Before//此方法在执行每一个测试方法之前(测试用例)之前调用    protected void setUp()        throws Exception    {        super.setUp();        testStudent=new Student("djm", "boy", 178, 24, "华东政法");        System.out.println("already setUp()");    }        @After//此方法在执行每一个测试方法之后调用    protected void tearDown()        throws Exception    {        super.tearDown();        System.out.println("already tearDown()");    }        @Test//表示测试用例 也就是方法的方法    public void testGetSex()    {        assertEquals("boy", testStudent.getSex());          System.out.println("testGetSex()");      }        @Test    public void testGetAge()    {        assertEquals(24,testStudent.getAge());        System.out.println("testGetAge()");      }    }

测试类2:

package com.itany.test;import junit.framework.TestCase;import org.junit.After;import org.junit.Before;import org.junit.Test;import com.itany.www.Student;public class StudentTest extends TestCase{    private Student testStudent;    @Before    protected void setUp()        throws Exception    {        super.setUp();        testStudent = new Student("steven_hu", "boy", 170 , 23, "上海理工");        System.out.println("already setUp()");    }        @After    protected void tearDown()        throws Exception    {        super.tearDown();        System.out.println("already tearDown()");    }        @Test    public void testGetName()    {        assertEquals("hdy", testStudent.getName());    }        @Test    public void testSetAge()    {        assertTrue(testStudent.setAge(21));//輸入的是true和false    }        @Test    public void testGetSchool()    {      //预期值和实际值不一样,测试时出现失败(Failure)          assertEquals("南昌大学", testStudent.getSchool());      }    }
当然,如果同时需要一起测试以上这两个测试类,可以通过TestSuite类实现,它相当于是一个套件,可以把所有测试类添进来一起运行测试;

代码如下:

package com.itany.test;import junit.framework.Test;import junit.framework.TestSuite;//这些可以通过JUnit TestSuite 自动生成  直接一起测试  这时 不需要里面的方法//@RunWith(Suite.class)//@SuiteClasses({StudentTest.class, StudentTest01.class})public class AllTests{    public static Test suite()      {          TestSuite suite=new TestSuite("合起来的一套单元测试 ");        suite.addTestSuite(StudentTest.class);        suite.addTestSuite(StudentTest01.class);        return suite;    }  }

最后,分别测试以上三个类(选中需要测试的类---->鼠标右键---->Run As---->Junit Test):



或者可以通过Junit直接生成Suite套件(可以使许多个单元测试一起运行) 不需要手动敲打代码

步骤: new-other-输入JUnit Test Suite查找-输入要纳入的包,然后选择包中想要测试的类即可

package com.itany.test;import junit.framework.Test;import junit.framework.TestSuite;import org.junit.runner.RunWith;import org.junit.runners.Suite;import org.junit.runners.Suite.SuiteClasses;//这些可以通过JUnit TestSuite 自动生成  直接一起测试  @RunWith(Suite.class)@SuiteClasses({StudentTest.class, StudentTest01.class})public class AllTests{    }
直接最后选中需要测试的类---->鼠标右键---->Run As---->Junit Test)

参考文章:http://blog.csdn.net/stevenhu_223/article/details/8269157



二:

单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。Java里单元指一个类。

JUnit ,是一个开源的Java单元测试框架,是 Java的标准单元测试库,是非常重要第三方 Java 库,由 Kent Beck 和 Erich Gamma 开发。

Junit作为一个软件测试的工具,JUnit可以不破坏java原代码,使用方便,添加快捷,代码量少,可视化的测试。

 JUnit单元测试步骤:

1.导入包junit测试包:JUnit有俩测试版本,3.81版(常用),最高4.0版,导入对应的jar包;

2.写一个类扩展(继承)TestCase,此类类名为需测试的类名后加Test(命名规则);
3.在需要测试的方法名前加test生成新的测试方法;
4.运行测试,用断言(assert***)的方法测试成功(显示绿色)或失败(显示红色)。

 Unit3.81与JUnit4.0区别:
1.在 JUnit 4 中,测试是由 @Test 注释来识别的;
2.Unit 3.81 测试运行程序时会在运行每个测试之前自动调用 setUp() 方法,在JUnit4.0中,要用 @Before 注释;
3.在 JUnit 3.81 中,测试运行程序时会在运行每个测试之前自动使用 tearDown() 方法清除消耗的资源,在JUnit4.0中,用 @After 注释。

注意:如果需测试的方法没有返回值,只能测试其过程。

 JUnit4新特性:
1.属于类范围的 setUp()方法 和 tearDown() 方法,任何用 @BeforeClass 注释的方法都将在该类中的测试方法运行之前运行一次,而任何用 @AfterClass 注释的方法都将在该类中的所有测试都运行之后运行一次;
2.异常测试:编写抛出异常的代码,并使用注释来声明该异常是预期的;
3.在需要高效率的测试中,有些代码测试你认为可以跳过,这类测试可以被注释为 @Ignore

4.时间测试可以用超时参数来注释,如果测试的运行时间超过指定的毫秒数,测试失败。 

5.增加两个新的断言方法:

(1)public static void assertEquals(Object[] expected, Object[] actual)
(2)public static void assertEquals(String message, Object[] expected, Object[] actual) 这两个方法用来比较数组:如果数组长度相等且对应的元素相同,则这两个数组相等,否则不等,也考虑了数组为空的情况。

参考文章:http://blog.csdn.net/typa01_kk/article/details/8513548


0 0