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编码人 ...
随机推荐
- 蚁群算法简介(part3: 蚁群算法之更新信息素)
信息素的局部更新策略 每只蚂蚁在构造出一条从起点到终点的路径后,蚁群算法还要求根据路径的总长度来更新这条路径所包含的每条边上信息素的浓度(在旅行商问题中每座城市是图中的一个节点,城市两两间有一条边 ...
- Linux查看程序端口占用情况
今天发现服务器上Tomcat 8080端口起不来,老提示端口已经被占用. 使用命令: ps -aux | grep tomcat 发现并没有8080端口的Tomcat进程. 使用命令:netstat ...
- hightcharts 3d 堆积图下钻
图片效果 ***************代码部分****************************************************** <!doctype html> ...
- virsh创建和恢复快照
virsh创建快照: virsh snapshot-create-as image的名称 snapshot的名称 例如: virsh snapshot-create-as 172.16.1.1_cen ...
- nodejs的第四天学习笔记
一. ECMAScript6(es2015)es6语法 es6/es2015,在es5的基础上扩展了很多新的功能,我们要学习仅仅是es6中的部分常用新功能,这些功能在使用的时候一定要慎重,因为他们之中 ...
- matlab 视频转换到图像并保存
图像处理中像Adas.车辆检测等都需要采用视频文件比较好处理一点,利用帧差法.背景减法.光流法等,那么将视频文件转换到图像文件怎么做呢?话不多说,见代码一目了然: %================= ...
- IntelliJ IDEA中Maven项目的默认JDK版本
在IntelliJ IDEA 15中使用Maven时,IDEA将默认的编译版本.源码版本设置为jdk5.编译项目的时候出现警告:"Warning:Java: 源值1.5已过时, 将在未来所有 ...
- linux命令格式及基础命令(一)
linux命令格式 ~]#COMMAND [选项] [参数] 例如: ~]#ls 不带任何选项和参数 ``` stylus ~]#ls -lh /etc 列出/etc下所有文件和目录,同时要求以格式和 ...
- css3新增选择器
1. img[alt]:匹配页面标签中任意一个含有alt属性的标签 2. 匹配开头:img[alt^="film"] 匹配包含内容:img[alt*="film" ...
- Code First Migrations 数据迁移小记
用了codefirst后一个很大的问题就是代码中的属性字段与数据库中表的同步问题,删掉数据库重新生成当然可以解决,不过数据就丢失了(当然通过代码中初始化数据库添加数据也可以解决,初始化的任务可以通过重 ...