胡玉洋《三分钟学会JUnit单元测试》
2015-10-20 09:50
447 查看
之前在做.net项目的时候,如果需要测试,可以建立一个单元测试项目:
在java中也一样,进行单元测试的时候,可以用JUnit进行测试。
下面用一个超级简单的小例子,来一起学习一下如何使用JUnit进行单元测试。
在使用JUnit之前,要先引入Junit的jar包
假如UserManager类中的三个方法需要被测试,这里列举出UserManager类中需要被测试的三个方法:
建立用来测试UserManager中方法的测试类UserManagerTest.java:
注意:单元测试类必须要继承 junit.framework.TestCase 类。
这时,一个单元测试就建好了( 真的 so easy 有木有?),右键点击被测试方法的方法名 → Run As → JUnit Test,即可执行测试,比如对上面的testAdd方法测试的效果如下:
左上方有表示成功执行的绿色进度条、执行过程中有0个错误和0个失败、执行时间为0.007秒等测试信息。
到此,您就可以通过上述信息进行判断您的模块是否正确,性能是否还可以再优化,也可以用通过调试、打印等方式来辅助观察测试的执行情况。
JUnit断言,听起来很高大上,其实就是JUnit为我们提供的几个函数,用来辅助说明被测方法是否达到了预期效果。
比如JUnit中的一个断言assertEquals(expected,actual),expectd表示测试结果的期望值,actual表示测试结果的实际值。
用在上述测试类UserManagerTest中的testFindUserById()方法中的情景如下:
这里的预期值写的是”Danny”,实际测试效果为测试成功:
当把预期值改为”DannyHoo”,实际测试效果为测试失败:
JUnit还为我们提供了多种断言,比如验证测试结果是否为null的断言——assertNull(object)、验证测试结果是否为true的断言——assertTrue(condition)等等。如果想了解更多,可以参考JUnit的帮助文档,这里不再一
一列举。
为了使项目比较清晰、规范,可以将单元测试的类单独放在一个source folder或者一个包中,比如这种结构:
在java中也一样,进行单元测试的时候,可以用JUnit进行测试。
下面用一个超级简单的小例子,来一起学习一下如何使用JUnit进行单元测试。
1、引入jar包
在使用JUnit之前,要先引入Junit的jar包
2、被测试的方法:
假如UserManager类中的三个方法需要被测试,这里列举出UserManager类中需要被测试的三个方法:<code class="hljs cs has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> UserManager { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">add</span>(String username) { System.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">out</span>.println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"add----"</span>+username); } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">del</span>(String username) { System.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">out</span>.println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"del----"</span>+username); } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> String <span class="hljs-title" style="box-sizing: border-box;">findUserById</span>(String userId){ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Danny"</span>; } }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li></ul>
3、编写单元测试类
建立用来测试UserManager中方法的测试类UserManagerTest.java:<code class="hljs java has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> junit.framework.TestCase; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">UserManagerTest</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">extends</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">TestCase</span> {</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">testAdd</span>() { UserManager usermanager = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> UserManager(); usermanager.add(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Danny"</span>); } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">testDel</span>() { UserManager usermanager = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> UserManager(); usermanager.del(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Danny"</span>); } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">testFindUserById</span>() { UserManager usermanager = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> UserManager(); String username = usermanager.findUserById(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"0001"</span>); System.out.println(username); } }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li></ul>
注意:单元测试类必须要继承 junit.framework.TestCase 类。
4、进行单元测试
这时,一个单元测试就建好了( 真的 so easy 有木有?),右键点击被测试方法的方法名 → Run As → JUnit Test,即可执行测试,比如对上面的testAdd方法测试的效果如下:左上方有表示成功执行的绿色进度条、执行过程中有0个错误和0个失败、执行时间为0.007秒等测试信息。
到此,您就可以通过上述信息进行判断您的模块是否正确,性能是否还可以再优化,也可以用通过调试、打印等方式来辅助观察测试的执行情况。
扩展——JUnit断言
JUnit断言,听起来很高大上,其实就是JUnit为我们提供的几个函数,用来辅助说明被测方法是否达到了预期效果。比如JUnit中的一个断言assertEquals(expected,actual),expectd表示测试结果的期望值,actual表示测试结果的实际值。
用在上述测试类UserManagerTest中的testFindUserById()方法中的情景如下:
<code class="hljs cs has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">testFindUserById</span>() { UserManager usermanager = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> UserManager(); String actual= usermanager.findUserById(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"0001"</span>); String expected=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Danny"</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>.assertEquals(expected,actual);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//断言</span> }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>
这里的预期值写的是”Danny”,实际测试效果为测试成功:
当把预期值改为”DannyHoo”,实际测试效果为测试失败:
JUnit还为我们提供了多种断言,比如验证测试结果是否为null的断言——assertNull(object)、验证测试结果是否为true的断言——assertTrue(condition)等等。如果想了解更多,可以参考JUnit的帮助文档,这里不再一
一列举。
温馨提示
为了使项目比较清晰、规范,可以将单元测试的类单独放在一个source folder或者一个包中,比如这种结构: 相关文章推荐
- 10795 - A Different Task
- YII 2 配置
- 工厂模式简单理解
- git 使用
- explicit关键字
- java调用C#的dll
- 【开源访谈】Countly 联合创始人&CEO Onur Alp Soner 访谈
- Android 广播大全 Intent Action 事件详解
- 客户端原生-话费充值功能的项目总结
- 延迟渲染的一些思考
- Android之android studio如何把项目分享到github并提修改的代码到Github
- maven项目转换成dynamic项目
- 将0,1,3,4,5,6等转化成0~1点,3点,4~6点
- c++自定义消息管理机制(类似cocos2d-x的实现方式)
- MFC里多文档多视图+多线程动态计算、绘制曲线
- NSMutableArray从plist文件中初始化
- maven项目转换成dynamic项目
- 统计数学方法——kd树的构建,kd树的搜索
- HDU 3949 XOR (第k小的异或值)
- 【投稿】Xcode7中你一定要知道的炸裂调试神技