Junit单元测试

什么是单元测试

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

什么是Junit

JUnit 是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。Junit是一套框架,继承TestCase类,就可以用Junit进行自动测试了

单元测试有什么用(好处)

1. 消灭低级错误

基本的单元测试,可以在系统测试之前,把大部分比较低级的错误都消灭掉,减少系统测试过程中的问题,这样也就减少了系统测试中定位和解决问题的时间成本了。

2. 找出潜在的bug

某些类型的bug,靠系统测试是很难找到的。例如一些代码分支,平时99%的场景基本上都走不到,但一旦走到了,如果没有提前测试好,那么可能就是一个灾难。

3. 上库前的保证

加了新代码,上库前跑一把单元测试,都通过,说明代码可能没有影响到之前的逻辑,这样上库也比较放心。如果之前的单元测试跑不过,那么很有可能新的代码有潜在的问题,赶紧修复去吧。

4. 重构代码的机会

写单元测试的过程中,你可能会顺手把一些code重构了,为什么?举例,一些长得非常像的代码,如果每次都要写一堆测试代码去测同样的code,你会不会抓狂?不测吧,覆盖率又上不去,于是我就会想方设法把待测试的code改得尽量的精简,重复代码减少,这样覆盖率上去了,测试也好测了,代码也简洁了。如果没有单元测试和覆盖率的要求的话,坦白说可能一来自己不会发现这些重复的code,另一方面即使发现了,可能也没有太大的动力去改进。

另外,由于单元测试中,你需要尝试去覆盖一些异常分支,这是系统测试常常走不到的地方,于是就会引起你的一些思考,例如这个异常分支是否真的需要?是否真的会发生?对于一些实际上绝对不会出错的函数,那么我觉得可能异常分支是没必要存在的。

作者:Jiang阿涵
链接:https://www.jianshu.com/p/4270345dda2e
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

5. 重新review代码的机会

写UT的过程中,我总是会好好看哪些代码执行到了,哪些代码没有执行到,这其实也是一个review自己代码的机会,有些时候,并不是UT本身帮我找到bug,而是回头review自己代码的时候发现的。

哪些代码需要做单测

对于后端代码来说,controller service dao 是需要写单测的,而其中,controller是最好写的,代码量多,可以大幅度的提升代码覆盖率。

测试代码示例

这是控制层查询列表接口

@RequestMapping("list.do")
	public void list(HttpServletRequest request,HttpServletResponse response, ModelMap model){
		setRequestModelMap(request, model);  
		model.put("sortName", model.get("sort"));
		model.put("sortOrder", model.get("order"));
		PageList<CrmOfferInfoBean> result = getList(model);
		model.put("total", result.getPageTurn().getRowCount());
		model.put("rows", result.toArray()); 
		AjaxResponseUtil.returnData(response, JsonEncoder.encode(model, "yyyy-MM-dd hh:mm:ss"));
	}

这是测试代码,PowerMockito.when(A).thenReturn(B) 的作用是模拟调用接口,返回需要的数据。A:接口 B:查询结果

@Test
	public void testList() {
		clearModelMap(); //作用是设置一些变量:context     request   response    model    session   multiRequest
		request.setParameter("page", "1");
		request.setParameter("rows", "1");
		PowerMockito.when(crmOfferInfoService.getList(anyMap(), anyInt(), anyInt())).thenReturn( new PageList<CrmOfferInfoBean>(1, 1, 1));
		controller.list(request, response, model);
		assertNotNull( response );
	}

request需要set一些接口中需要的参数

单元测试心得体会

····我是刚大学毕业参加工作没多久,近期部门没有需求,让我们这些新人写单元测试。我跟大多数人一样,一开始在想,为什么别人写的代码让我来写单元测试,单元测试有什么用?带着一连串的疑问,硬着头皮写了两周的单测。
····其实单元测试很有必要,这是对项目对部门来说,对于我们个人来说,没什么必要,单测写几个就会了,掌握了就可以,而我,足足写了两周,这是真搬砖,体力活,对于技术提升来说,没有什么太大的帮助。老员工说写单测可以让你熟悉代码,其实帮助不大,别人的代码逻辑,业务逻辑,不是写哥单测就能搞明白的。
····如果你不幸被安排写单测的话,那么没办法,哈哈,硬着头皮写就好了,写2天就能得心应手,只不过需要足够的耐心,加油

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值