从代码审核时遇到的有关JUnit的几个问题来看项目开发问题

1、持续集成时,某个单元测试失败,找不到作者。

项目成员持续流动,加之测试用例随着项目的开发而不断增加,查找代码的作者,也算是个力气活了,如何能快速而准确的定位到代码开发者呢?Java提供的 @author 可以达到该要求;

开发增加和修改的单元测试,必须要将开发者注释,便于快速定位。


2、单元测试方法只能执行一次。

一位同事写的代码,调用删除方法,传入主键ID,将该记录删除;结果再次执行的时候报错,对象不存在;原来是JUnit单元测试框架搭建有问题,没有设置默认回滚.仅需添加以下注解即可:

@TransactionConfiguration(transactionManager="transactionManager",defaultRollback=true)
@Transactional
当然了 , 也可以在方法级别指定 (一般不推荐):

@Rollback(true)


3、单元测试方法没有断言。

@Test
public void testFindPeople(){
	PeopleQuery pQuery = new PeopleQuery();
	pQuery.setName("zhangsan");
	pQuery.setLevel(4);
	peopleDao.findPeople(pQuery);
}

代码如上,不知道这样的单元测试目的何为,完全没有业务上的判断逻辑。

因此提出,JUnit测试方法必须有断言(某些极端情况排除,比如测试超时时间、异常等),以满足业务上和逻辑上的要求。


4、方法执行出错,但是JUnit显式测试成功(出现绿条)

@Test
public void testException(){
	try {
		int i = 10/0;
		Assert.assertEquals(2,i);			
	} catch (Exception e) {
		e.printStackTrace();
	}		
}

代码如上 ,被0除,大家肯定知道该句会报错,但是结果呢,JUnit却提示 执行成功 。为什么呢?

原来,被0除报错之后,语句绕过断言,进入到catch语句中,打印异常之后,该单元测试执行完毕。压根就没走断言!!!

JUnit4支持(出现异常,则测试失败).因此无须在添加try catch语句,亦或在catch语句块中添加断言;而如果想测试异常,可以使用参数来执行即可。


以上问题已经添加了自己的一些想法。


出现以上问题,足以反映出开发团队的一些问题:

1、开发成员对JUnit方面知识涉猎太少;

2、开发成员看出问题,而没有反映,则说明了开发团队热情度不高;

3、反映过该问题,但其他成员依然如此,说明了团队沟通不足或者不是一个学习型团队;没有提供一定的交流、学习时间。

4、项目领导只关心功能是否正常,其他一切不管。唉,无话可说了。


写在此,希望自己遇到以上问题的时候,能积极解决,而不是消极面对。



你可能感兴趣的:(JUnit,测试,断言)