写了这么久代码了,自己从来没有好好的玩过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的意义的更多相关文章

  1. 十大Java人物

    James Gosling : Java之父文/陶文 作 为Java之父,James Gosling的名字可谓是耳熟能详.当人们评论一种编程语言时,总喜欢捎带着把下蛋的母鸡一起带上.Java做为中国的 ...

  2. 敏捷史话(十三):我被 Facebook 解雇了——Kent Beck

    2011年,Kent Beck 加入了 Facebook .那时候的他已年过半百,几十年的经验让他自认为非常了解软件行业.在 Facebook 的新手训练营期间,Kent 开始意识到,Facebook ...

  3. OO_Unit 3 JML规格化设计总结

    OO_Unit 3 JML规格化设计总结 JML语言概述(Level 0) 概念定义   JML(Java Modeling Language)是用于对Java程序进行规格化设计的一种表示语言.JML ...

  4. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  5. [Android]使用自定义JUnit Rules、annotations和Resources进行单元测试(翻译)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5795091.html 使用自定义JUnit Rules.ann ...

  6. 关于intellij IDEA 上junit的用法

    话说,最近正在看视频学java.里面有个叫做junit的东西很有用.但是实话说我摆弄了半天都没弄明白. 今天呢通过一些资料,终于弄清楚了junit的大致用法,这里写出来,用以分享和备忘. 首先,环境和 ...

  7. JsUnit && JUnit之讲解

    首先我们定义我们的函数 这里以最简单的加减乘除四个方法来进行测试 建立我们的js文件myjs.js function add(num1,num2){ return num1 + num2; } fun ...

  8. JUnit学习总结

    Junit简介: Junit最初是由Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework),为单元测试(Unit Test) ...

  9. [深入JUnit] 为什么别测试private函数

    [深入JUnit] 为什么别测试private函数 摘自http://www.tuicool.com/articles/iumaayJ 时间 2016-03-28 10:58:03 SegmentFa ...

随机推荐

  1. VirtualBoX虚拟机里安装linux系统,在虚拟系统里安装增强功能报错解决方法

    http://www.cnblogs.com/MoShin/archive/2012/04/25/2469156.html 当我们在虚拟机里安装lixunx系统,避免不了的要安装增强功能,无论是视觉效 ...

  2. Oracle01——基本查询、过滤和排序、单行函数、多行函数和多表查询

    作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7272236.html Oracle的集群 Oracle的体系结构 SQL> --当 ...

  3. git删除本地分支

    远端master分支有更新需要拉取至本地,但是代码有些地方做了修改导致了小冲突,但是这些修改又是无关紧要的,于是就打算直接删除掉本地分支再重新拉取master分支,过程如下: //查看本地分支 git ...

  4. PE 001~010

    题意: 001(Multiples of 3 and 5):对小于1000的被3或5整除的数字求和. 002(Even Fibonacci numbers):斐波那契数列中小于等于4 000 000的 ...

  5. 51Nod 1016 水仙花数 V2(组合数学,枚举打表法)

    1016 水仙花数 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 160         难度:6级算法题                水仙花数是指一个 n 位数 ( n≥3 ) ...

  6. bzoj:1654 [Usaco2006 Jan]The Cow Prom 奶牛舞会

    Description The N (2 <= N <= 10,000) cows are so excited: it's prom night! They are dressed in ...

  7. RMQ算法

    1. 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A ...

  8. codeforce 367dev2_c dp

    codeforce 367dev2_c dp 标签: dp 题意: 你可以通过反转任意字符串,使得所给的所有字符串排列顺序为字典序,每次反转都有一定的代价,问你最小的代价 题解:水水的dp...仔细想 ...

  9. Spring框架学习笔记(7)——代理对象实现AOP

    AOP(面向切面编程) AOP(Aspect-Oriented Programming, 面向切面编程): 是一种新的方法论, 是对传统 OOP(Object-Oriented Programming ...

  10. 了解 Python 语言中的时间处理

    python 语言对于时间的处理继承了 C语言的传统,时间值是以秒为单位的浮点数,记录的是从1970年1月1日零点到现在的秒数,这个秒数可以转换成我们日常可阅读形式的日期和时间:我们下面首先来看一下p ...