Junit测试 详细介绍
一、为什么要进行测试
其实编写测试代码看起来是增加了代码量和工作量,实际不然。测试可以减少后期项目上线debug调试排错的时间,提升代码质量,让代码变得更容易维护。
二、什么是单元测试
单元测试简单来说就是对项目最小的功能模块进行测试,在java中是一个方法。假如说你现在写好了一个类,那你怎么验证这个类中的方法有没有问题?如果按照咱们传统的单元测试做法,就是再编写一个类,然后在新编写的这个类的main方法中调用被测试的类的方法,而且一般情况下都需要通过肉眼去观察运行结果是否正确。
那么问题来了,万一这时候有很多类都要进行测试,那怎么办?那是不是要写很多个main方法,或者说是把测试代码写到一个main方法中。但是这样做会增加测试复杂度和提高工作量,所以说程序员对於单元测试的热情一直不是很高。后来有一个大神推出了一个可以简化单元测试工作的jar包(JUnit),大大减轻了程序员进行单元测试的工作量。
三、JUnit是什么?
JUnit是一个用于java语言的单元测试框架,可以简化单元测试的工作量。
很多开发环境默认已经集成了Junit:Eclipse,MyEclipse,Idea。
四、JUnit使用注意事项
1.测试方法上必须要使用@Test注解进行修饰
2.所有测试方法必须要使用public void进行修饰,且不能有参数
3.每个测试方法都要保证能独立运行,测试方法之间不能有依赖。
4.测试类尽量以(被测试类的名字+Test)作为测试类的名字(非必须,只是为了更好的编程习惯)
5.测试类所在的包名尽量和被测试类的包名保持一致(非必须,只是为了更好。。。)
6.测试方法尽量以test作为前缀(非必须,只是为了更好。。。)
五、JUnit的使用
1.在项目的pom.xml中配置JUnit单元测试框架jar包
六、测试失败的两种情况
Failure:代码正常但是运行结果和期望结果不一致导致的【Assert.assertEquals(num, 2);】
Error:代码执行过程中出现异常!
七、JUnit4中的常用注解
@Test:修饰普通方法为测试方法
@BeforeClass:在测试类的所有测试方法执行前执行,必须用static修饰
@AfterClass:在测试类的所有测试方法执行后执行,必须用static修饰
@Before:在测试类的每个测试方法执行前执行一次
@After:在测试类的每个测试方法执行后执行一次
@Ignore:忽略测试方法
public class CalculatorTest {
private static Calculator cal;
@BeforeClass
public static void createCalculator(){
cal = new Calculator();
System.out.println("我会在所有测试方法执行前执行一次,只会执行一次!");
}
@AfterClass
public static void destoryCalculator(){
cal = null;
System.out.println("我会在所有测试方法执行后执行一次,只会执行一次!");
}
@Before
public void start(){
System.out.println("开始执行测试方法");
}
@After
public void end(){
System.out.println("执行测试方法结束");
}
@Test
public void testAdd(){
System.out.println("进行加法测试");
int num = cal.add(1, 2);
//断言机制,可以判断程序运行结果和预期结果是否一致!
Assert.assertEquals(num, 2);
}
@Test
@Ignore
public void testSub(){
System.out.println("进行减法测试");
int num = cal.sub(10, 2);
Assert.assertEquals(num, 8);
}
}
八、JUnit测试套件的使用(当有多个类需要统一测试)
在实际项目中,随着开发的深入,项目会越来越大,相应的测试类也会越来越多,那么总不能一个一个的运行吧,JUnit测试套件就提供了批量运行的方法
测试套件就是组织测试类一起运行的
写一个类作为测试套件的入口类,这个类里不包含其他的方法,更改测试运行器为Suite.class,将要测试的类作为数组传入到Suite.SuiteClasses({})
九、Maven Web项目使用Junit进行测试
1. 在项目的pom.xml中Junit jar包的依赖配置
十、Maven Web项目+Spring Test框架+JUnit进行测试
【当没有controller,无法启动服务,无法加载配置文件时候,如何测试:】
1.在项目pom.xml中加入JUnit和Spring Test jar包的依赖配置
2.编写一个测试类
//用于指定junit运行环境,是junit提供给其他框架测试环境接口扩展,为了便于使用spring的依赖注入
//spring提供了org.springframework.test.context.junit4.SpringJUnit4ClassRunner作为Junit测试环境
@RunWith(SpringJUnit4ClassRunner.class)
//加载配置文件(加载多个)
@ContextConfiguration(locations = { "classpath*:/applicationContext_realm.xml",
"classpath*:/applicationContext_daily.xml",
"classpath*:/applicationContext.xml",
"classpath*:/applicationContext_airwarm.xml",
"classpath*:/applicationContext_airwet.xml",
"classpath*:/applicationContext_illum.xml",
"classpath*:/applicationContext_rainfall.xml"
})
//这个非常关键,如果不加入这个注解配置,事务控制就会完全失效!
@Transactional
//这里的事务关联到配置文件中的事务控制器(transactionManager = "transactionManager"),
//同时指定自动回滚(defaultRollback = true)。这样做操作的数据才不会污染数据库!
@TransactionConfiguration(transactionManager="transactionManager",defaultRollback = true)
public class BookDaoTest {
@Autowired
private BookDao bookDao;
@Test
public void testAddBook(){
Book book = new Book();
book.setBookName(“sdssd”);
bookDao.save(book);
}
}
Junit 断言详解:
其中方法应用的时候由于其都是static 方法,所以直接调用即可
(如:Assert.assertEquals(1,1) )
断言是编写测试用例的核心实现方式,即期望值是多少,测试的结果是多少,以此来判断测试是否通过。
|assertArrayEquals(expecteds, actuals) 查看两个数组是否相等。
assertEquals(expected, actual) 查看两个对象是否相等。类似于字符串比较使用的equals() 方法
assertNotEquals(first, second) 查看两个对象是否不相等。
assertNull(object) 查看对象是否为空。
assertNotNull(object) 查看对象是否不为空。
assertSame(expected, actual) 查看两个对象的引用是否相等。类似于使用“==”比较两个对象
assertNotSame(unexpected, actual) 查看两个对象的引用是否不相等。类似于使用“!=”比较两个对象
assertTrue(condition) 查看运行结果是否为true。
assertFalse(condition) 查看运行结果是否为false。
assertThat(actual, matcher) 查看实际值是否满足指定的条件
fail() 让测试失败