junit的意义
写了这么久代码了,自己从来没有好好的玩过junit。马上过年了,打算趁这段时间自己来写一套web框架,但是这里有一个很大的尴尬就是我平时编码并没有认真的来写测试类。那么自己在写框架的时候,不测试肯定是不好的,一点保障都没有了。所以在写框架之前,还是要认真的好好的研究下junit。在这里为喜欢junit而且不幸读到本人这一系列文章的人推荐2本书:junit实战+有效的单元测试。这2本书都挺好的,值得一看。我也是基于这2本书来整理junit系列内容。
OK,言归正传,开始步入正题。
- 为什么要使用junit?
这个问题我觉得很有必要这里拉出来讨论半天,因为就我自己的切身经验而讲,junit最大的用处就是代码建模。我以前看过TTD相关的资料,对于测试驱动开发带来的代码结构上的优势也是比较有心得的。至于其他比如说代码的健壮性,代码的功能性等等我觉得其实收获不大,不管我们开发的自测还是测试人员的测试我觉得基本的功能都差不多能跑,但是代码如果是一坨屎的话,这的确是一个很恶心的事情。所以我们要基于给测试提供便利来编码正常代码,那么这个时候我们的代码结构就会好很大,以后的代码维护量也变得更加合理。其实关于测试的意义,还有测试驱动开发的种种原因好多资料有大量的介绍,说句最实在的话,如果这个东西写的不好或者说没有太大必要的话,也不会这么主流,对吧。所以存在即合理,真正被发扬光大肯定是有足够的原因的。
OK,现在我们这里引入一个不使用和使用junit的例子来开篇junit系列。
现在我们写一个工具类,就写一个关于计算的类吧。代码如下:
package juint.main; /**
* @创建作者: LinkinPark
* @创建时间: 2016年1月9日
* @功能描述: 一个计算类
*/
public class Calculater
{ // 一个加法计算
public static double add(double numberA, double numberB)
{
return numberA + numberB;
} }
上面的代码很简单,我们这里不再啰嗦为什么测试的意义,别动不动就说这么简单的代码不需要测试,千里之行还始于足下呢。OK,现在开始为该类编写测试。
OK,如果我们不使用单元测试,一般都是自己写一个main方法来进行测试。代码如下:
package juint.main; /**
* @创建作者: LinkinPark
* @创建时间: 2016年1月9日
* @功能描述: 计算类相关测试类
*/
public class CalculaterTest
{
public static void main(String[] args)
{
Double result = Calculater.add(1, 2);
if (result != 3)
{
System.out.println("测试不通过,因为结果出错了呢");
}
else
{
System.out.println("测试通过了,但是这个时候必须要去控制台去看了呢");
}
} }
上面的代码表面上看没一点问题,但是现在我们一点都没有考虑代码向后兼容性。如果我们写多个方法的话连一起测试都不可以,连成功了个数和失败了的个数都不知道,这也太土了。那OK,我们现在换一种思路,用Java中的异常来处理测试不通过的情况;代码如下:
package juint.main; /**
* @创建作者: LinkinPark
* @创建时间: 2016年1月9日
* @功能描述: 计算类相关测试类
*/
public class CalculaterTest
{
private static int errors = 0; public static void main(String[] args)
{
try
{
add();
}
catch (IllegalAccessException e)
{
errors++;
e.printStackTrace();
}
if (errors > 0)
{
System.out.println("一共有" + errors + "错误");
}
} private static void add() throws IllegalAccessException
{
Double result = Calculater.add(1, 2);
if (result != 3)
{
throw new IllegalAccessException("测试没通过。。。");
}
} }
现在的代码好了一点了,但是仍然存在3个问题:
1,不管说测试有没有通过,我们都要必须去顶着控制台去看,然后找出我们自己写的那些输入,很麻烦
2,我们如果写多个测试类或者测试方法,那么我们希望各个测试单元就不应该互相影响。为了使每个单元测试都能够真正独立运行,就应该在不同的类实例中运行他们,理想情况就是在不同的类加载器实例中运行他们。
3,如果我们不小心就很有可能遗漏掉了某些测试而且这个时候我们还不知道,或者说我们也没有办法人工来控制说那些测试执行和和那些测试不执行,这是一个很严重的设计上的问题。
上面我们的程序一些不起眼的改进就突出体现了所有单元测试框架应该遵循的三大规则:
1,每个单元测试都必须独立于其他所有单元测试而运行
2,框架应该以单个测试为单位来检测和报告错误
3,应该易于定义要运行那些单元测试。
本篇主要强调下了测试的意义,最后这里我以junit的设计目标来结束这篇博客:
- junit有3大设计目标:
1,框架必须帮助我们编写有用的测试
2,框架必须帮助我们创建具有长久价值的测试
3,框架必须帮助我们通过服用代码来降低编写测试的成本。
junit的意义的更多相关文章
- 十大Java人物
James Gosling : Java之父文/陶文 作 为Java之父,James Gosling的名字可谓是耳熟能详.当人们评论一种编程语言时,总喜欢捎带着把下蛋的母鸡一起带上.Java做为中国的 ...
- 敏捷史话(十三):我被 Facebook 解雇了——Kent Beck
2011年,Kent Beck 加入了 Facebook .那时候的他已年过半百,几十年的经验让他自认为非常了解软件行业.在 Facebook 的新手训练营期间,Kent 开始意识到,Facebook ...
- OO_Unit 3 JML规格化设计总结
OO_Unit 3 JML规格化设计总结 JML语言概述(Level 0) 概念定义 JML(Java Modeling Language)是用于对Java程序进行规格化设计的一种表示语言.JML ...
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
- [Android]使用自定义JUnit Rules、annotations和Resources进行单元测试(翻译)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5795091.html 使用自定义JUnit Rules.ann ...
- 关于intellij IDEA 上junit的用法
话说,最近正在看视频学java.里面有个叫做junit的东西很有用.但是实话说我摆弄了半天都没弄明白. 今天呢通过一些资料,终于弄清楚了junit的大致用法,这里写出来,用以分享和备忘. 首先,环境和 ...
- JsUnit && JUnit之讲解
首先我们定义我们的函数 这里以最简单的加减乘除四个方法来进行测试 建立我们的js文件myjs.js function add(num1,num2){ return num1 + num2; } fun ...
- JUnit学习总结
Junit简介: Junit最初是由Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework),为单元测试(Unit Test) ...
- [深入JUnit] 为什么别测试private函数
[深入JUnit] 为什么别测试private函数 摘自http://www.tuicool.com/articles/iumaayJ 时间 2016-03-28 10:58:03 SegmentFa ...
随机推荐
- Appium dmg 安装:[TypeError: Cannot read property 'replace' of undefined]
问题原因:appium dmg 版本没有默认node.js 解决方案:安装稳定版的node.js.(官网下载安装即可.) 验证:命令行输入:node -v 查看版本号 npm -v 查看版本号
- View 动画 Animation 运行原理解析
这次想来梳理一下 View 动画也就是补间动画(ScaleAnimation, AlphaAnimation, TranslationAnimation...)这些动画运行的流程解析.内容并不会去分析 ...
- Android开发之漫漫长途 XI——从I到X的小结
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- 近期热门微信小程序demo源码下载汇总
近期微信小程序demo源码下载汇总,乃小程序学习分析必备素材!点击标题即可下载: 即速应用首发!原创!电商商场Demo 优质微信小程序推荐 -秀人美女图 图片下载.滑动翻页 微信小程序 - 新词 GE ...
- Redis进阶实践之三如何在Windows系统上安装安装Redis
一.Redis的简介 Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合 ...
- Android刮刮卡自定义控件
网上的都是自己绘制的或者图片,我的需求是可以随意的自定义底部和顶部的布局.所以自己重写一个,原理就是直接继承 View 来实现一个刮层,让这个刮层和图片以及文字不产生任何依赖,再结合 FrameLay ...
- 【Java学习笔记之三】java中的变量和常量
变量和常量 在程序中存在大量的数据来代表程序的状态,其中有些数据在程序的运行过程中值会发生改变,有些数据在程序运行过程中值不能发生改变,这些数据在程序中分别被叫做变量和常量. 在实际的程序中,可以根据 ...
- HDU 1541 树状数组
树状数组入门博客推荐 http://blog.csdn.net/qq_34374664/article/details/52787481 Stars Time Limit: 2000/1000 MS ...
- Victor and World(spfa+状态压缩dp)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5418 Victor and World Time Limit: 4000/2000 MS (Java/ ...
- c#中winform窗口的隐藏与显示
最近在做一个C# 的winform客户端程序,要实现在打开新的窗口时将原来打开的窗口关闭,但是想在关闭新打开的窗口是将原来的那个窗口再次打开,在网上查找各种资料,找了很多代码,都是通过窗口.Hide( ...