一、什么是单元测试:
单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。
比如对函数abs()
,我们可以编写出以下几个测试用例:
输入正数,比如1
、1.2
、0.99
,期待返回值与输入相同;
输入负数,比如-1
、-1.2
、-0.99
,期待返回值与输入相反;
输入0
,期待返回0
;
输入非数值类型,比如None
、[]
、{}
,期待抛出TypeError
。
把上面的测试用例放到一个测试模块里,就是一个完整的单元测试。
如果单元测试通过,说明我们测试的这个函数能够正常工作。如果单元测试不通过,要么函数有bug,要么测试条件输入不正确,总之,需要修复使单元测试能够通过。
单元测试通过后有什么意义呢?如果我们对abs()
函数代码做了修改,只需要再跑一遍单元测试,如果通过,说明我们的修改不会对abs()
函数原有的行为造成影响,如果测试不通过,说明我们的修改与原有行为不一致,要么修改代码,要么修改测试。
二、何时写
单元测试与具体实现代码同时进行。
三、写多细
哪些代码需要有单元测试覆盖:
1、逻辑复杂的
2、容易出错的
3、不易理解的,即使是自己过段时间也会遗忘的,看不懂自己的代码,单元测试代码有助于理解代码的功能和需求
4、公共代码。比如自定义的所有http请求都会经过的拦截器;工具类等。
5、 核心业务代码。一个产品里最核心最有业务价值的代码应该要有较高的单元测试覆盖率。
四、怎么写:
1、eclipse里使用junit4 框架以及log4j可以,这里借助这位兄台的博文,感觉比自己总结的详细多了,
https://www.cnblogs.com/ysw-go/p/5447056.html
五、Assert断言
断言是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。
1、Junit测试框架中Assert类就是实现断言的工具,主要作用如下:单元测试用于判断某个特定条件下某个方法的行为;执行单元测试为了证明某段代码的执行结果和期望的一致,下面介绍Junit测试库中几种常用的断言。
1)assertEquals(expected, actual):查看两个对象是否相等。类似于字符串比较使用的equals()方法;
assertNotEquals(first, second):查看两个对象是否不相等。
expected为用户期望某一时刻对象的值,actual为某一时刻对象实际的值。如果这两值相等的话(通过对象的equals方法比较),说明代码运行是正确的。
2)assertNull(object):查看对象是否为空。
assertNotNull(object):查看对象是否不为空。
3)assertSame(expected, actual):查看两个对象的引用是否相等,类似于使用“==”比较两个对象;
assertNotSame(unexpected, actual):查看两个对象的引用是否不相等,类似于使用“!=”比较两个对象。
4)assertTrue(String message, boolean condition) 要求condition == true,查看运行的结果是否为true;
assertFalse(String message, boolean condition) 要求condition == false,查看运行的结果是否为false。
以判断某个条件是真还是假,如果和预期的值相同则测试成功,否则测试失败。
5)assertArrayEquals(String message, XXX[] expecteds,XXX [] actuals) 要求expected.equalsArray(actual),即查看两个数组是否相等。
assertThat(String reason, T actual, Matcher matcher) :要求matcher.matches(actual) == true,使用Matcher做自定义的校验。
6)fail:能使测试立即失败,这种断言通常用于标记某个不应该被到达的分支。通常用于测试在应该抛出异常的时候确实会抛出异常。