一、JUnit(单元测试)是干什么的?
JUnit是单元测试工具的意思,
JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。
单元测试主要是来测试程序的结果和自己期望的值是否相等。
二、JUnit测试框架目前大体分为两个版本(JUnit 3.8 和 JUnit 4.x)
JUnit测试框架目前大体分为两种(JUnit 3.8 和 JUnit 4.x)
———————————— JUnit 3.8 ———————————————
涉及到的包一般是 import junit.framework.*
1.在 JUnit 3.8 中,如果要测试Person类,那么测试类的命名规则就是在这个类名后面加上
Test,
如
PersonTest.java,
测试类要继承TestCast类,而TestCast类又继承于Assert类
,测试方法需满足如下原则:
1)修饰符设为 public
2)返回类型 void
3)没有方法参数
4)方法名称必须以test开头(它通过反射找出所有方法,然后找出以test开头的方法)。
2.不能依赖于测试方法的执行顺序
删除一些方法后不会对其他的方法产生任何的影响,我们不能依赖于测试方法的执行顺序。
Test Case之间一定要保持完全的独立性,不允许出现任何的依赖关系。
3.setUp方法和testDown方法都是TestCase类的方法
1)setUp方法是在执行每个测试方法之前执行的
2)testDown方法是在执行每个测试方法之后执行的
———————————— JUnit 4 ———————————————
涉及到的包是 import org.junit.*
1、在junit 4 当中测试类无需继承于 TestCase类,命名不再有JUnit3中的要求,测试方法的名字也无需以test开头,主要以注解的方式来定义,只要在测试方法加上@Test就可以进行测试,但有些原则还是要以junit3 的风格来设计,比如测试方法以test开头,习惯问题吧。
2、JUnit4注解的应用
- @Test :定义一个测试方法的标志
- @Test(timeout=1000) :设置超时时间,如果测试时间超过了你定义的timeout,测试失败
- @Test(expected) : 申明出会发生的异常,比如 @Test(expected = Exception.class)
- @Ignore :让 测试方法 或 测试类 不被执行,让其失去测试的功能
- @Before : 跟junit 3.8 上的setUp() 方法同样的效果,方法名最好和setUp()一样,但不强求,在每一个测试方法之前被执行
- @After : 跟junit 3.8 上的tearDown() 方法同样的效果,方法名最好和tearDown()一样,但不强求,在每一个测试方法之后被执行
- @BeforeClass : 被该注解申明的方法,功能是:在所有的测试方法之前执行,只执行一次
- @AfterClass : 被该注解申明的方法,功能是:在所有的测试方法之后执行,只执行一次
三、JUnit4测试方法
以前我们写好了一个类,类里有写好的方法,我想去测试,怎么测试?写个main方法,然后new这个类,然后去调用这个类里面的方法去测试,但是如果我们写了100个类,要写100个main方法去测试,完了之后,还要一个一个的删除,比较麻烦,
JUnit就很好的解决了这样的问题。
1、举个例子新建一个项目,创建一个Person类,里面写两个测试方法
以前我们要测试Person中的方法的话,直接在Person类中写个mian方法然后去测试Person中的方法
2、现在我们用JUnit的话,有一个很大的好处就是测试代码和项目代码完全分离
新建一个Source Folder名字随便起,如test
3、在test中创建一个包,包的名字必须和src中的一样,也就是my.test
之所以要让包名一样是为了避免导包的麻烦,在工作空间项目bin文件下编译成的class文件是放在一起的。
项目里源代码是分离的:
在我们的工作空间里编译后是在同一个文件里的,所以不需要导包:
4、使用JUnit需要引用JUnit的类库
新建一个jUnit Test Case,这是一个测试用例
我们选择JUnit4,其中Name的命名可以不遵守JUnit3中的命名规则
5、运行测试方法有几种
1.右键项目中测试方法直接Run As
2.双击方法名,右键Run As
出现绿条则说明测试成功,出现绿条则说明出现失败
以上看不出这有什么好处,但是当测试方法有多个的时候就看出来了,以前测试完了一个方法后,要将其注释,再测另一个方法,
现在的话想测试哪个方法就双击右键Run As运行哪个方法
四、JUnit注解
1、@Test:定义一个测试方法的标志
创建完后,测试Person类中的方法,在JUnit3中测试类需要继承
TestCase才能测试其中的方法,而在JUnit4中用的是注解,不需要继承TestCase。
2、
@Test(timeout=1000) :设置超时时间,如果测试时间超过了你定义的timeout,测试失败
比如说我想测试一个算法,看看能不能在某个时间内完成
例如,在方法上@Test(timeout=10)就是看此方法能不能再10毫秒内运行完毕
如果不能再10毫秒内运行完毕则报错 test timed out after 10 millisenconds
3、
@Test(expected):申明出会发生的异常
比如 @Test(expected =
Exception.class)
如:假设有些异常你在这不想处理,可以忽略掉
如int a = 10/0会抛如下异常
在@Test中加入expected=ArithmeticException.class上面抛出的异常,表示这个异常在这里
不处理,可以忽略,运行后不报错
4、@Ignore :让测试方法或测试类不被执行,让其失去测试的功能
如:假设有很多方法时,有些方法你不行测试而其他方
法你都要测试,
则可通过注解来达到目的。
在不用测试的方法上加上@Ignore表示此方法不参与测试
如在testEat()方法上加上@Ignore注解,则在执行这个测试类的时候不会执行此方法
五、新建JUnit Test Case时下面的这几个方法的作用
5、setUp() tearDown() 的作用
@Before : 跟setUp()方法同样的效果,在每一个测试方法之前被执行
@After : 跟tearDown() 方法同样的效果,在每一个测试方法之后被执行
如:新建一个测试用例
例如下图例子,执行测试类后输出
这俩个方法用在什么地方呢?
假设做一个输入输出流的话,比如做了一个文件的拷贝,现在要测试几个方法,
每个方法都用到输入输出流,这样就可以把开启流写到方法setUp()中,关闭流
写到tearDown()中,不需要在测试的方法中重复写了。
6. setUpbeforeClass() tearDownAfterClass() 的作用
- @BeforeClass : 被该注解申明的方法功能是:在所有的测试方法之前执行,只执行一次
- @AfterClass : 被该注解申明的方法功能是:在所有的测试方法之后执行,只执行一次
如:新建一个测试用例
例如下图例子,执行测试类后输出
setUpbeforeClass() tearDownAfterClass()静态方法是在类加载之前就执行了
从上可知 setUpBeforeClass()在所有测试方法之前只执行一次
tearDownAfterClass()在所有测试方法之后只执行一次
六、使用JUnit4测试私有方法
当我们要测试的方法为私有的时候,不能直接对用,这个时候要用java的反射机制测试私有方法。
1、新建一个测试类PersonTestPrivate4
2、测试结果