junit - lixidaydayup/plan GitHub Wiki
我们的程序大体上分为N个模块,模块是一种功能的概念,比如”登录模块”,“商品列表”,“商品详情”等等,然后某个模块都包括一些细分的功能,比如某个函数,“当输入为lixi的时候 返回:用户存在 输入为huhaonan的时候 返回:用户不存在”。 这是一个非常细小的功能。针对这种细小的函数进行的测试就叫做“单元测试”,否则叫做“集成测试”,其他的还有“回归测试”等等,你要自己复习一下。
单元测试的目的,就是要保证你的这个小函数,永远是正确的,单元测试要一直试图使用各种方式,让你的程序出问题,比如该输入用户名的时候,给你传一个null,应该要输入字母的地方给你输入一个数字,等等。在这种健壮的考验下面,你的函数,在遇到任何问题的时候,都能很好地处理,表现得跟你预期一样。所以,单元测试的方式就是“用各种不同的输入case,包括good case(你本来期望的输入参数) 和 bad case (你并不期望的输入参数,为空,为乱码,为中文等等), 然后期待程序在 good case下面输出正确的结果,在bad case下面能很好的处理异常,不至于程序挂掉。
junit是一个可以帮助java开发人员简易地编写单元测试的框架,在它的帮助下面,可以很容易地,很自由地编写单元测试
单元测试最核心的地方就是断言,断言就是告诉程序,这个地方我期望的结果,是比如A.equals(B).如果不是的话,请报错,告诉我单元测试失败了。 具体的断言包括
assertEquals(A, B); // A要跟B相等
assertTrue(person.getName().equals("lixi")) // 这个括号里面的一定要是true
assertNotNull(person); // 这个对象不能为null
比如我们现在有这么一个函数
public String getName(Person person) {
return person.getName();
}
针对这个函数,我们首先看到,调用了person.getName()
,但是并没有测试person到底是不是null。根据这个我们可以构造bad case。然后这个函数的作用是返回person的那么属性,那么我们需要构造一个good case,是说,假如我传入了一个name叫"lixi"的person对象进去,输入的String一定要等于"lixi",所以我们会编写2个TestCase
- good case
@Test
public void testGoodCase() {
Person p = new Person();
p.setName("lixi");
String yourName = getName(p);
assertEquals(yourName, "lixi");
}
- bad case
@Test
public void testBadCase() {
Person p = null;
assertNotNull(getName(p)); // 这里就会报错,因为我们的程序没有判断是否是null
}
很显然,good case是一定可以通过的,但是bad case,注意到我们传入了一个null,在调用getName的时候一定会抛异常,这样就过不了了。那我们就必须去改进我们的程序,可以处理这种null的问题,改进如下:
public String getName(Person person) {
// 如果是null 那么直接返回空白字符串
if(person == null) {
return "";
}
return person.getName();
}