邋遢居

我的Java天堂

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  61 Posts :: 2 Stories :: 90 Comments :: 0 Trackbacks

#

宝贝,你离开我快一个多月了。回来吧。我想你了!
posted @ 2006-08-03 15:47 Jet Geng 阅读(554) | 评论 (0)编辑 收藏

   

Bugzilla是一款很专业的Bugzilla跟踪工具。他有具有一般Bug Trace软件所必须的功能。

1.    提供一个开发和测试交互的平台,将测试和改错程序化。不需要测试人员就每一个问题和开发人员直接交流,也避免了发生错误被遗忘的问题。

2.    提供错误检索功能,供PM和测试经理掌握测试和改错情况

除了基本功能外,Bugzilla还有如下强大功能:

1.    基于Web的访问方式,不需要安装客户端

2.  Email自动通知错误相关人员

3.  任意数量,类型的附件。如屏幕截图,日志文件

4.  丰富的字段,如产品名,组件名,版本号,错误发生的平台等等,可以精确的描述错误。

5.   强大的检索功能,可以根据错误的所有特性进行检索。如日期,责任人,提交人,所属版本,所属组件,状态,等等。

6.    强大的即时报表和历史报表

7.    可以定制的权限管理机制,实现对权限的精确控制。如只有Test Manager才能关闭错误。

8.    使用MySql作为后台数据库,稳定,数据迁移也很方便。

9.    完全开放的Perl代码,如果需要,可以自己实现特定功能

(以上文字摘自http://jason.rocklv.net/freesoftware/ar01s06.html

上面内容听起来很空洞,下面就结合实际的工作环境来简单描述一下这些强大的功能给我们工作带来的方便。在开始之前我们来看一幅图:
image002.gif

这个图中描述了一个bug的生命周期(Life Cycle of a Bug)。从图中我们可以了解到一个Bug从生到死一般会经过NewàEvaluationàResolvedàVerificationàClose。在这个过程中参与的角色有两个:测试人员和开发人员。

我们先从测试人员的角度这个系统。

测试人员看除了新建Bug以外其实一个很重任务就是回测。也就是上图Resolved一下的工作。如何安排回测的工作,Bugzilla可以为你提供一个很人性的方式。这种人性的方式得益于Bugzilla强大的搜索能力。
search.JPG
这个就是他的搜索界面。这么多搜索条件可以让你精确的搜索到你所需要的集合。搜索到的集合如下:
searchresult.jpg
你可以使用标题中的任何一栏作为排序条件。可不要小看这个排序的顺序哦,他可是可以直接作为你工作的顺序的。不相信?那好吧来看看下面这个图
navgaite.jpg

直接点击First,Last,Prev,Next就可以达到在你选择的Bug中来回游走(其实这个就是你工作的过程)。

如果你说今天下班前这部分工作可能做不完,明天我又不想在输入那么多的查询条件,好办保存他啊。直接看右下角:
savesearch.jpg

如果有一批
bug我已经回测完了。且他们所作的动作也差不多。直接批量进行,不要犹豫。
batch.jpg

看“Change Several Bugs at Once”就是为这个时候的你量身订做的。Bugzilla还有很多不错的功能我这里就不多说了。

<!--[if !supportEmptyParas]--> <!--[endif]-->

下面来看看Bugzilla能给开发者带来什么样的好处。开发者在整个的bug生命周期中主要处理ResolvedASSIGNED(这个功能项目经理或项目负责人用的比较多)这两块功能。但是这两块功能是应该算是bug在其生命周期中最辉煌的一段时间。他们就是为这个时候而生。

好了废话不多说了。我们来看看一般开发人员如何利用Bug Trace系统。首先登陆到系统à搜索自己的Bug(有的Bug Trace提供了让用户一登陆就可以看到自己的Bugà打开开发环境à修改代码à自测à提交修复。需要不停的在Bug Trace系统和开发环境间不停的切换。

BugzillaEclipse 给我们提供了一个更人性的解决方案。假设开发人员小J来到了办公室在开机和倒茶的时候他心里就在盘算着今天可能有些bug需要修复。Ok,可爱的Eclipse起来了。那就先看看今天有没有自己的bug吧。
eclipsebugsearch.jpg
这个就是集成在EclipseMylar)中的Bug搜索页面。搜索回来的结果你可以用来创建一个Task。有了这个Task那你就会省力多了。可以减少你在大项目中找找文件的痛苦。
workbench.jpg
看,现在我的workbench是不是很整洁啊。
说老实话Bugzilla的界面真的不咋样。如果评论多了会很长,而且还没有分页。不过在Eclipse中这个问题就好多了,因为我们有outline啊。outline.jpg

看起来很不错吧。

除了这个这个Task还有除了能让你看到整洁的workbench外还可以给你一个整洁的思路。
shedual.jpg

通过设定时间让你有效的管理你的时间。这样就让在开发过程中最难掌控的部分管理起来了。

BugzillaEclipseMylar)的好处我就不一一多说了。如果你不相信我的话可以先去体验一下。

其实这个时候Bugzilla可以当成一个项目管理软件来用了,不光光是Bug了。如果我们能加上报表,这样就可以为项目管理者提供最准确的项目进度数据。

<!--[if !supportEmptyParas]--> <!--[endif]-->

说道报表Bugzilla为项目管理者们提供了很强大的报表功能。为项目总结等场合提供最有价值的原始资料。

<!--[if !supportEmptyParas]--> <!--[endif]-->

由于Bugzilla采用Mysql做为数据源,所以备份还原数据很方便。这个为系统管理带来了不少方便。

参考文献:

http://jason.rocklv.net/freesoftware/ar01s06.html

http://www.bugzilla.org/docs/2.18/html/using.html

posted @ 2006-07-25 21:42 Jet Geng 阅读(4785) | 评论 (1)编辑 收藏

   

读《代码大全》笔记 -- 保持松散耦合

在上学的时候就听老师说,写程序要做到低耦合。这话是牢牢的记在心里了(我还算是个乖学生)。可是在具体的编程过程中有犯糗了。犯糗原因就是对于常见耦合分辨不清、不知道在我的应用中那些耦合可以接受、那些耦合在特定场合可以接受、那些耦合要尽量避免、最重要的就是不同的耦合在代码中如何表现会有如何的影响。

还好这些问题近期在一本叫《代码大全》的书里面找到了(插一句,如果你还没有听说过这本书,赶紧,一定要赶紧打开Google,去Google一下)。

书中提到(中文版 p101)了常见的耦合的种类有如下几种:

l      简单数据参数耦合

l      简单对象耦合

l      对象参数耦合

l      语义上的耦合

对于简单数据参数耦合比对象参数耦合更有灵活性书中在耦合标准-灵活性(p100)中进行了描述。并得出对象参数耦合要比简单数据参数耦合的耦合程度要高。

但是在使用的过程中发现很多场合如果使用“简单数据参数”的话,函数的参赛数列表会很长。这个声明的时候倒是没什么,但是在调用的时候就有可能写错参数的个数(这个还好 ide会告诉我们),参数写的顺序不正确(这个就比较郁闷了,容易出bug而且还不容易找)。

我想如果能用“简单数据参数”就尽量使用,在不同的场合考虑使用“对象参数”。为了这个问题我曾经和我的同事狂吵过。所以印象很深。

 

其实最要命的最难处理的是那些“语义上的耦合”。别人我不知道。看完了书中的定义,在回想自己以前写过的代码。很多都犯了“语义上的耦合”,并且给项目带来了很多不便。丢人啊。
posted @ 2006-07-15 15:59 Jet Geng 阅读(669) | 评论 (0)编辑 收藏

今天用了一下spring-mock来测试系统中的dao.感觉真的不错。这个很简单,记下来得原因是怕自己会忘。
你的测试用例必须从AbstractDependencyInjectionSpringContextTests继承。他会帮你创建beanfactory以及beans.但是你必须告诉他到那去找配置文件。这个工作就是通过getConfigLocations方法来完成。一般情况下,这个方法都很简单。
看看我的就知道他要干些什么了。
@Override
    
protected String[] getConfigLocations() {
        
// TODO Auto-generated method stub
        return new String[]{ "/springContext-hibernate.xml" };
    }
好了,这样就配置完成了。下面的工作就是获取你要测试的对象,并对他测试了。

public ShipMasterDao getShipMasterDao() {
        
if(shipMasterDao == null ){
            shipMasterDao 
= (ShipMasterDao)this.applicationContext.getBean("shipMasterDao");
        }
        
return shipMasterDao;
    }
    
    
public void testGetUser(){
        ShipMaster shipMaster 
= this.getShipMasterDao().getShipMaster(1);
        
this.assertEquals(shipMaster.getImono(), "imo01");
    }
嗯,很简单吧。但是很有用。
记下,怕自己忘掉。
posted @ 2006-07-14 18:02 Jet Geng 阅读(4661) | 评论 (3)编辑 收藏

Mylar 简介--开源工作平台续

1.     引子

   很久很久以前有一个木匠,不但粗心而且还健忘。虽然在每天工作开始前,会考虑以下大概需要做的工作。但是在实施的过程中经常会出现这样的状况。看有一天他需要下一块1.2m 的料。这个木匠就甩着膀子过来了。在动手前肯定是要量一下得,把手往口袋里一摸。卷尺是摸到,摸到了昨天晚上吃花生时留下得壳(还挺讲究公德,没有到处乱 扔。)。放哪儿呢,放哪儿呢……。经过了半个小时,终于在一个角落找到了卷尺。那个兴奋啊。兴冲冲的跑到木料前,愣了一下骂了一句“tmd锯子又不知道跑 那去了!”。继续去找锯子去了……。

       其实在我们的软件开发中也会类似的情景。我就不再啰嗦了。

1.      解决方案

我要说的这个解决方案就是Eclipse + Mylar。Eclipse就不用多说了。但是Mylar却是不得不说。

Mylar 最大的亮点就是让你只关注于你当前的工作(Active Task)。在整个工作区中只是显示和你工作相关的内容。这样在Mylar中就有了一个核心的概念任务(Task)。这个任务我们完全可以对应到工作中的 一个任务,如你的头给你分配得一个任务、测试组的同仁提交的一个需要你修改得bug等等。

我们每天的工作应该由这些任务组成。

Mylar 中首先提供了一个对于任务管理的功能。图 – 1 显示了一个 Mylar 的任务管理页面。关于如何创建使用 Mylar 中的任务可以参考官方提供的一个 flash demo 我就不啰嗦了 http://www.eclipse.org/mylar/doc/demo/mylar-demo-04.html
Snap1.jpg
有了任务后,就可以把你的工作关注到特定的任务上了。这个部分在上面的提到的那个官方的 Flash 中也有描述。另外还有一个老外的 blog 也作了点说明。
http://weblogs.java.net/blog/kirillcool/archive/2005/11/mylar_a_very_us.html
说到任务, Mylar 提供了两种任务。一个是本地任务还有一个就是知识库任务(这个我翻译的不好原文是 repository task )。本地任务很好理解就是任务的数据是以文件的形式保存在本地的。一般情况下只有本人可以使用。知识库任务是从 BugTrace 系统(目前支持 Bugzilla JIRA )里面获取 Task. 这样就可以在一个团队中使用了。关于这个功能的使用可以参考 http://eclipse.org/mylar/doc/demo/mylar-demo-04-reports.html. 从个人角度来说,我是最喜欢这个块的功能。想一想啊, QA 组的人测出 bug 纪录到 bug Trace 系统中。开发人员可以在他自己的开发环境中。继续想,项目管理人员把 Project 管理软件中的 task bug 的形式存放于 bugtrace 系统中(其实这个时候的 BugTrace 系统不光管理的是 Bug 了,可以把它认为识一个简单的项目管理)。
关于这个项目的整体全局的介绍可以参考 http://www.eclipsezone.com/articles/mylar/?source=archives

我想她肯定会有美好的未来的。

posted @ 2006-07-11 10:12 Jet Geng 阅读(2074) | 评论 (0)编辑 收藏

今天把开发环境架好了。我的环境包括以下几个部分。

源码管理:cvs

bug管理:bugzilla

项目管理:open workbench

Cvs没什么好说的。

不过在安装bugzilla的过程中有点小问题。

我是根据http://www.websina.com/cn/bugzilla-install-windows.html一文进行安装的。

我的使用的软件版本如下:

Bugzilla Version 2.20.1

MySql version 4.1

Perl version 5.8.7

为了减少安装 perl 模块的麻烦。我使用了 汉化 Bugzilla 中收集的模块 BugzillaModules-2.20 。这个在 http://sourceforge.net/projects/bugzilla-cn 可以找到。

所有都就绪后,我 再次运行 Bugzilla 的安装检查程序( CheckSetup.pl 。发现给了我下面的错误:

error.jpg

找了半天在 Byron Jones 写的《 Installing Bugzilla on Microsoft Windows http://www.bugzilla.org/docs/win32install.html 终于找到原因了。

产生这个错误是因为 MySQL 4.1 及以后的版本使用了新的密码加密算法,而使用的 Perl DBD::MySql 模块不够新,不支持新的加密算法。你可以采取两种方式来解决这个问题:一是使用 新的 DBD::MySql 模块 ,不过需要自己编译;另一种是在 MySQL 中强制使用兼容老版本的密码加密算法:

bugalizza.jpg

这样就搞定了。

这个 open workbench 。通过看它的简介发现他也是一个类似于很有趣的软件。核心部分是 java 实现。而界面却是 MFC 做的。不可思议吧。

http://www.openworkbench.org/ 可以下载

我下载以后不能跑。给我报错是说“ Here's the fix for the JRE[n] not found. My specs is Windows 2000 w/ JDK1.5.0 and private JRE (in JDK dir). ”

我想啊,想啊。我明明安装了 JDK1.5.0_04 了啊。其他使用 java 的程序( Eclipse )都可以好好的跑啊。

为什么到了这儿就不可以了呢。火大。

后来在论坛中找到一个解决方案:

  1. login as administrator

  2. open regedit

  3. goto HKEY_LOCAL_MACHINE/Software/JavaSoft

  4. create if not exist : subkey "Java Runtime Environment" (the key did not exist before on my computer)

  5. In the new subkey add String value
    CurrentVersion="1.5.0"

  6. In the new subkey, create new subkey "1.5.0"

  7. In the subkey 1.5.0 create the string values JavaHome, MicroVersion, RuntimeLib (read http://java.sun.com/j2se/1.4.2/runtime_win32.html)
    if you installed JDK in c:\program files\java\jdk1.5.0 then set the values to
    JavaHome="c:\program files\java\jdk1.5.0"
    MicroVersion="0"
    RuntimeLib="C:\Program Files\Java\jdk1.5.0\jre\bin\client\jvm.dll"

    根据这个方案我修改了我的注册表。修改结果如下图:

openbench.jpg

    修改了这个以后就能顺利启动。小用了一下,感觉很不错。基本能满足我的需求了。

    这样我的工作台就完全搞定了。全部开源产品。省钱啊。

posted @ 2006-06-04 00:58 Jet Geng 阅读(4163) | 评论 (6)编辑 收藏

今天发现一个比较好用的工具Foxit。一个很小巧的pdf阅读器。很小且启动快。他最大的亮点是有一个Foxit Library的程序。这个是我一直想要的功能。在他这里实现的挺不错的。

foxit pdf.jpg

有了这个功能。我就不用为了找一本书而翻箱倒柜了。呵呵。更好的是老吴(http://www.wuguole.com/)还做了汉化。


foxit about.jpg

在这里谢过了。

只要google一下就可以找到很多下载地址了。

posted @ 2006-06-03 09:40 Jet Geng 阅读(715) | 评论 (0)编辑 收藏

一个不错的代码示例网站
http://www.java2s.com/Code/Java/CatalogJava.htm
我是想找点关于draw2d的例子才发现它的。
posted @ 2006-05-27 09:25 Jet Geng 阅读(608) | 评论 (0)编辑 收藏

今天有幸碰到关于Connection以及Router使用的问题。觉得有点意思就把它记了下来。以背后查。

看到一个例子中看到图 -- 1所示的功能。


图-1.JPG

其中图-1中的连线是自适应的会保持该线段是最短的(其实他是使用的ShortestPathConnectionRouter,这个时候我还不知道,我是一个新手大家见笑了)。经过一番调查以后发现原来是在EditPart中的refreshVisuals方法中有如下代码。

代码--1

if  (spRouter  ==   null ) {
            ConnectionLayer cLayer 
=  (ConnectionLayer) getLayer(LayerConstants.CONNECTION_LAYER);
            FanRouter router 
=   new  FanRouter();
            router.setSeparation(
30 );
            spRouter 
=   new  ShortestPathConnectionRouter(getFigure());
            router.setNextRouter(spRouter);
            cLayer.setConnectionRouter(router);
        }

当时就猜啊,他肯定是在给一个特定的Layer加上一个什么玩意。然后就通过这个玩意来完成对于路径的计算(其实这些东西完全是从代码的字面意思而得到的)。我这些东西加到我的代码中了。但是我运行的效果还是没有起作用。他依旧是以前的那幅得行。我抓,抓也没有用。就是达不到我要的效果。

抱着试一下的想法我打开了我的ConnectionEditPart(就是连线的那个EditPart),发现在createFigure中我是这么写的。

代码 -- 2

PolylineConnection connection  =  (PolylineConnection) super .createFigure();
       
        connection.setConnectionRouter(
new  BendpointConnectionRouter(){
            
public   void  route(Connection conn) {
                GraphAnimation.recordInitialState(conn);
                
if  ( ! GraphAnimation.playbackState(conn))
                    
super .route(conn);
            }
        });

很明显我在这里给connection赋了一个ConnectionRouter。最终其效果的是这一个ConnectionRouter起作用了。

Md刚掉他就万事大吉了。

到这里代码部分其实就完了。但是他背后的还有一点故事。

这里有三个角色:

1Connection

2ConnectionAnchor.

3 ConnectionRouter

这个类是用来显示两点之间的线段 (Line), 他的起点和终点是通过 ConnectionAnchor 来定义的。至于他的其他点是通过 ConnectionRouter 计算设置的。从这个地方来看 ConnectionRouter 是一个负责计算的工具类。这样完全可以让所有的 Connection 使用一个 ConnectionRouter 实例(这就是今天最要记下的部分)。

gef 中他就为我们提供了这样的机制。下面的这段话是 Gef help 中的一句话。他就说明了这个道理。

A convenient way to share the router with all connections and to place connections above the drawing is to use a ConnectionLayer. The layer has a connection router property which it shares with every child that's a connection. You can update this property and easily change every connection's router at once.

这个道理要转换成代码的话就是代码 – 1 了。

这个东西很简单。希望对像我一样的新手有点帮助。

posted @ 2006-05-22 22:21 Jet Geng 阅读(1490) | 评论 (2)编辑 收藏

特别喜欢那个例子的一点一点添加功能的做法。

关于这个例子中使用的原理八进制讲的很清楚了。我就不啰嗦了。我就把自己读这部分代码的笔记记下来。

GEF 练习图.jpeg

posted @ 2006-05-06 10:34 Jet Geng 阅读(779) | 评论 (0)编辑 收藏

仅列出标题
共7页: 上一页 1 2 3 4 5 6 7 下一页