写了这么久代码了,自己从来没有好好的玩过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. 【可持久化线段树】POJ2104 查询区间第k小值

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 61284   Accepted: 21504 Ca ...

  2. Windows内核中的内存管理

    内存管理的要点 内核内存是在虚拟地址空间的高2GB位置,且由所有进程所共享,进程进行切换时改变的只是进程的用户分区的内存 驱动程序就像一个特殊的DLL,这个DLL被加载到内核的地址空间中,Driver ...

  3. Updates were rejected because the remote contains work that you do(git报错解决方案)

    Updates were rejected because the remote contains work that you do(git报错解决方案) 今天向GitHub远程仓库提交本地项目文件时 ...

  4. 【转载】mysql主键的缺少导致备库hang

    最近线上频繁的出现slave延时的情况,经排查发现为用户在删除数据的时候,由于表主键的主键的缺少,同时删除条件没有索引,或或者删除的条件过滤性极差,导致slave出现hang住,严重的影响了生产环境的 ...

  5. (GO_GTD_2)基于OpenCV和QT,建立Android图像处理程序

    一.综述     如何采集图片?在windows环境下,我们可以使用dshow,在linux下,也有ffmpeg等基础类库,再不济,opencv自带的videocapture也是提供了基础的支撑.那么 ...

  6. echarts图表属性设置

    原地址:http://blog.csdn.net/she_lover/article/details/51448967theme = { // 全图默认背景 // backgroundColor: ‘ ...

  7. Java入门篇(一)——如何编写一个简单的Java程序

    最近准备花费很长一段时间写一些关于Java的从入门到进阶再到项目开发的教程,希望对初学Java的朋友们有所帮助,更快的融入Java的学习之中. 主要内容包括JavaSE.JavaEE的基础知识以及如何 ...

  8. 城乡联谊胡策会糊厕R3

    因为时间关系这把没设计题面,而且居然还出了锅……T_T 信 原题是leetcode WeeklyContest52 的T1(懒得去找url了 随便搞,但是无解输-1 数字统计 原题PE603 记前n个 ...

  9. Java面向对象抽象类案例分析

    /** 雇员示例: 需求:公司中程序员有姓名,工号,薪水,工作内容 项目经理除了有姓名,工号,薪水还有奖金,工作内容 对给出需求进行数据建模 分析: 在这个问题领域中,先找出涉及的对象 通过名词提炼法 ...

  10. bzoj:1673 [Usaco2005 Dec]Scales 天平

    Description Farmer John has a balance for weighing the cows. He also has a set of N (1 <= N <= ...