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 ...
随机推荐
- 新手OTCBTC注册前一定要看的几个步骤!【安全性相关】
纽波特市一位名叫詹姆斯·豪威尔的32岁男子,筹集740万英镑给政府,希望政府同意他挖掘当地的一座垃圾填埋场,因为他有一块保存有7500枚比特币(价值人民币8.3亿)的钱包文件的硬盘,就被埋在这座垃圾填 ...
- golang 类型断言的学习
在php中有一个 serialize() 函数 可以把数组序列化成字符串进行存储和传输 如果想反序列化这种字符串,在php中只需要一个简单的unserialize() 函数就可以完成了.但是在gola ...
- DataGridView显示数据库内容及更新内容到数据库
1:类Access,包含读取数据库,更新数据库方法: class Access { private OleDbConnection OleCon = null;//连接数据库 ...
- 微信小程序之实现slideUp和slideDown效果和点击空白隐藏
怎样实现jq中的slideUp或者slideDown这种动画效果呢,我的思路是用css3的transform: translateY()属性,给需要动画的元素添加上一个动画class. 先上效果图: ...
- 高通平台的bootloader过程【转】
====================基本知识=======================LK是(L)ittle (K)ernel的缩写.高通平台android普遍采用LK作为其bootloade ...
- Maven教程(1)--maven的下载、安装与配置
Maven下载 下载地址:http://maven.apache.org/download.cgi 下载后,解压得到 Maven目录分析: bin文件夹:含有mvn运行的脚本 boot文件夹:含有pl ...
- Mybatis之基于XML的增删改查
这里先吐槽下,写的半天的东西,IE浏览器弹出调试窗口导致写的东西全部没保存,搞得我还要重新用谷歌写,思路全没了,fuck. 前面学习了下spring的DAO层,说起DAO层,那ORM肯定是少不了的,O ...
- Java泛型集合
所谓泛型就是允许在定义类.接口时指定类型形参,这个类型形参将在声明变量.创建对象时确定.增加了泛型支持后的集合,完全可以记住集合 中元素的类型,并可以在编译时检查集合中元素的类型.即解决一些安全问题, ...
- 从好用到更好用 —— 2017 年又拍云 CDN 功能更新回顾
又拍云一直致力于为客户带来更好的服务,在 2017 年又拍云 CDN 服务进行了数次重大更新,在功能上更加全面.完善,进一步提升了 CDN 的稳定性与安全性. 在过去一年里又拍云 CDN 服务共进行了 ...
- Video Target Tracking Based on Online Learning—TLD多目标跟踪算法
TLD算法回顾 TLD(Tracking-Learning-Detection)是英国萨里大学的一个捷克籍博士生Zdenek Kalal在其攻读博士学位期间提出的一种新的单目标长时间(long ter ...