任艳娜 余 华
[摘 要]本文开发了Bug管理系统,目的就在于提供有效和直观的Bug管理工具,为开发人员提供全面的Bug分析图,从而为软件开发过程改进提供支持。开发BugDirectory时采用了现在比较流行的b/s结构和MVC模式分层结构,使页面表示层、业务逻辑层和数据库支持层能够分离开,更易于软件的开发、后期扩展和维护。而Struts运用就是为了能让web程序更好的使用MVC这一经典模式而推出的,运用这种模式大大增强了BugDirectory的可维护性,而且使开发的难度大大降低。
[关键词]mvc struts Bug管理
[中图分类号]TP311[文献标识码]A[文章编号]1007-9416(2009)12-0047-04
开发一款好质量的软件,除了精益求精的需求分析,高水平的编码技术外,可靠和完善的软件测试也是相当重要的。它直接决定了软件编码完成后是否能够满足客户的需求。同时,软件测试也是软件开发过程中非常重要的一环,但测试文档的填写繁琐,一般都耗时较长,而且质量很难得到保证。如何高质量和高效率的进行软件测试,并进行相应的管理是一个关键的问题。传统的文档管理虽然已经很成熟,但随着系统规模化,软件测试的管理开始变得难于控制,而且很难直观的了解和分析开发过程中Bug的高发区,不利于开发过程的改进。所以开发BugDirectory这样一套工具,就是要提高在测试过程中管理Bug的效率,进而提高软件测试的效率和质量,同时也能为我们分析软件的品质提供依据[1]。
1 MVC和Struts
1.1 MVC简介
MVC模式是“Model-View-Controller”的缩写,中文翻译为“模式-视图-控制器”。视图(View)代表用户交互界面,对于Web应用来说,可以概括为HTML界面,但有可能为XHTML、XML和Applet。随着应用的复杂性和规模性,界面的处理也变得具有挑战性。一个应用可能有很多不同的视图,MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的请求。业务流程的处理交予模型(Model)处理。比如一个订单的视图只接受来自模型的数据并显示给用户,以及将用户界面的输入数据和请求传递给控制和模型。模型(Model):就是业务流程/状态的处理以及业务规则的制定。业务流程的处理过程对其它层来说是黑箱操作,模型接受视图请求的数据,并返回最终的处理结果。业务模型的设计可以说是MVC最主要的核心[2~3]。控制(Controller)可以理解为从用户接收请求, 将模型与视图匹配在一起,共同完成用户的请求。划分控制层的作用也很明显,它清楚地告诉你,它就是一个分发器,选择什么样的模型,选择什么样的视图,可以完成什么样的用户请求。控制层不做任何的数据处理。例如,用户点击一个连接,控制层接受请求后, 并不处理业务信息,它只把用户的信息传递给模型,告诉模型做什么,选择符合要求的视图返回给用户。因此,一个模型可能对应多个视图,一个视图可能对应多个模型。
1.2 Struts简介
Struts的推出正是为了将MVC模式的经典框架更好的应用的Web的开发中。Struts是基于Model 2之上的,而Model 2是经典的MVC(模型-视图-控制器)模型的Web应用变体。Struts框架中视图组件对应于一个简单的JSP文件,这个JSP文件包含了Struts定义的标签,控制器是Struts框架中的中枢,它由org.apache.struts.Action.ActionServlet这个Servlet来贯彻和执行的。这个Servlet接收所有客户端的请求,并把请求委派到指定的Action类,ActionServlet委派请求是基于客户端传入的URI。一旦Action类完成处理,ActionServlet根据Action返回的键值来决定在什么视图中显示Action的类处理结果。ActionServlet类似于一个创建Action对象的工厂,由Action对象去执行应用中实际的业务逻辑。控制器是Struts框架中最重要的部分[4]。
2 BugDirectory系统简要分析
软件测试是每软件开发过程中必不可少且很重要的过程,特别是在软件开发流程不太严格的情况下,测试过程中会出现很多的Bug,一般在传统上都是采用普通文档的Bug管理方式,但给测试人员带来了很大的工作量。而且也不利于Bug的分析统计以从中发现问题,及时的在以后的过程中进行改进。BugDirectory就是问了弥补传统文档管理模式的缺陷而产生的。首先,BugDirectory可以提供记录Bug信息的功能,并将所有的Bug记录到指定的数据库中,便于Bug信息的管理和维护,也减少了测试人员的工作量,从而提高了软件开发的质量和效率。其次,BugDirectory提供了软件开发人员的管理,可以帮助项目经理有效的管理项目实施人员,提高团队开的效率。为了开发人员能够更加直观的发现开发过程中Bug出现的规律,BugDirectory还提供了图示,其中Bug新增曲线图可以方便工作人员发现每天Bug产生的数量。Bug状态柱状图可以直观的分析出目前所有Bug的解决状态,更清晰的了解问题解决的进度。Bug产生时期饼图可以帮助开发人员清楚的了解在软件开发过程中那些地方出现Bug频率较高,为以后的软件开发提供参考。Bug人员对应图是对所有Bug发现、修改和确认者工作状态的反应,可以直观的了解项目组成员的工作状态,给项目经理一些帮助。BugDirectory以上功能都是现在文档Bug管理模式所不具备的,无论对于开发人员、项目经理还是软件开发的本身都是一件利器[5~6]。
3 BugDirectory系统实现
3.1 数据库表结构
BugDirectory的数据库采用了SQLServer2000,主要由四部分表组成:
用户表(tr_userinfo),Bug信息表(tr_BugInfo),工程信息表(tr_projectinfo)。在数据库设计的过程中为每一个项目都建立了一个单独的数据表,避免了把所有的项目都存储在一个表里面,如果项目很多的话,不利于数据的维护性。同时在设计Bug信息表时,添加了一个Bug是否删除的标志位,该标志用来标示一条Bug信息是否已经被删除,在具体实现的时候我们不是直接的从数据库中删除要放弃的记录,而是把它相应的标示为设置为删除状态,更有利于数据的安全性。但是这样做会给以后的开发过程中留下一个问题,当需要往数据库中插入一条记录时,BugID号必须是自动生成的,因为用户从数据库中查询出来的记录都是标示为没有被删除状态的记录,如果用户自己添加BugID时可能会造成id重复而无法正常插入记录[7]。
3.2 前台jsp代码实现,相当于MVC模式中的View
<%@ page language="java" pageEncoding="GB18030"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
这是页面需要的一些头文件,首先需要指定页面文件的编码格式。通过page设置。taglib是引入的struts的标签库,基于Struts标记库主要有4种标记组成。它们分别是 Bean,HTML,Logic和Nested。其中,HTML标记用来创建表单中的各种供用户输入的控件以及生成各种基于HTML的用户界面的元素。Bean标记库中包含用于定义新Bean,访问Bean及其属性的标记。Logic标记库中的标记能够用来处理外观逻辑而不需要使用Scriptlet脚本。
前台不仅要能向后台传送数据,同时我们还要能把后台数据处理的反馈信息显示到页面。在Struts中为我们提供了bean标签,可以方便的把后台的数据显示到前台页面。错误信息的标签—html:errors,后台只要把相应的错误信息返回到页面就可以。如下所示。
String str_Errors;//声明一个错误变量
str_Errors=(String) request.getAttribute("error");
if (str_Errors!=null){out.println(str_Errors)}
3.3 Struts中的配置文件
在Struts中有两个很重要的配置文件,Struts-config.xml和web.xml,其中Struts-config.xml是最关键的配置文件,我们所用到的bean的定义以及页面、bean和后台Action之间的联系都是定义在Struts-config.xml中的。下面是bean在它中的定义。
在Struts-config.xml文件中form-bean name 指明了项目中现有的form Bean的名称,type指定了其相关的属性,项目开发中所有用到的bean都需要在这里定义。
input="/login.jsp" name="loginForm" path="/login" type="org.topcomm.struts.Action.LoginAction">
Action中的input则将页面和其对应的FormBean对应起来,当页面提交的时候,会自动的把页面属性的值填充到FormBean中相同的属性中。前台页面和后台的Action是通过Action中path关联起来的,页面的表单中的Action指定表单提交后访问资源的路径,页面提交后系统会根据Struts-config.xml配置文件找到对应路径的Action,可见,Struts-config.xml在Struts中起到了中枢的作用。
从Stunts的配置管理中我们就可以看出,做这样的配置就是起了一个桥梁的作用,在不同业务层分开的同时还要能让它们相互配合起来。这样就实现了把业务逻辑分离出来,当模型发生变化的时候,只需要该动业务逻辑层,也就是Action中的操作,而无须修改页面,使软件提高了灵活性和可维护性。
3.4 后台Action的实现:相当于MVC中的model
和bean的实现一样,在Action中用到的类我们也可以把它所在的包导入到其中,更有利于代码的维护。在Action中只有一个默认的execute方法,页面提交后,系统找到对应的Action后就执行其中默认的execute()方法。
public class LoginAction extends Action {public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {LoginForm loginForm = (LoginForm) form;}
由于Action中只有一个默认的execute方法,如果要在一个Action中处理页面的不同请求,单纯的实现Action的execute方法是难以满足的。如在BugDirectory的Bug添加和修改功能,就是一个页面提交访问同一个Action,但是要完成不同的任务,这时就需要去继承LookupDispatchMap这个类,在继承这个类时还要实现getKeyMethodMap()方法。如下。
protected Map getKeyMethodMap(){Map map=new HashMap(); map.put("main.button.return", "back");…..return map;}
这个方法用来指定和后台Action中具体方法的联系。同时要修改Struts-config.xml文件在Action中添加属性parameter的值。这样如果页面提交相同的表单Struts的系统会根据页面传递的parameter的值用getKeyMethodMap()找到对应的方法。在开发系统时,把类似的操作放到一起,提高了代码的清晰度和维护性。
3.5 成Bug状态的图形
绘制图形时主要是运用了一款开源类包JFreeChart。JFreeChart是JAVA平台上的一个开放的图表绘制类库。它完全使用JAVA语言编写,是为applications, applets, servlets 以及JSP等使用所设计。JFreeChart可生成饼图(pie charts)、柱状图(bar charts)、散点图(scatter plots)、时序图(time series)、甘特图(Gantt charts)等等多种图表,并且可以产生PNG和JPEG格式的输出,还可以与PDF和EXCEL关联。在使用需要将JFreeChart的lib包下的文件到如到相应的项目文件的lib中。
BugDirectory共从四个方面对系统中的Bug进行了分析。
Bug产生时期饼状图主要描述了项目中所有Bug在不同产生时期的比例关系图,有了这张图我们可以清晰、直观的了解当前Bug是在软件开发的那个阶段产生的,从而认识到在软件开发过程中哪些是开发的薄弱环节,为以后的过程改进提供充分的数据,如图1。
新增Bug折线图主要描述了在项目开发的时期内,每天出现的Bug数量,给项目管理者一个直观的数据,以及时的了解到当天项目组成员的工作情况,也从侧面反映了项目开发中最容易出现的问题点以及软件开发的质量,如图2。
Bug人员对应图主要描述了项目组各个成员在测试过程中发现、修改、对处和确认的Bug数量图,是各个项目成员工作状态的反映,项目管理人员可以很方便的得到这些信息,从中发现问题,及时地做出相应的调整,提高软件项目开发的效率,如图3。
Bug状态柱状图主要描述了项目中所有不同状态Bug的情况,反应了项目问题解决的进度,从中可以知道当前项目是否已经可以正常的运行。以上图形都是适时地根据数据库中的数据动态生成的,通过以上的图表,可以及时直观的反应项目不同时期的不同状态,不仅利于项目测试期间的管理[8~9],而且在项目开发的整个过程中都能发挥巨大的推动作用。
4 结语
通常而言,实现模式应该有助于除去重复代码、简化逻辑、说明意图和提高灵活性。好的开发模式会产生好的软件,优秀的开发模式还能大大提高软件开发的效率和质量。BugDirectory正是由于运用了Struts这种结构,比较轻松的实现来MVC经典的模式,给开发过程带来了很多的灵活性,不仅降低了开发的难度,还使BugDirectory的质量得到了很好的保证。同时,也使BugDirectory功能的扩展成为了可能。我们都知道,软件开发的一大部分时间是化在了前期设计和后期的维护上,前期的设计做好,采用了正确合理的系统模式,就能使软件后期的维护减少很多阻力。特别是现在,一个成熟的软件往往是经过原始软件的多次扩展而来的,在项目扩展时,优良的结构为系统功能的扩展提供了方便。对采用了规范合理的开发模式的系统进行功能扩展时,我们可能不会再因为系统层次模糊而使我们陷入重新架构结构的恐惧当中,而是在需要扩展功能的时,只是简单的把需要的功能模块添加到系统当中,而这个过程中,我们可能只是很少的改动了前期的代码,甚至不去改动。
[参考文献]
[1] 黄柏素,梅宏.软件工程实践者的研究方法[M].机械工业出版社,1999.
[2] 刘基诚.重构与模式杨光[M].人民邮电处出版社,2006.
[3] 孙卫琴.精通Struts:基于MVC的Java web设计与开发[M].电子工业出版社出版,2006.
[4] (美)Roger S.Pressman,Software Engineering A Practitioners Approach,Fourth Edition[M], 机械工业出版社,1999.
[5] (美)Joshua Kerievsky.Refactoring to Patterns[M].人民邮电处出版社.2006.
[6] (美) Dave Thomas,David Heinemeier Hansson.Agile Web Development with Rails[M].电子工业出版社,2001.
[7] 赵杰,李涛,朱慧.SQL Server 数据库管理,设计与实现教程[M].清华大学出版社,2001.
[8] 陆燕玲,梁磊.网络数据库[M].电子工业出版社,2001.
[9] 李昭原.数据库原理与应用[M].科学出版社,1999.
[基金项目]
河南省教育厅基金项目
(200510466005)
[作者简介]
任艳娜(1977-),女,汉族,河南漯河人,河南农业大学信息与管理科学学院,讲师,硕士,主要研究方向:从事计算机应用研究。