UNIT TEST

单元测试指南
本文详细介绍了单元测试的重要性和规范,包括常用的单元测试框架如Junit、TestNG等,以及Maven项目中单元测试的组织方式。文章还提供了单元测试的最佳实践,如测试方法的命名规则、测试范围的选择、测试代码的质量要求等。

单元测试技术:
1.Junit : http://junit.org/
2.testNG : http://testng.org/doc/index.html
3.Mock: http://jmock.org/
4.Spring Test: https://github.com/spring-projects/spring-test-mvc
单元测试规范
1.maven项目,会生成4个目录,1.源代码目录(src/main/java),2.单元测试目录(src/test/java),3.资源目录(src/main/resources),4.测试资源目录(src/test/resources).使用maven的时候,单元测试代码放在测试目录中(src/test/java).
2.测试包的规则:
a.测试类的包应该和被测试类的包名保持一致
2. 测试类的规则:
a.被测试的类名+Test 例子: 比如有一个类叫 IrgSrhDelegate,那么它的测试类的命名就是 IrgSrhDelegateTest
3.测试方法规则:
a.测试用例的命名规则是:test+用例方法名称. 例子:被测试的方法叫updateData,那么测试用例的命名就是testUpdateData
b.测试方法必须使用public void进行修饰,并且不能带有任何的参数;
c.测试方法上必须使用@Test进行修饰;
d.单元测试应该覆盖所有的代码路径,包括错误处理路径,为了保证单元测试的代码覆盖率,单元测试必须测试公开的和私有的函数/方法
a.测试任何可能失败的事物。测试主执行路径很好,而且很需要做;但测试异常处理可能更重要。如果主执行路径出错,那么可能应用程序也无法工作
b.单元测试的范围要全面,比如对边界值、正常值、错误值的测试
e.不允许一个测试方法中包含多个测试场景,必须只有一个测试场景。单元测试一个重要的方面就是细粒度。
f.测试方法速度一定要快。一个测试运行时间是几秒钟,而不是几分钟
g.测试方法中不允许出现System.out.Println(),如果要调用,请使用Log日志类。
h.测试单元中的每个方法必须可以独立测试,测试方法间不可以有任何的依赖
i.如果使用数据来存取数据,不能讲测试数据存放到实际的业务系统中。
1.如果系统代码部署到生产环境时,请与各模块负责人沟通,开通一个测试数据库。将测试数据存储到测试数据库中
j.尽可能地利用JUnit提供地assert/fail方法以及异常处理的方法,可以使代码更为简洁
k.如果测试方法业务逻辑比较复杂,必须加上注释
l.让异常测试易读。把catch块中的异常变量命名为expected,这样就可以明确的告知读代码的人,这个异常是我们预期的,抛出异常才能让测试通过,在catch块中加入assertTrue(true)语句也进一步强调,这才是正确的执行路径
m.在assert调用中解释失败原因。无论何时,只要你用到assertTrue,assertFalse,assertNull,assertNotNull方法,请记住要使用第第二个参数是String类型的那个方法,这个参数让你可以提供一个有意义的文本描述,在断言失败的时候,Junit TestRunner 会显示这个描述,若不使用这个参 数,那么当测试失败时就比较难找出失败原因了。
n.测试方法的代码结构相同,仅仅是测试数据和期望值不同,请使用Junit的参数化功能。
o.测试方法中需要使用到比较“”昂贵“ 的资源分配或者释放,比如数据库连接,请使用BeoreClass/AfterClass.
p.至少保证测试方法执行过2次以上。
q.必须保证整个测试类都能顺利测试通过
r.必须考虑不同的系统环境的测试数据。
a.比如本地环境的数据库中UserId的数据只有1条,但是生产环境有大于20条,断言的时候就不能使用Assert.assertEquals(1,userId.data.length),否则单元测试在生产环境就测试fail。

以下是一些单元测试的开参考:
1.在编写单元测试代码的时候,要注意如下几个方法(非常重要,以下都是以JUnit4为例):
(1)测试方法上必须使用@Test进行修饰;
(2)测试方法必须使用public void进行修饰,并且不能带有任何的参数;
(3)新建一个源代码目录来存放我们的测试代码,如果是maven项目的话,会生成3个目录,一个是源代码目录(src/main/java),一个是单元测试目录(src/test/java),一个是资源目录(src/main/resources),使用maven的时候,我们把单元测试代码放在测试目录中;
(4)测试类的包应该和被测试类的包名保持一致;
(5)测试单元中的每个方法必须可以独立测试,测试方法间不可以有任何的依赖;
(6)测试类使用Test作为类名的后缀(不是一定要这样做,这是最佳实践);
(7)测试方法使用test作为方法名的前缀(不是一定要这样做,这是最佳实践)
2.junit4注解名词解释:
1.使用简单的 @Test 注解实现我们的测试方法的编写和执行
2.使用@Test 的 Ignore 属性指定测试时跳过某個方法
3.使用注解 @Before 和 @After来完成每个测试方法的前置工作和后置工作
4.使用@BeforeClass 和 @AfterClass 来完成只需要执行1次,完成类的前置工作和后置工作
5.使用@Test的属性 timeout 来完成限时测试,以检测代码中的死循环
6.使用@Test的属性expected来监控测试方法中可能会抛出的某些异常
7.指定 JUnit 运行测试用例时的 Runner(注解放在类上面)
1.@RunWith(JUnit4.class) 指定使用使用junit4
2.@RunWith(Parameterized.class) 使用参数化测试完成需要录入大量数据的测试
3.@RunWith(Suite.class) 将所有的测试用例打包后集中测试
3.如何测试:
1.一个测试方法只测试一种情况,一个方法中的多次测试,只会混乱你的测试目的。单元测试一个重要的方面就是细粒度。
2.测试任何可能的错误,测试代码不是为了证明你是对的,而是努力为了证明你没有错。因此对测试的范围要全面,比如边界值、正常值、错误值;对代码可能出现的问题要全面预测。
3.让你的测试帮助改善你的代码(let the test improve the code)。测试代码永远是我们代码的第一个用户,所以不仅让他帮组我们发现Bug,还要帮组我们改善我们的设计,就是有名的测试驱动开发(Test-Driven Development,TDD)。
4.确保测试与时间无关,不要依赖使用过期的数据进行测试。导致在随后的维护过程中很难重现测试
5.将测试代码和工作代码放在一起,一边同步编译和更新(maven支持测试代码一起编译)
6.尽可能地利用JUnit提供地assert/fail方法以及异常处理的方法,可以使代码更为简洁
7.考察单元测试的覆盖率。
8.在assert调用中解释失败原因。无论何时,只要你用到assertTrue,assertFalse,assertNull,assertNotNull方法,请记住要使用第一个参数是String类型的那个方法,这个参数让你可以提供一个有意义的文本描述,在断言失败的时候,Junit TestRunner 会显示这个描述,若不使用这个参数,那么当测试失败时就比较难找出失败原因了。
9.不要在mock object中牵扯到业务逻辑
10.junit4尽量不要依赖或假定测试运行的顺序(testng可以设定执行顺序)
11.测试要尽可能地小,执行速度快
12.给测试方法起个好名字(choose meaningful test method names)。应该是用形如testXXXYYY(),这样的格式来命名你的测试方法。前缀test是Junit查找测试方法的依据,XXX应该是你测试的方法名,YYY应该是你测试的状态。当然如果你只有一种状态需要测试可以直接命名为testXXX()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值