什么是单元测试:
写了个类,要给别人用,不知道会不会有bug,所以我们要测试一下。最土的方法是main方法,用main方法不好,加入我们定了很多函数,都在main方法里测试吗?1.不能一起运行。如果有多个类,每个类都写一个main方法吗?做一遍测试麻烦。2.大多数情况下需要人为去确定是否正确。
为什么单元测试:降低后期成本。提高软件质量。
创建junit:包右键Junit Test Case.
对T类进行测试:
测试代码:
对T的add方法测试:
import static org.junit.Assert.*;Assert是个类不是包。静态引入可以把里面的方法引入进来。就不用Assert.调用了。fail就是Assert类里的一个方法。
单元测试运行在测试类上右键或者在方法上右键。
运行结果:通过。
Junit好处:如果有两个方法的话,同时运行的话main是做不到的。不用人工了,程序就帮你判断了。
静态引入:静态引入一个类,直接使用这个类中的静态方法,就不需要类名了。
测试框架除了junit之外还有TestNG。
断言除了Assert还有AssertThat。
Assert:
绿条。
只要断言没通过,字符就要显示在这里。
AssertThat:替代了其他所有的assert.core和liberary.
切记导入的是Matchers,而不是Matcher import static org.hamcrest.Matchers.*;
assertThat(0, is(1));
assertThat(0, is(not(1)));
junit中出现如下错误:
我们在这儿用了两种包,一种junit4还有hamcrest包。我用的junit4的包是MyEclipse自带的,与hamcrest的包不一致。要重新下载junit4的包。我换的是junit 4.9.ok,运行成功。
新的断言只是比老的断言看起来更自然。
Failure测试失败Error程序有问题。只有在Error没有出错的情况下谈Failure。
Annotation:
@Test表明该方法是一个测试方法。
如果测试的时候测试整个类,就把类中所有测试方法都测试了。
运行通过,因为我们期待他抛异常。
timeout测试方法在多长时间内能完成。
@Ignore忽略这个方法。
@before 在每个测试方法之前运行
@After在每个测试方法之后运行
@BeforeClass:任何测试运行之前,甚至在这个类初始化之前,先运行BeforeClass
@AfterClass:这个类所以的方法都运行完之后再运行AfterClass。
初始化之前运行所以这两个类一定是static。
比如 要提前做的一些事,连接数据库写在@BeforeClass中,把关闭连接写在@AfterClass中。当我们在测试之前需要取得很耗费时间的资源,或者搭载一些比较耗时间的环境。资源释放环境卸载用@AfterClass。
运行多个测试:
运行在不同包下不同类下的所有测试。
右键项目名-->run as-->run configurations-->
好处很大。
注意:
类放在test包中。类名用XXXTest结尾。方法用testMethod命名。
Junit4有个小bug,
@BeforeClass里边,SessionFactory构建的时候不报出异常,静悄悄给吞掉了。
Junit:调试出来没有错误,但是程序就是有问题有两种解决办法。
在Junit中:
方法一:
public static void main(){
beforeClass();
}
方法二:
try {
sf=new org.hibernate.cfg.Configuration().configure().buildSessionFactory();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}