Individual Project

          ——JUnit 4 单元测试


  学习到JUnit单元测试,我拿来测试之前写过的一个计算器(两个依存类:Calc.java CalcFunction.java)。代码已放到github中。

贴出部分代码:

  1. public class Calc extends javax.swing.JFrame{
  2.  
  3. public Calc() {
  4. initComponents();
  5. }
  6.  
  7. private void initComponents() {
  8. java.awt.GridBagConstraints gridBagConstraints;
  9.  
  10. setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
  11. setTitle("\u8ba1\u7b97\u5668");
  12. setBounds(new java.awt.Rectangle(500, 50, 0, 0));
  13. setResizable(false);
  14.  
  15. ···//界面布局
  16.  
  17. }
  18. //主要监听
  19. ActionListener listenerEquals = new ActionListener() {
  20. public void actionPerformed(ActionEvent e) {
  21. formulaStand.setText(edit + "=");
  22. hasPoint = false;
  23. String result;
  24. try {
  25. result = CalcFunction.Evaluate(edit+"=");
  26. } catch (Exception e1) {
  27. result = "syntax error";
  28. }
  29. if (Double.parseDouble(result)%1 == 0) {
  30. editStand.setText(String.valueOf((int)Double.parseDouble((result))));
  31. }else{
  32. editStand.setText(String.valueOf((float)Double.parseDouble((result))));
  33. }
  34. edit = "0";
  35. }
  36. };
  37. }

Calc.java

GUI布局类,运行的结果如下图:通过Botton输入表达式,传入CalcFunction类计算结果

这是计算器实现功能计算的类:

  1. package com.school.indivodial;
  2.  
  3. import java.util.EmptyStackException;
  4. import java.util.Stack;
  5.  
  6. public class CalcFunction {
  7. private static String[] TrnsInToSufix(String IFX) { // PFX放后缀表达式,IFX为中缀表达式
  8. String PFX[] = new String[IFX.length()];
  9. StringBuffer numBuffer = new StringBuffer();// 用来保存一个数的
  10. Stack<String> s = new Stack<String>();// 放操作符
  11. String a;
  12. s.push("=");// 第一个为等号
  13. int i = 0, j = 0;
  14. char ch;
  15.  
  16. ··· // 栈操作,中缀表达式转后缀表达式
  17.  
  18. return PFX;
  19. }
  20.  
  21. public static String Evaluate(String IFX) throws Exception {// 后缀表达式求值
  22.  
  23. String PFX[] = null;
  24. try {
  25. PFX = TrnsInToSufix(IFX);
  26. } catch (EmptyStackException e) {
  27. return "syntax error";
  28. }
  29. int i = 0;
  30. double x1, x2, n;
  31. String str;
  32. Stack<String> s = new Stack<String>();
  33. while (PFX[i] != "=") {
  34. str = PFX[i];
  35. switch (str.charAt(0)) {
  36. case '0':
  37. case '1':
  38. case '2':
  39. case '3':
  40. case '4':
  41. case '5':
  42. case '6':
  43. case '7':
  44. case '8':
  45. case '9':
  46. s.push(str);
  47. break;
  48. case '+':
  49. x1 = Double.parseDouble(s.pop());
  50. x2 = Double.parseDouble(s.pop());
  51. n = x1 + x2;
  52. s.push(String.valueOf(n));
  53. break;
  54. case '-':
  55. x1 = Double.parseDouble(s.pop());
  56. x2 = Double.parseDouble(s.pop());
  57. n = x2 - x1;
  58. s.push(String.valueOf(n));
  59. break;
  60. case '×':
  61. x1 = Double.parseDouble(s.pop());
  62. x2 = Double.parseDouble(s.pop());
  63. n = x1 * x2;
  64. s.push(String.valueOf(n));
  65. break;
  66. case '÷':
  67. x1 = Double.parseDouble(s.pop());
  68. x2 = Double.parseDouble(s.pop());
  69. n = x2 / x1;
  70. s.push(String.valueOf(n));
  71. break;
  72. case 'o':
  73. x1 = Double.parseDouble(s.pop());
  74. n = Math.log10(x1);
  75. s.push(String.valueOf(n));
  76. break;
  77. case 'n':
  78. x1 = Double.parseDouble(s.pop());
  79. n = Math.log1p(x1);
  80. s.push(String.valueOf(n));
  81. break;
  82. case '\u221a'://'√'
  83. x1 = Double.parseDouble(s.pop());
  84. n = Math.sqrt(x1);
  85. s.push(String.valueOf(n));
  86. break;// 开方
  87. case '^':
  88. x1 = Double.parseDouble(s.pop());
  89. x2 = Double.parseDouble(s.pop());
  90. n = Math.pow(x2, x1);
  91. s.push(String.valueOf(n));
  92. break;
  93. ···//其他运算
  94.  
  95. }
  96. i++;
  97. }
  98. String result = s.pop();
  99. return result;
  100. }
  101.  
  102. }

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代码如下:

  1. package com.school.indivodial;
  2.  
  3. import static org.junit.Assert.assertEquals;
  4.  
  5. import org.junit.Test;
  6.  
  7. /**
  8. *
  9. * @author lendoon
  10. *CalcFunction类是Calc类的功能类,
  11. *Calc的UI输入中缀表达式调用CalcFunction的静态Evaluate方法计算返回结果
  12. */
  13. public class CalcFunctionTest {
  14.  
  15. @Test
  16. public void testEvaluate_basic() throws Exception {
  17. Double expectedAnswer = Double.valueOf("90");
  18. Double actualAnswer = Double.valueOf(CalcFunction.Evaluate("100-(22+6×3)÷4="));
  19. assertEquals(expectedAnswer, actualAnswer);
  20. }
  21.  
  22. @Test
  23. public void testEvaluate_pow() throws Exception{
  24. Double expectedAnswer = Double.valueOf("1024");
  25. Double actualAnswer = Double.valueOf(CalcFunction.Evaluate("2^10="));
  26. assertEquals(expectedAnswer, actualAnswer);
  27. }
  28.  
  29. @Test
  30. public void testEvaluate_sqrt() throws Exception{
  31. Double expectedAnswer = Double.valueOf("8");
  32. Double actualAnswer = Double.valueOf(CalcFunction.Evaluate("√64="));
  33. assertEquals(expectedAnswer, actualAnswer);
  34. }
  35.  
  36. @Test
  37. public void testEvaluate_cos() throws Exception{
  38. Double expectedAnswer = Double.valueOf("1");
  39. Double actualAnswer = Double.valueOf(CalcFunction.Evaluate("COS(0)="));
  40. assertEquals(expectedAnswer, actualAnswer);
  41. }
  42. }

CalcFunctionTest.java

Run As -> JUnit Test,结果如图:

测试显示绿色的对号是通过的,显示蓝色叉号的,表示没通过failure。如图中的testEvaluate_cos测试方法。

运行失败,进度条会变成红褐色的,失败有两种情况:

处理结果与预期的有偏差(failure) 和  处理结果时,则直接抛出了异常——测试错误(error)

如图:测试失败的两种情况 

Failure 一般由单元测试使用的断言方法判断失败引起,它表示在测试点发现了问题,如断言"1" 和"1+1=";

而 error 则是由代码异常引起,这是测试目的之外的发现,它可能产生于测试代码本身的错误(测试代码也是代码,同样无法保证完全没有缺陷),也可能是被测试代码中的一个隐藏的 bug 如图中测试代码传入"1+1"没有=,不是一个表达式,在程序运行中会报错。

全部测试成功时,进度条是绿色的:

通过测试,现在的代码已经比较稳定,可以作为 API 的一部分提供给其它模块使用了。

总结:

  经过对JUnit 的了解,简单对之前写的计算器代码做个测试,收获颇丰:JUnit作为最佳实践测试任何可能的错误。单元测试不是用来证明您是对的,而是为了证明您没有错。JUnit还有更强大的功能等着我们去探索。

  

JUnit是一个开放源代码的Java测试框架,用于编写和运行可重复的测试。他是用于单元测试框架体系xUnit的一个实例(用于java语言)。它包括以下特性:
1、用于测试期望结果的断言(Assertion)
2、用于共享共同测试数据的测试工具
3、用于方便的组织和运行测试的测试套件
4、图形和文本的测试运行器    (源于百度百科。相对于百科,wiki百科要简洁得多)

JUnit 4 单元测试的更多相关文章

  1. java如何使用JUnit进行单元测试

    注:所有内容都是在eclipse上实现,关于eclipse的安装和jdk的安装配置,请看:http://www.cnblogs.com/fench/p/5914827.html 单元测试是什么? 百度 ...

  2. Android之如何使用JUnit进行单元测试

    转的:http://www.blogjava.net/qileilove/archive/2014/05/19/413824.html Android中如何使用JUnit进行单元测试 在我们日常开发a ...

  3. 使用Spring配合Junit进行单元测试的总结

    最近公司的项目和自己的项目中都用到了spring集成junit进行单元测试,总结一下几种基本的用法: 1.直接对spring中注入的bean进行测试(以DAO为例): 在测试类上添加@RunWith注 ...

  4. Spring(3)—— Junit框架单元测试

    Junit主要用于单元测试,即白盒测试.它是一个开源的由JAVA开发的一个用于测试的框架. Junit的几个基本概念:TestCase,TestSuite,TestFixtrue TestCase:代 ...

  5. JUnit + Mockito 单元测试(二)

    摘自: http://blog.csdn.net/zhangxin09/article/details/42422643 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 入门 ...

  6. spring junit 做单元测试,报 Failed to load ApplicationContext 错误

    spring junit 做单元测试,报 Failed to load ApplicationContext 错误. 查找了好一会,最后发现.@ContextConfiguration(locatio ...

  7. 使用 JUnit 进行单元测试 - 教程

    tanyuanji@126.com 版本历史 JUnit 该教程主要讲解 JUnit 4.x 版本的使用,以及如何在Eclipse IDE 中如何使用JUnit   目录 tanyuanji@126. ...

  8. JUnit + Mockito 单元测试(二)(good)

    import org.junit.Test; import org.mockito.Matchers; import org.mockito.Mockito; import java.util.Lis ...

  9. 使用Junit进行单元测试

    使用Junit进行单元测试 一.目的和要求 JUnit是一款由Erich Gamma(<设计模式>的作者)和Kent Beck(极限编程的提出者)编写的开源的回归测试框架,供Java编码人 ...

随机推荐

  1. [iOS][issis] requestLocationWithReGeocode AMapLocationErrorDomain Code=5 "取消"

    Tip: IOS 使用高德地图一次定位  (在该博客找到了解决答案) 在定位时如果出现下面这个Error,说明你的locationManager没有设置成全局变量,导致locationManager提 ...

  2. sql 连接查询的区别 inner,left,right,full

    --table1 表 ID NAME QQ PHONE1 秦云 10102800 135000002 在路上 10378 136000003 LEO 10000 139000004 秦云 024145 ...

  3. Linux中设置服务自启动的三种方式

    有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务 主要用三种方式进行这一操作: ln -s                       在/etc/rc.d/rc*.d目录中建立/e ...

  4. djangocms安装技巧

    首先python的版本要高一些,否则安装django-cms会报错 安装cmsinstaller不能够正常下载 利用virtualenv进行安装配置 注意中文的配置 djangocms配置中文 dja ...

  5. Node聊天程序实例02:chat_server.js

    作者:vousiu 出处:http://www.cnblogs.com/vousiu 本实例参考自Mike Cantelon等人的<Node.js in Action>一书. chat_s ...

  6. ubuntu 14.04 java开发环境搭建 jdk 以及 inteliJ IDEA安装

    1.安装包 jdk1.7.0_71 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-188026 ...

  7. javascript中的窗口和框架

    框架: 在网络上我们可以看到很多WEB应用程序都是使用框架(frame)来分隔浏览器窗口的,就想一块块玻璃隔板把窗口分隔成好几个小窗口,并且可以在不同的小窗口中加载显示不同的页面,这样在我们看来好像是 ...

  8. iOS - WXPay 微信支付

    1.微信支付申请 微信支付官方集成指引 微信支付官方集成指导视频 微信 APP 支付开发者文档 微信公众平台 微信开放平台 微信商户平台 1.1 微信 APP 支付申请步骤 APP 支付:APP 支付 ...

  9. 说说focus /focusin /focusout /blur 事件

    事件触发时间 focus:当focusable元素获得焦点时,不支持冒泡:focusin:和focus一样,只是此事件支持冒泡:blur:当focusable元素失去焦点时,不支持冒泡:focusou ...

  10. java利用Scanner获取键盘输入

    首发地址:我的网易博客 在运行一个java程序的时候,可能我们需要在运行的时候传递一些参数进去...咋办呢... java提供了一个Scanner类,利用这个类,我们可以很方便的获取键盘输入的参数.. ...