写了这么久代码了,自己从来没有好好的玩过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. Specified key was too long max key length is 1000 bytes

    Mysql建立索引时遇到一个问题就是索引字段长度太长,解决办法: 1.修改字段长度 : 2.修改mysql默认的存储引擎 ,修改为INNODB: https://www.2cto.com/databa ...

  2. sqlite ef6

    参考文章: http://www.cnblogs.com/adswads/p/3808549.html 用NUGET 引用 System.Data.SQLite.EF6  app.config 会有默 ...

  3. Zabbix实战-简易教程(2)--整体架构图

  4. 【jQuery】(7)---jQueryAjax同步异步区别

    jQueryAjax同步异步 今天在项目开发过程中,要实现这么一个功能 <!-- 当我点击就业的时候,触发onclick时间,check()方法里通过ajax请求返回数据, 如果该用户已经毕业可 ...

  5. H5中的web worker示例demo分析

    web worker 是运行在后台的 JavaScript,不会影响页面的性能. 什么是 Web Worker? 当在 HTML 页面中执行脚本时,页面的状态是不可响应的,直到脚本已完成. web w ...

  6. SVM公式推导笔记

    参考资料: 对偶函数-http://blog.pluskid.org/?p=702 KTT和拉格朗日乘子-http://www.cnblogs.com/zhangchaoyang/articles/2 ...

  7. asp.net core 多端口监听&日志服务

    1 配置多个端口监听 HostingAbstractionsWebHostBuilderExtensions. public static IWebHostBuilder UseUrls(this I ...

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

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

  9. bzoj:3085: 反质数加强版SAPGAP

    Description 先解释一下SAPGAP=Super AntiPrime, Greatest AntiPrime(真不是网络流),于是你就应该知道本题是一个关于反质数(Antiprime)的问题 ...

  10. Gym 100952H&&2015 HIAST Collegiate Programming Contest H. Special Palindrome【dp预处理+矩阵快速幂/打表解法】

    H. Special Palindrome time limit per test:1 second memory limit per test:64 megabytes input:standard ...