动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.JBoss的安装.
.截取指定长度的字符串.
.Java语言基础二.
.用句柄操纵对象.
.Java的网络功能与编程 一(转)-.
.qmail的配置.
.使用struts,ibaits和JSTL开发简便.
.Hibernate 入门.
.Enterprise JavaBeans导论4.
.为apache加速.
.配置shark与mysql的连接.
.关于2006的技术预言.
.Java 按值传递参数.
.应用RMS实现用户自动登陆功能解析.
.小TIP:Java里的时间比较.
.我来说说Bean的使用方法.
.J2ME编程实例---之数字键的测试.
.使用StopWatch类来计时.
.Java 2中的MVC设计模式.
.使用多线程技术让你的Swing及时响.

notyy 的junit教程

发表日期:2008-1-5 |



  Test a little ,code a little ,实战junit
  
  Notyy的junit教程(一)
  
  有了junit,Java程序的单元测试变成非常简单的事。而在写代码前先写测试这个似乎不可思议的规定也变的十分合理而且能有效的帮助程序的设计。
  
  下面是一个accountbean的例子,假设我们要实现一个帐户治理程序,能够向帐户中增加、减少金额,还能在帐户间转帐。很显然需要有一个account类,且慢写代码!在写代码前先写测试,测试如何写?假设你已经有这个account类,你希望如何使用它?显然首先要初始化它,一个帐户应该知道他的拥有者,和他现有的金额,那么他应该有个构建器形如:
  
  account(String Owner,double Balance);那就先写测试这个构建器的代码,如下:
  
  package account;
  
  
  
  import junit.framework.TestCase;
  
  
  
  public class AccountTest extends TestCase {
  
  private Account AccountA;
  
  private Account AccountB;
  
  public AccountTest(String name) {
  
  super(name);
  
  }
  
  public static void main(String args[]) {
  
  junit.textui.TestRunner.run(AccountTest.class);
  
  }
  
  public void testAccount(){
  
  AccountA=new Account("notyy",100);
  
  AccountB=new Account("bricks",200);
  
  assertEquals("notyy",AccountA.Owner);
  
  assertEquals(100,AccountA.Balance,2);
  
  assertEquals("bricks",AccountB.Owner);
  
  assertEquals(200,AccountB.Balance,2);
  
  }
  
  }这段代码无法编译,因为没有account类,我们来为account类写个骨架,使他能够编译。代码如下:
  
  package account;
  
  
  
  public class Account {
  
  private String Owner;
  
  private double Balance;
  
  public Account(String aOwner,double aBalance) {
  
  }
  
  }
  
  编译后,写个批命令来运行测试程序,如下:
  
  test.bat
  
  java -cp %classpath%;d:\javaprj\account\classes account.AccountTest
  
  别忘了把junit.jar包含在你的classpath里,junit的配置这里不再多说。
  
  运行test.bat得到如下结果
  
  FAILURES!!!
  
  Test Results:
  
  Run:1 Failure :1 Errors:0
  
  There was 1 failure
  
  1) testAccount(account.AccountTest) “eXPected . but was ”
  
  感觉如何,测试程序得出了我们预料的结果,因为构建器还没有实现呢!
  
  现在我们来实现构建器
  
  public Account(String aOwner,double aBalance) {
  
  Owner=aOwner;
  
  Balance=aBalance;
  
  }
  
  得到结果:
  
  OK!
  
  测试通过,说明我们的构建器没有问题!
  
  现在我们来refactoring一下,考虑上面的类有什么问题?owner和balance不应该能直接被外界访问的吧。把他们改成两个私有变量,然后用2个get方法来读取他们。尽管xp explore上建议连getxxx和setxxx方法也该测试,我个人是觉得这样过于麻烦的:)所以就省了。假如用get方法的话测试程序需要改变一下
  
  改成形如:assertEquals("notyy",AccountA.getOwner());就行了。
  
  为account类增加2个get方法:
  
  public String getOwner(){
  
  return Owner;
  
  }
  
  public double getBalance(){
  
  return Balance;
  
  }
  
  编译,运行test.bat
  
  OK!一次通过。咱们继续。Account类可以给自己的帐户里加钱(credit),方法形如 Account.credit(double aMoney);
  
  先写testcredit
  
  public void testCredit(){
  
  AccountA=new Account("notyy",100);
  
  AccountB=new Account("bricks",200);
  
  AccountA.credit(100);
  
  //100+100=200
  
  assertEquals(200,AccountA.getBalance(),2);
  
  AccountB.credit(150);
  
  //200+150=350
  
  assertEquals(350,AccountB.getBalance(),2);
  
  }
  
  无法编译,因为account类没有credit方法,咱们给他加个方法骨架:
  
  public void credit(double aMoney){
  
  }
  
  编译通过,运行test.bat,失败:
  
  “expected <200.0> but <100.0>”
  
  现在实现credit方法,如下:
  
  public void credit(double aMoney){
  
  Balance+=aMoney;
  
  }
  
  再次编译运行,OK!(2 tests)
  
  哇,转眼写了这么长的文章了:)
  
  今天累了。明天再写。
  
  继续:)
  
  再来实现扣减方法,和增加几乎一样,原样处理。
  
  先写test
  
  public void testDiscount(){
  
  AccountA=new Account("notyy",100);
  
  AccountB=new Account("bricks",200);
  
  AccountA.discount(50);
  
  //100-50=50
  
  assertEquals(50.00,AccountA.getBalance(),2);
  
  AccountB.discount(120);
  
  //200-120=80
  
  assertEquals(80,AccountB.getBalance(),2);
  
  }
  
  然后实现
  
  public void discount(double aMoney){
  
  Balance-=aMoney;
  
  }
  
  最后是转帐功能,转帐是从一个帐户转到另一个帐户。其实是调用一个帐户的增加功能和另一个帐户的减少功能。
  
  每个测试里都要建立accountA和accountB是不是很烦,junit考虑到了这一点,所以可以覆盖testcase的setUp方法,在该方法内建立一些所有test都要用到的变量等。
  
  public void setUp(){
  
  AccountA=new Account("notyy",100);
  
  AccountB=new Account("bricks",200);
  
  }
  
  这样,所有的测试方法中都不用再建立这两个实例了。:)
  
  好,写转帐方法的测试
  
  public void testTransfer(){
  
  AccountA.transfer(AccountB,80.00);
  
  //100-80=20
  
  //200+80=280
  
  assertEquals(20.00,AccountA.getBalance(),2);
  
  assertEquals(280.00,AccountB.getBalance(),2);
  
  }
  
  然后建立transfer方法的框架,使它能编译:
  
  public void transfer(Account aAccount,double aBalance){}
  
  测试时报失败,expected “20” but was “100”
  
  然后填入实现 :
  
  public void transfer(Account aAccount,double aBalance){
  
  this.discount(aBalance);
  
  aAccount.credit(aBalance);
  
  }
  
  test OK!
  
  简单的步骤,却可使你对你实现的方法的正确性确信无疑,而且写测试的过程也是设计的过程,假如在写一个方法前,你连应该得到的输出都想不明白,又怎么能动手去写呢?
  
  谁说XP只要code,不要设计呢? :)
  
  
  
  好了,junit单元测试的第一个例子就写到这吧。很简单吧?
上一篇:JSTL 入门(2):探讨 core——使用定制标记进行流控制和 URL 管理 人气:447
下一篇:JSTL 入门(1):表达式语言 人气:566
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-7 Web Wiz Forums(论坛系统) v9.53
2008-10-7 Web Wiz Forums(论坛系统) v9.53
2008-10-7 Web Wiz Forums(论坛系统) v9.53
2008-10-7 HDWiki v4.0.1 bulid 081007 UTF
2008-10-7 迅易评选投票管理系统 v10.0
2008-10-7 HDWiki v4.0.1 bulid 081007 GBK
2008-10-7 Bitrac单用户博客 v1.14 bulid 0
2008-10-7 OpenX(广告管理系统) v2.6.2 多国
2008-10-7 乐铺网店系统免费普及版 v3.41
2008-9-29 酷狗音乐(原KuGoo)2008 v5.310 正
2008-9-29 QQTab 1.1
2008-9-29 网络传送带 Net Transport 2.64a
2008-9-29 谷歌金山词霸v1.8
2008-9-29 TweakVI 1.0 Build 1090
2008-9-29 ACDSee Pro 2.5 Build 333 汉化绿
2008-9-29 Winamp v5.541(2189) 周明波简体
2008-9-27 CCleaner 2.12.651
2008-9-27 Mozilla Thunderbird 2.0.0.17 英
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成