JUnit 4 单元测试
Individual Project
——JUnit 4 单元测试
学习到JUnit单元测试,我拿来测试之前写过的一个计算器(两个依存类:Calc.java CalcFunction.java)。代码已放到github中。
贴出部分代码:
public class Calc extends javax.swing.JFrame{ public Calc() { initComponents(); } private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setTitle("\u8ba1\u7b97\u5668"); setBounds(new java.awt.Rectangle(500, 50, 0, 0)); setResizable(false); ···//界面布局 } //主要监听 ActionListener listenerEquals = new ActionListener() { public void actionPerformed(ActionEvent e) { formulaStand.setText(edit + "="); hasPoint = false; String result; try { result = CalcFunction.Evaluate(edit+"="); } catch (Exception e1) { result = "syntax error"; } if (Double.parseDouble(result)%1 == 0) { editStand.setText(String.valueOf((int)Double.parseDouble((result)))); }else{ editStand.setText(String.valueOf((float)Double.parseDouble((result)))); } edit = "0"; } }; }
Calc.java
GUI布局类,运行的结果如下图:通过Botton输入表达式,传入CalcFunction类计算结果
这是计算器实现功能计算的类:
package com.school.indivodial; import java.util.EmptyStackException; import java.util.Stack; public class CalcFunction { private static String[] TrnsInToSufix(String IFX) { // PFX放后缀表达式,IFX为中缀表达式 String PFX[] = new String[IFX.length()]; StringBuffer numBuffer = new StringBuffer();// 用来保存一个数的 Stack<String> s = new Stack<String>();// 放操作符 String a; s.push("=");// 第一个为等号 int i = 0, j = 0; char ch; ··· // 栈操作,中缀表达式转后缀表达式 return PFX; } public static String Evaluate(String IFX) throws Exception {// 后缀表达式求值 String PFX[] = null; try { PFX = TrnsInToSufix(IFX); } catch (EmptyStackException e) { return "syntax error"; } int i = 0; double x1, x2, n; String str; Stack<String> s = new Stack<String>(); while (PFX[i] != "=") { str = PFX[i]; switch (str.charAt(0)) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': s.push(str); break; case '+': x1 = Double.parseDouble(s.pop()); x2 = Double.parseDouble(s.pop()); n = x1 + x2; s.push(String.valueOf(n)); break; case '-': x1 = Double.parseDouble(s.pop()); x2 = Double.parseDouble(s.pop()); n = x2 - x1; s.push(String.valueOf(n)); break; case '×': x1 = Double.parseDouble(s.pop()); x2 = Double.parseDouble(s.pop()); n = x1 * x2; s.push(String.valueOf(n)); break; case '÷': x1 = Double.parseDouble(s.pop()); x2 = Double.parseDouble(s.pop()); n = x2 / x1; s.push(String.valueOf(n)); break; case 'o': x1 = Double.parseDouble(s.pop()); n = Math.log10(x1); s.push(String.valueOf(n)); break; case 'n': x1 = Double.parseDouble(s.pop()); n = Math.log1p(x1); s.push(String.valueOf(n)); break; case '\u221a'://'√' x1 = Double.parseDouble(s.pop()); n = Math.sqrt(x1); s.push(String.valueOf(n)); break;// 开方 case '^': x1 = Double.parseDouble(s.pop()); x2 = Double.parseDouble(s.pop()); n = Math.pow(x2, x1); s.push(String.valueOf(n)); break; ···//其他运算 } i++; } String result = s.pop(); return result; } }
CalcFunction.java
下面进行单元测试:测试CalcFunction类的方法计算结果是否有错误。
首先要在该工程下导入JUnit库 具体做法:Build Path -> Config Build Path ... -> Add Libraries ... 选中JUnit Next-> 选择JUnit 4 Finished
添加完成
创建测试用例
new -> Java Test Case Name:CalcFunctionTest Next-> 选择要测试的方法 ->finished
自动生成一个测试类CalcFunctionTest,里面包含一些空的测试用例,@Test 注解的。只需要将这些测试用例稍作修改即可使用。完整的CalcFunctionTest代码如下:
package com.school.indivodial; import static org.junit.Assert.assertEquals; import org.junit.Test; /** * * @author lendoon *CalcFunction类是Calc类的功能类, *Calc的UI输入中缀表达式调用CalcFunction的静态Evaluate方法计算返回结果 */ public class CalcFunctionTest { @Test public void testEvaluate_basic() throws Exception { Double expectedAnswer = Double.valueOf("90"); Double actualAnswer = Double.valueOf(CalcFunction.Evaluate("100-(22+6×3)÷4=")); assertEquals(expectedAnswer, actualAnswer); } @Test public void testEvaluate_pow() throws Exception{ Double expectedAnswer = Double.valueOf("1024"); Double actualAnswer = Double.valueOf(CalcFunction.Evaluate("2^10=")); assertEquals(expectedAnswer, actualAnswer); } @Test public void testEvaluate_sqrt() throws Exception{ Double expectedAnswer = Double.valueOf("8"); Double actualAnswer = Double.valueOf(CalcFunction.Evaluate("√64=")); assertEquals(expectedAnswer, actualAnswer); } @Test public void testEvaluate_cos() throws Exception{ Double expectedAnswer = Double.valueOf("1"); Double actualAnswer = Double.valueOf(CalcFunction.Evaluate("COS(0)=")); assertEquals(expectedAnswer, actualAnswer); } }
CalcFunctionTest.java
Run As -> JUnit Test,结果如图:
测试显示绿色的对号是通过的,显示蓝色叉号的,表示没通过failure。如图中的testEvaluate_cos测试方法。
运行失败,进度条会变成红褐色的,失败有两种情况:
处理结果与预期的有偏差(failure) 和 处理结果时,则直接抛出了异常——测试错误(error)
如图:测试失败的两种情况
Failure 一般由单元测试使用的断言方法判断失败引起,它表示在测试点发现了问题,如断言"1" 和"1+1=";
而 error 则是由代码异常引起,这是测试目的之外的发现,它可能产生于测试代码本身的错误(测试代码也是代码,同样无法保证完全没有缺陷),也可能是被测试代码中的一个隐藏的 bug 如图中测试代码传入"1+1"没有=,不是一个表达式,在程序运行中会报错。
全部测试成功时,进度条是绿色的:
通过测试,现在的代码已经比较稳定,可以作为 API 的一部分提供给其它模块使用了。
总结:
经过对JUnit 的了解,简单对之前写的计算器代码做个测试,收获颇丰:JUnit作为最佳实践测试任何可能的错误。单元测试不是用来证明您是对的,而是为了证明您没有错。JUnit还有更强大的功能等着我们去探索。
JUnit 4 单元测试的更多相关文章
- java如何使用JUnit进行单元测试
注:所有内容都是在eclipse上实现,关于eclipse的安装和jdk的安装配置,请看:http://www.cnblogs.com/fench/p/5914827.html 单元测试是什么? 百度 ...
- Android之如何使用JUnit进行单元测试
转的:http://www.blogjava.net/qileilove/archive/2014/05/19/413824.html Android中如何使用JUnit进行单元测试 在我们日常开发a ...
- 使用Spring配合Junit进行单元测试的总结
最近公司的项目和自己的项目中都用到了spring集成junit进行单元测试,总结一下几种基本的用法: 1.直接对spring中注入的bean进行测试(以DAO为例): 在测试类上添加@RunWith注 ...
- Spring(3)—— Junit框架单元测试
Junit主要用于单元测试,即白盒测试.它是一个开源的由JAVA开发的一个用于测试的框架. Junit的几个基本概念:TestCase,TestSuite,TestFixtrue TestCase:代 ...
- JUnit + Mockito 单元测试(二)
摘自: http://blog.csdn.net/zhangxin09/article/details/42422643 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 入门 ...
- spring junit 做单元测试,报 Failed to load ApplicationContext 错误
spring junit 做单元测试,报 Failed to load ApplicationContext 错误. 查找了好一会,最后发现.@ContextConfiguration(locatio ...
- 使用 JUnit 进行单元测试 - 教程
tanyuanji@126.com 版本历史 JUnit 该教程主要讲解 JUnit 4.x 版本的使用,以及如何在Eclipse IDE 中如何使用JUnit 目录 tanyuanji@126. ...
- JUnit + Mockito 单元测试(二)(good)
import org.junit.Test; import org.mockito.Matchers; import org.mockito.Mockito; import java.util.Lis ...
- 使用Junit进行单元测试
使用Junit进行单元测试 一.目的和要求 JUnit是一款由Erich Gamma(<设计模式>的作者)和Kent Beck(极限编程的提出者)编写的开源的回归测试框架,供Java编码人 ...
随机推荐
- 微信,qq,微博如何不用每次清缓存就能看到h5修改过的结果
描述:每次在对js,和css进行修改,想要在微信,微博或则qq里面预览效果,会发现没有生效,那是因为这些客户端会将静态进行缓存,我们需要清理缓存才能看到修改过的效果,但是每次清理缓存会很麻烦,影响开发 ...
- Spring Security3中的-authentication-manager标签详解
讲解完http标签的解析过程,authentication-manager标签解析部分就很容易理解了 authentication-manager标签在spring的配置文件中的定义一般如下 < ...
- Codeforces Round #385 (Div. 2) A,B,C 暴力,模拟,并查集
A. Hongcow Learns the Cyclic Shift time limit per test 2 seconds memory limit per test 256 megabytes ...
- File API 读取上传的文件
1, 在html 文档中,<input type="file"> 我们可以选择文件进行上传,但这时只能上传一个文件.如果加上multiple 属性,可以上传多个文件,上 ...
- App分类
目前主流应用程序大体分为三类:Web App.Hybrid App. Native App.web app(网页应用)hybrid app(混合应用)native app(原生应用) 淘宝天猫这样的超 ...
- [android]判断位置服务是否打开
public boolean isLocationEnabled() { int locationMode = 0; String locationProviders; if (Build.VERSI ...
- js json 特定条件删除 增加 遍历
<script type="text/javascript"> //直接声明json数据结构 var myJSONObject = [ ...
- iOS使用Security.framework进行RSA 加密解密签名和验证签名
iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...
- alibaba fastjson List<Map<String, String>>2Str
import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map; impo ...
- js文件如何最后加载
总结一下,大概有三种方式 1.最简单粗暴的:将js文件放在最后写 2.window.onload当一个文档完全下载到浏览器中时,才会触发window.onload事件.这意味着页面上的全部元素对js而 ...