漫漫测试人生路,吾将上下而求索

发布新日志

  • BadBoy 简明手册(转)

    2008-10-28 10:20:05

    badboy简介

    Badboy监控internet explorer的活动,提供录制/回放功能.

    录制功能:badboy窗口的顶部显示当前是否处于录制状态,如果点击play按钮,badboy自动关闭录制功能,等到play结束后,可以点击recording按钮,继续录制脚本.

         Remark:必须等到上一步的request处理完毕后,才能点击发送下一个request,否则下一个request会作为第一个request的子frame.

     

    基本操作

    1 创建 suites,tests以及steps

    测试与网站的交互过程,可以在逻辑上划分为几个步骤.例如第一个步骤为登陆雅虎邮箱,第二步为浏览收件箱,第三步为发送邮件.每一个步骤可以包含一到多次的网站交互动作.badBoy中点击new step创建新的步骤. <!--[if !vml]--><!--[endif]-->.同理,可以创建suites 以及tests.

         Badboy回放时,一次执行一个step,每执行完一个step,会显示执行结果,用户必须再次点击play按钮后,执行下一个step.

     

    2 自动化测试脚本

    如果不修改脚本,简单的录制回放并不能满足复杂网站的测试.

    复杂网站往往有下面一些测试场景:

    A 页面参数唯一性要求,例如:注册页面,需要对用户的注册名进行唯一性校验.

    B 测试的server地址不同.

    Badboy提供了易用的参数修改方法,仅仅需要双击request或者参数,在弹出窗口内修改.同时badboy提供search&replacing功能来修改脚本中的参数值.

     

    Remark:建议选择linking variables,同一个参数,往往脚本会发送多次,选择linking variables,badboy会查找所有的与参数有关的值.并统一替换.

     

    特点与技术

    1 录制模式

       Badboy提供两种录制模式: request 模式(默认模式) navigation 模式.点击下图N,切换模式.

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

    Request模式具有如下优点:如果测试的网页模版修改了,不影响脚本的回放.如果需要badboy导出脚本到jmeter进行性能测试,必须选择request模式.同时request模式的缺点如下:request模式需要添加大量的断言来检查页面上的item.

    Navigation模式将会记录网站交互过程中browser中的元素的点击动作.当回放navigation模式脚本时候,不但回放http request,同时badboy会模拟brower中点击动作.navigation模式的缺点是 :无法使用navigation脚本进行性能测试,因为性能测试引擎运行时候不显示任何用户界面,所以无法执行navigation中模拟点击等动作.

    总结:选择navigation模式还是request模式,取决于测试的目的,如果仅仅要求测试功能而不关心界面,request模式无疑为首选.

     

    2 navigation模式

    Navigation录制browser的三种元素如下:

    1 链接点击

    2 按钮点击

    3 其他点击,例如引发javascrīpt的操作.

    3 表单提交

    表单提交是页面中非常重要的部分,有下面一些案例需要注意:

    1 如果页面表单中某些参数是依赖于某些参数的输入,比如field B javascrīpt根据field A的输入值计算,使用request模式将无法录制正确的参数.

     

    2 request模式下,表单中的所有参数都将发送.包括一些预定义的元素.

     

    自动录制form的方法:点击form中某一field,"Ctrl-Alt-f"录制form,如果每次提交的form名字不同的话,可以使用正则表达式来表示: logonForm[0-9]{4}

     

     

    4 断言

    断言是自动化检测的实现手段,badboy提供了两种断言:

    1 content 检查

    检查页面中是否包含指定的text.断言可以使用正则表达式,比如要检查一个正确登陆的例子,需要检查”welcome [A-z0-9]*\.”

    问题:例子,比如”tree frog”browser中显示,html中显示为"tree&nbsp;frog",因为badboy测试实际的html source,因此将找不到这个断言.避免这个问题的方法是在page中高亮显示text,并使用easy assertion button.如果使用复杂断言,需要精确匹配html source中的text.

    5 截屏

    当测试失败时候,截屏是最有效的方法与开发人员沟通.在断言的属性栏中,选择失败是截屏.badboy会截取失败案例的browser.

     

    6 timeout

    可以为每个request设置timeout时间,右键点击à选择属性à选择play标签,设置timeout时间.

     

    7 弹出框

    使用断言检查弹出框,邮件选择断言,打开"Check against Message Boxes"选项.

     

     

    8 Badboyjmeter使用注意事项:

    1 导出jmeter脚本的时候,jscrīpt不被导出,因为jmeter无内迁browser,jscrīpt元素无法执行.

    2 data sources不被导出.

     

    9 快捷方式

    快捷方式如下:

    F2 Toggles Record Mode On/Off

    F3 Displays the search/replace dialog, or searches if the dialog is already open.

    Ctrl-Alt-Right Starts playing from the current item.

    Ctrl-Alt-Space Stops Playing

    Ctrl+F5 Plays entire hierarchy from the current item. (Note: if focus is inside the browser, IE will intercept as "Refresh").

    F6 Single steps (plays next single item in scrīpt.)

    F8 Shows/Hides scrīpt Tree

    F9 Shows/Hides Summary Tab View

    F12 Shows/Hides both scrīpt and Summary Views together (gives browser full window space)

    Ctrl+Enter Replays the item current item in the scrīpt

    Ctrl+Shift+Enter Replays the current step in the scrīpt

    Ctrl+Shift+Left Rewinds the play marker to the previous step.

    Ctrl+Alt+Up Moves the play marker to the previous item in scrīpt.

    Ctrl+Alt+Down Moves the play marker to the previous item in scrīpt.

    Ctrl+L Displays the lines Server Log File related to the most recent browsing activity.

    Ctrl+K Clears all responses from the scrīpt.

    Ctrl+J Attempts to find and edit the source code file for the current page and/or frame that has focus in the browser.

    Ctrl+Shift+J Attempts to find and edit the source code file for the current page and/or frame that has focus in the browser and also adds the URL for the frame to your scrīpt as a Monitored request.

    Ctrl+Shift+M Adds URLs for all frames in the current browser as Monitored requests.

    Ctrl+D Toggles DOM View On/Off for the active window.

    Ctrl+Page Up While in DOM View changes to previous frame in frame list

    Ctrl+Page Down While in DOM View changes to next frame in frame list

    Ctrl+Alt Changes Record Mode temporarily to Navigation Mode while held down

    Ctrl+Alt+N Toggles record mode between Navigation and Request mode

    Ctrl+Shift+D Opens the documentation editor for the item currently selected in the scrīpt Tree.

     by zhuangxiu
  • JCoverage简明使用手册(转)

    2008-10-10 09:33:24

    使用目的

    JCoverage正如其名,主要用于代码的覆盖测试。通过在被测试类的二进制文件中添加相应的指令,再配合junitjcoverage可以给出被测试类的代码覆盖率,并给出测试过程中哪些语句被执行,哪些没有。通过这些信息,我们可以了解测试代码的测试质量,以及被测试类中哪些语句需要特别的关注(即那些未被覆盖的语句)。

    当前的版本是1.0.5,可以从www.jcoverage.com/downloads.html下载。在实际使用时,需要将jcoverage用到的类放到对应的classpath中。在这个版本中它所依赖的外部类以及版本:

    - bcel    5.1     http://jakarta.apache.org/bcel/

    - log4j   1.2.8    http://jakarta.apache.org/log4j/

    - getopt  1.0.9    http://gnu.org/

    - oro     2.0.7   http://jakarta.apache.org/oro/

     

    用法

    1.       jcoverage可以和ant配合使用,使这一过程自动化。基本用法:

    -          编译被测试类和相应的被测试类的junit代码。

    -          使用<instrument>,将jcoverage的指令加入到被测试类的二进制文件中。为了保证这一过程能够有效,请在编译被测试类时,设置<javac>debug属性设为yes

    -          执行junit代码进行代码覆盖测试。这一步需要注意的是,需要将被注入指令的测试类要早于单元测试所需的测试类装入。为了确保这一点,需要使用<classpath>,使注入指令的测试类位于测试类之前

    -          使用<report>产生覆盖测试的报告。

    2.       使用例子:

    <!-- 采用debug模式编译被测试类 -->

    <javac destdir="${dist.coverage.classes}" deprecation="on" debug="yes">

    <src path="${src.code}"/>

        <classpath refid="classpath"/>

    </javac>

    <!-- 编译被测试类的junit代码 -->

    <javac destdir="${dist.coverage.junit}" deprecation="on">

        <src path="${src.junit}"/>

        <classpath refid="classpath"/>

    </javac>

    <!-- 定义jcoverage任务 -->

    <path id="jcoverage">

            <fileset dir="junit_lib">

                   <include name="jcoverage.jar"/>

            </fileset>

        </path>

    <taskdef classpathref="jcoverage" resource="tasks.properties"/>

    <!-- 给被测试类二进制代码中注入jcoverage的指令 -->

    <instrument todir="${dist.coverage.instrument}">

            <classpath refid="classpath"/>

        <!-- 忽略org.apache.common的应用 -->

        <ignore regex="org.apache.common.*"/>

     

        <fileset dir="${dist.coverage.classes} ">

            <include name="**/*.class"/>

        </fileset>

    </instrument>

    <!-- 启动junit,进行代码覆盖测试 -->

    <junit printsummary="yes" haltonfailure="no" fork="yes">

        <classpath>

            <!-- 注意:被注入指令的类,位置在测试类之前。

    这样确保它们早于测试类备加载,使指令起作用。 -->

            <pathelement location="${dist.coverage.instrument}"/>

            <path refid="classpath"/>

            <pathelement location="${dist. coverage.junit}"/>

        </classpath>

     

        <formatter type="xml"/>

     

            <batchtest todir="${doc.jcoverageReport}">

             <fileset dir="${src.junit}" includes="**/*Test.java" />

         </batchtest>

    </junit>

    <!-- 产生代码覆盖测试报告 -->

    <report srcdir="${src.code}" destdir="${doc.jcoverageReport}">

    3.       jcoverage提供的ant任务标签有:

    -          <instrument>,在类的二进制文件中注入jcoverage指令。注意:一定是debug模式下编译的类。

    -          <report>,产生jcoverage报告,默认格式是HTML。也可以产生XML格式方便应用客户自定义的xslt产生其他格式的报告。产生XML格式的报告:

    <report srcdir="${src.code}" destdir="${doc.jcoverageReport}" format="xml">

    -          <merge>,整合多个由jcoverage产生的输出文件。整个jcoverage实际的运作过程是:首先,jcoverage给测试类注入指令产生新类,被注入指令的类在junit运行过程中产生输出文件(后缀为ser),最后根据输出文件产生报告。如果有多个输出文件,jcoverage提供了<merge>来整合这些文件,最后,从整合文件中产生整体报告。用法:

    <merge>

    <fileset dir="${basedir}">

    <include name="**/jcoverage.ser"/>

    </fileset>

    </merge>

    -          <check>,检查测试是否达到设定的标准,它可以和<report>配合使用。使用例子:

    例1 

    <check branch="95" line="95"/>,意思是分支覆盖率需要达到95%,行覆盖率达到95%

    例2   

    <check branch="95" line="95">

        <regex pattern="xptoolkit.jcoverage.*" branch="85" line="95"/>

    </check>

    包名符合xptoolkit.jcoverage.*模式的分支覆盖率达到85%,行覆盖率达到95%其余的分支覆盖率需要达到95%,行覆盖率达到95%

    检查表

           在使用jcoverage时需要注意的问题:

    -          jcoverage注入指令的类必须是在debug模式下编译的类。建议将那些使用debug模式编译的类的存放与最终的产品的目录分开。

    -          使用了<instrument>的类,与源类的目录也最好分开。

    -          对于那些使用了AOP(如AspectJ)技术的项目,jcoverage不能很好的应用到那些已经添加了Aspect信息的类。

    -          代码覆盖工具只是给出了指导性的意见,不要过分依赖和相信它的结果。

  • JUNIT STUDY

    2008-10-05 11:28:54

    1. JUnit入門
      http://www.dotspace.twmail.org/Test/JUnit_Primer.htm
    2. 怎样使用Junit Framework进行单元测试的编写
      http://www.chinaunix.net/bbsjh/14/546.html
    3. Ant+Junit+Log4J+CVS进行XP模式开发的建立
      http://ejb.cn/modules/tutorials/printpage.php?tid=4
    4. 用HttpUnit测试Web应用程序
      http://www.zdnet.com.cn/developer/code/story/0,2000081534,39033726,00.htm
    5. 有没有用过Cactus的,Web层的测试是Cactus还是JUnit?
      http://www.jdon.com/jive/thread.jsp?forum=16&thread=9156
    6. Ant+junit的测试自动化 biggie(原作)
      http://www.csdn.net/Develop/article/19%5C19748.shtm
    7. JUnit实施
      http://www.neweasier.com/article/2002-08-07/1028723459.html
    8. JUnitTest Infected: Programmers Love Writing Tests
      http://junit.sourceforge.net/doc/testinfected/testing.htm
    9. JUnit Cookbook
      http://junit.sourceforge.net/doc/cookbook/cookbook.htm
    10. JUnit Primer
      http://www.itu.dk/~lthorup/JUnitPrimer.html
    11. IBM DevelopWorks
      http://www-106.ibm.com/search/searchResults.jsp?query=junit&searchScope=dW&searchType=1&searchSite=dWChina&pageLang=zh&langEncoding=gb2312&Search.x=0&Search.y=0&Search=Search
  • JAVA开源项目、工具的应用(转)

    2008-09-11 11:21:48

    由于目前很多企业应用是采用基于J2EE技术的网络应用程序开发,因此,下面主要介绍基于JAVA的开源项目、工具的应用。

    1、开源工具与XP

      XP的12条最佳实践,对于所有的企业应用开发商而言,由于组织和文化的不同,不可能全部应用,但是,下面几个实践是有条件逐步实施的:

    代码规范:CODE STANDARD

    测试驱动开发:TEST-DRIVEN DEVELOPMENT

    日构建:DAILY BUILDING

    持续集成:CONTINUOUS INTEGRATION

    小步发布:SMALL RELEASE

    每日晨会:DAILY MEETING

    每周40小时工作:40-HOURS A WEEK

      其中,CODE STANDARD和TDD是CONTINUOUS INTEGRATION、DAILY BUILDING和SMALL RELEASE的基础;而DAILY MEETING和40-HOURS A WORK是单独的实践过程,可以与其他的实践想结合,增强项目小组的沟通,激发士气。

      需要说明的是以上最佳实践并非XP所独有,而是被最多的软件开发方法所应用,其中"日构建"就在微软的软件开发方法中正式出现过。

    1)代码规范

      虽然大部分的企业在一定程度上推行代码标准与规范,而且对于使用JAVA的应用程序开发,也有SUN的推荐编码规范,但是,实际的情况并不理想。

      主要的原因在于:一方面,开发人员的习惯势力很大;另一方面,代码审查的力度不够。如果能够借助工具,从一定程度上帮助进行代码标准的执行情况检查,那么代码审查就可以着重检查程序的逻辑和性能等方面。

      开源产品CheckStyle (http://sourceforge.net/projects/checkstyle) 可以帮助开发组织解决代码标准审查的问题。

      目前的最新版本为3.0,它提供了两种运行方式:一种是命令行;一种是与Ant结合(Ant自1.5以后提供的OPTIONAL TASKS中有对于CheckStyle的支持)。同时,SourceForge中有对于JBuilder等流行IDE的插件支持,可以定义Global、Project级别上的属性文件, 但是,目前只是支持2.42版本。

      在3.x版本之前,CheckStyle的配置信息写在Property File中;而在3.x之后,配置信息为XML文件,配置更加灵活。3.0的发布版本中提供了针对Sun Code Conventions的特定Check File,可以参考使用。

    建议执行情况:

      手动执行:开发人员在IDE中手动触发CheckStyle检查或者代码审查时由审查者手动执行;

      自动执行:将CheckStyle与源码控制系统(CVS)结合,在源码Checkin的时候进行规则判断,如果不符合,则不允许代码进入系统。

    2)测试驱动开发

      测试先行或者测试驱动是XP的基本实践之一,同时测试在软件开发中的重要作用正越来越得到人们的重视。审查和测试作为系统确认和验证的有效方式,是项目质量保证的重要措施。

      下面按照一般的测试分类,介绍各个领域内的开源测试工具:

      单元测试:JUnit (http://www.junit.org)

      JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework),用于Java开发人员编写单元测试之用。下面介绍的开源测试工具,很多都是对于JUnit的扩展。

      它目前的版本为3.7,为编写单元测试提供了主要的接口。目前主流的IDE都提供了对于JUnit的支持。

      XP强调测试先行,尤其重视单元测试。系统集成商需要通过软件开发过程的执行,来强化JUnit的使用。

      目前很多商业测试软件都提供了与JUnit的联合使用,例如获得1999和2000年Jolt测试类工具亚军和生产率大奖的Jtest (ParaSoft公司产品,内置200余条编码规范,提供Java代码静态和动态检查,同时还可以自动生成简单的测试用例等等)就可以导入和导出JUnit的测试用例。

      集成与功能测试:HttpUnit (http://unit.sourceforge.net) & Cactus(http://jakarta.apache.org/cactus/)

      HttpUnit是一套通过HTTP连接测试Web应用程序的Java类。在结合JUnit的情况下,HttpUnit可以作为一种创建测试程序的强大工具用来保证Web应用程序正常的端对端功能。

      虽然JUnit自身就可以通过编写单一类的测试程序对服务器端Java代码进行测试,不过,有了HttpUnit的帮助,JUnit就可以扩展为模拟Web浏览器-Web服务器的工作方式对整个Web程序结构进行测试。

      Cactus为我们提供了一种测试SERVLET等WEB组件的有效手段。它是JUnit的一个扩展,但是它又和JUnit有一些不同。Cactus的测试分为三种不同的测试类别,JspTestCase, ServletTestCase, FilterTestCase, 而不是像JUnit就一种TestCase。Cactus的测试代码有服务器端和客户端两个部分,他们协同工作。

      一般意义上,可以采用Cactus作集成测试;而使用HttpUnit做功能测试。

      虽然在集成与功能测试方面,有很多优秀的开源工具,但是在实际应用过程中,还是采用商业测试软件的比较多,对于复杂应用更是如此。这是因为集成与功能测试大部分还是由专门的测试人员进行,而他们对于已有的商业软件,例如Rational Robot、E-Test Suite、WinRunner等都比较熟悉,同时商业软件也提供了更为强大的功能。

      压力与性能测试: JMeter (http://jakarta.apache.org/jmeter/)

      由于企业应用越来越复杂,用户数量也是越来越多,系统的性能参数以及众多的非功能性需求在开发中获得了越来越多的重视。因此,很多压力与性能测试工具也开始出现,这其中有一定影响的是Apache Software Foundation的JMeter。

      JMeter是100%的JAVA桌面应用,用来测试系统的负载与性能。它最开始设计是用来测试WEB应用,后来加以扩展,可以测试Http,FTP,支持JDBC的关系型数据库的性能与压力。同时,JMeter提供一定的定制功能,系统集成商可以自行开发针对EJB、CORBA或者SOAP的插件。

      压力与性能测试方面,由于测试比较复杂,实际企业应用测试中,也是采用商业测试软件比较多,例如LoadRunner、JProbe Suite以及与JBuilder8 同步发布的OptimizerIT;

    3)日构建

      在软件开发的领域里有各种各样的"最佳实践",它们经常被人们谈起,但是似乎很少有真正得到实现的。这些实践最基本、最有价值的就是:都有一个完全自动化的创建、测试过程,让开发团队可以每天多次创建他们的软件。

      "日创建"也是人们经常讨论的一个观点,McConnell在他的《快速软件开发》中将日创建作为一个最佳实践来推荐,同时日创建也是微软很出名的一项开发方法。但是,我们更支持XP社群的观点:日创建只是最低要求。一个完全自动化的过程让你可以每天完成多次创建,这是可以做到的,也是完全值得的。

      Ant是Apache Jakarta的一个项目,是"不带 make 缺点的 make"。Ant 正在成为开放源代码世界中实际上的标准。原因很简单:Ant 是使用 Java 语言编写的,这种语言可以让创建过程在多种平台上使用。

      Ant目前的版本为1.5,它的执行是基于一个XML文件,配置文件由目标树构成。每个目标都包含了要执行的任务,其中任务就是可以执行的代码。在下面给出的例子中,mkdir 是目标 compile 的任务。mkdir 是建立在 Ant 中的一个任务,用于创建目录。 Ant 带有一套健全的内置任务,也可以通过扩展 Ant 任务类来添加自己的功能。

      Ant内置了对于JUnit、CVS、ClearCase、Visual SourceSafe以及CheckStyle的支持,通过于系统定时功能,例如Windows的"任务计划"或者Linux/Unix的"cron",可以很方便的利用Ant来自动完成每日构建的工作。

    4)持续集成

      持续集成是XP的重要实践之一,Martin Fowler在参考文献[6]中有详细的介绍,上述实践都是它的基础。

      开源项目中有一个著名的工具是用来帮助实现持续集成的:CruiseControl,其次,目前还有一款商业软件AntHill也为持续集成提供了很好的支持。

    CruiseControl (http://cruisecontrol.sourceforge.net/)

      CruiseControl是著名的ThoughtWorks公司的产品,目前它的源码已经公开,它是一个持续集成的框架。它包含,但是并不局限于Email通知、Ant以及其他源码控制工具。同时,它还提供了WEB界面来查看当前和已往Build的详细信息。

    AntHill (http://www.urbancode.com/projects/anthill/)

      AntHill可以确保Build过程受控,同时,帮助组织内部的知识共享。它在每次Build之前从源码控制系统 (CVS、VisualSourceSafe、ClearCase等) 中获取最新的源码,同时在 Build完成之后为源码分配一个唯一的数字进行标定。同时,它还会在根据Build的情况,更新Intranet的信息。

    5)小步发布

      有了以上实践的支持,小步发布就有了实现的可能。XP强调在非常短的周期内以递增的方式发布新版本,从而可以很容易地估计每个迭代周期的进度,便于控制工作量和风险;同时,也可以及时处理用户的反馈。

      为了成功的进行应用系统的版本发布,需要SCM,尤其是源码控制程序的配合。在开源项目中,CVS (Concurrent Version System) 是最著名的版本控制程序。

      目前CVS的版本为1.5.11,它是一个将一组文件放在层次目录树中以保持同步的系统。人们可以从 CVS 服务器上更新他们的本地层次树副本,并将修改的结果或新文件发回;或者删除旧文件。CVS 基于客户端/服务器的行为使得其可容纳多用户,构成网络也很方便。这一特性使得 CVS 成为位于不同地点的人同时处理数据文件(特别是程序的源代码)时的首选。所有重要的免费软件项目都使用 CVS 作为其程序员之间的中心点,以便能够综合各程序员的改进和更改。

      基于多个操作系统的CVS的客户端软件也很多,其中以WinCVS最为著名。

    2、开源项目与Framework:

      目前,对于基于J2EE的应用程序开发,有很多开源的Framework,例如Struts (http://jakarta.apache.org/struts/)、WebWork等,都提供了利用J2EE技术的优秀解决方案。其中,Struts是目前应用最为广泛和获得关注最多的框架之一。

      Struts目前的版本为1.1,它是基于Model2的MVC实现框架。Struts的核心是基于Servlet、JavaBean、ResourceBundles和XML技术的控制层。

      还有很多开源项目为Struts提供支持,例如:

      配置文件GUI:Struts Console;

    Code Generator:Easy Struts;

    Unit-Test:StrutsTestCase;

      获得2002年JAVA IDE大奖的JBuilder 8更是内置了对于Struts的支持,这也从另外一个侧面体现了Struts的重要意义。

      同时,需要注意的是,Struts本身并没有提供Persistence层的标准实现,但是,目前这个方面的解决方案比较多,系统集成开发商可以根据具体情况加以选择。

      如果可以在Struts等Framework的基础上,结合不同业务系统的专业知识,开发独立的系统平台,系统集成商的项目开发速度和质量都会有很大的提高。


    作者:dxaw 来源:赛迪网技术社区
  • 什么是Ant

    2008-09-11 11:14:18

    Ant是Apache Jakarta的一个项目,是"不带 make 缺点的 make"。Ant 正在成为开放源代码世界中实际上的标准。原因很简单:Ant 是使用 Java 语言编写的,这种语言可以让创建过程在多种平台上使用。

      Ant目前的版本为1.5,它的执行是基于一个XML文件,配置文件由目标树构成。每个目标都包含了要执行的任务,其中任务就是可以执行的代码。在下面给出的例子中,mkdir 是目标 compile 的任务。mkdir 是建立在 Ant 中的一个任务,用于创建目录。 Ant 带有一套健全的内置任务,也可以通过扩展 Ant 任务类来添加自己的功能。

      Ant内置了对于JUnit、CVS、ClearCase、Visual SourceSafe以及CheckStyle的支持,通过于系统定时功能,例如Windows的"任务计划"或者Linux/Unix的"cron",可以很方便的利用Ant来自动完成每日构建的工作。
  • 代码检查工具CheckStyle简介和使用(转)

    2008-09-10 15:02:43


     CheckStyle是什么?

      CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发人员遵守某些编码规范的工具。它能够自动化代码规范检查过程,从而使得开发人员从这项重要,但是枯燥的任务中解脱出来[1]。

      2.2. CheckStyle检验的主要内容

      CheckStyle默认提供一下主要检查内容:

      ·Javadoc注释

      ·命名约定

      ·标题

      ·Import语句

      ·体积大小

      ·空白

      ·修饰符

      ·块

      ·代码问题

      ·类设计

      ·混合检查(包活一些有用的比如非必须的System.out和printstackTrace)

      从上面可以看出,CheckStyle提供了大部分功能都是对于代码规范的检查,而没有提供象PMD和Jalopy那么多的增强代码质量和修改代码的功能。但是,对于团队开发,尤其是强调代码规范的公司来说,它的功能已经足够强大。

      2.3. CheckStyle的主要运行方式

      目前,CheckStyle的版本是3.0,与以前的版本不同,它的配置文件是基于XML而非Properties文件。

      它的3.0版本提供了两种运行的方式:

      ·命令行工具

      ·ANT任务

      同时,CheckStyle目前有很多针对流行IDE的插件,例如Eclipse、IntelliJ IDEA、JBuilder等。但是,大部分都是基于2.4的版本,新版本的特性不支持,同时配置也较为复杂。

      因为一般情况下,如果与开发过程与环境集成起来,编码规范的检查会更加有效,因此,作为ANT任务的运行方式使用的更加普遍。

      在ANT的build.xml文件中添加CheckStyle任务的步骤如下:

      1. 将checkstyle-all-3.1.jar拷贝到项目的LIB目录;

      2. 建立配置文件;

      3. 声明CheckStyle任务:

    <taskdef resource="checkstyletask.properties" classpath="${lib}/checkstyle-all-3.1.jar"/>

      4. 建立CheckStyle任务:

    <target name="checkstyle">
    <checkstyle c>
    <fileset dir="${src}" includes=" **/*.java" />
    </checkstyle>
    </target>

      2.4. 定制CheckStyle

      CheckStyle的执行基于XML配置文件,它的主要组成部分是:

      ·Module:整个配置文件就是一棵Module树。根节点是Checker Module。

      ·Properties:它来决定一个Module如何进行检查。每个Module都有一个默认值,如果不满足开发需求,可以设定其它的值。

      下面是一个示例:

    <module name="MethodLength">
    <property name="max" value="60"/>
    </module>

      它表示,如果方法或者构造函数的长度超过60行,CheckStyle就会报错。而默认值是150行。

      以下是一段CheckStyle对于Maven项目源文件的检查报告:

    Method 'createExpression' is not designed for extension - needs to be abstract, final or empty. 91
    Unable to get class information for JellyException. 91
    Line has trailing spaces. 93
    Line has trailing spaces. 104
    Method 'evaluate' is not designed for extension - needs to be abstract, final or empty. 113
    Parameter context should be final. 113
    Line has trailing spaces. 130
    Method 'getExpressionText' is not designed for extension - needs to be abstract, final or empty. 131
    Line has trailing spaces. 134
    Line has trailing spaces. 135
    Method 'toString' is not designed for extension - needs to be abstract, final or empty. 137
    Method 'isSupportAntVariables' is not designed for extension - needs to be abstract, final or empty. 156
    Method 'setSupportAntVariables' is not designed for extension - needs to be abstract, final or empty. 168
    Parameter supportAntVariables should be final. 168
    'supportAntVariables' hides a field. 168
    Method 'isValidAntVariableName' is not designed for extension - needs to be abstract, final or empty. 183
    Parameter text should be final. 183

      一般情况下,与IDE集成在一起使用的时候,点击出错的条目,可以跳转到相应的代码。
    本贴来自ZDNetChina中文社区 http://bbs.zdnet.com.cn ,本贴地址:http://bbs.zdnet.com.cn/viewthread.php?tid=178617

     


    三、CheckStyle的最佳实践

      3.1. Sun’s Code Conventions的修改

      在CheckStyle的最新发布版本中,有一个对于Sun的Java编码规范的配置文件信息。但是,其中有很多条目并不一定符合项目开发的需要。就算是对于很多优秀的开源项目,按照这个规范来进行检查,也会出现成千上万的错误。

      下面提出的一些修改意见,是从实际项目执行过程中总结出来的,可以作为大家的参考。我们以CheckStyle3.0配置文件的顺序来介绍:

      1. 去除对于每个包都有一个package.html文件的限制;

    <!--<module name="PackageHtml"/>-->
      
      2. 修改对于JavaDoc Comments的限定:对于很多使用Code Generator的项目来说,需要将手写代码与生成代码、单元测试代码的检查分开进行;

      3. 修改对于体积大小的限制:目前,很多显示器都是17寸,而且打印方面的限制也比以前有所改善,同时,由于代码中Factory等模式的运用,以及有意义的方法名称等约定,默认每行代码的长度(80)是远远不能满足要求;对于方法长度等等,也应该根据项目情况自行决定:

    <module name="FileLength"/>
    <module name="LineLength">
    <property name="max" value="120"/>
    </module>
    <module name="MethodLength">
    <property name="max" value="300"/>
    </module>
    <module name="ParameterNumber"/>

      4. 修改对于Throws的的限制:允许Throws Unchecked Exception以及Throws Subclass Of Another Declared Exception。

    <module name="RedundantThrows">
    <property name="allowUnchecked" value="true"/>
    <property name="allowSubclasses" value="true"/>
    </module>

      5. 修改成员变量的可视性:一般情况下,应该允许Protected Members以及Package Visible Members。

    <module name="VisibilityModifier">
    <property name="protectedAllowed" value="true"/>
    <property name="packageAllowed" value="true"/>
    </module>

      3.2. CheckStyle应用的最佳实践

      采用CheckStyle以后,编码规范的检查就变得及其简单,可以作为一项切实可行的实践加以执行。

      一般情况下,在项目小组中引入CheckStyle可以按照下面的步骤进行:

      1. 强调Code Review与Code Conventions的重要作用;

      2. 介绍CheckStyle;

      3. 初步应用CheckStyle:参照CheckStyle附带的配置文件,酌情加以剪裁,在项目的Ant配置文件中,添加CheckStyle任务,可以单独执行;

      4. 修改、定型CheckStyle的配置文件:按照基本配置文件执行一段时间(2~3周),听取开发人员的反馈意见,修改配置信息;

      5. 作为开发过程的日常实践,强制执行CheckStyle:稳定CheckStyle的配置信息,同时将CheckStyle任务作为Build的依赖任务或者配置源码控制系统(目前,CheckStyle可以与CVS有效集成),使得代码在加入系统之前必须通过检查。

      同时需要指出的是,CheckStyle的有效执行需要依赖两个条件:

      ·Ant的广泛应用:CheckStyle基于Ant执行的方式比较容易,而且可以在项目内容形成一致的执行环境。同时,也比较容易与其它任务,例如Build等发生关联。

      ·IDE Format Code的强大功能:由于CheckStyle本身并没有提供很强大的Code Format等功能,因此,需要借助IDE的帮助,从而使得在发生错误的时候,可以很容易的进行修复。目前,主流的Java IDE都提供了这方面的功能,IDEA在这方面尤其突出。它提供的统一、可定义的Code Format Template(项目小组内部可以使用统一模板)以及方便的快捷键功能(Ctrl+Alt+T:Format Code, Ctrl+Alt+O:Optimize Import等)。

      四、结论

      利用CheckStyle可以方便的对于编码的Code Conventions进行检查,同时,也有效地减少了Code Review的工作,使得Reviw人员的精力更多的集中到逻辑和性能检查。

    Checkstyle的结果输出

    序号      输出内容意义

    1 Type is missing a javadoc commentClass  缺少类型说明

    2“{” should be on the previous line “{” 应该位于前一行

    3Methos is missing a javadoc comment方法前面缺少javadoc注释

    4Expected @throws tag for “Exception”在注释中希望有@throws的说明

    5“.” Is preceeded with whitespace “.” 前面不能有空格

    6“.” Is followed by whitespace“.” 后面不能有空格

    7“=” is not preceeded with whitespace“=” 前面缺少空格

    8“=” is not followed with whitespace“=” 后面缺少空格

    9“}” should be on the same line“}” 应该与下条语句位于同一行

    10Unused @param tag for “unused”没有参数“unused”,不需注释

    11Variable “CA” missing javadoc变量“CA”缺少javadoc注释

    12Line longer than 80characters行长度超过80

    13Line contains a tab character行含有”tab” 字符

    14Redundant “Public” modifier冗余的“public” modifier

    15Final modifier out of order with the JSL suggestionFinal modifier的顺序错误

    16Avoid using the “.*” form of importImport格式避免使用“.*”

    17Redundant import from the same package从同一个包中Import内容

    18Unused import-java.util.listImport进来的java.util.list没有被使用

    19Duplicate import to line 13重复Import同一个内容

    20Import from illegal package从非法包中 Import内容

    21“while” construct must use “{}”“while” 语句缺少“{}”

    22Variable “sTest1” must be private and have accessor method变量“sTest1”应该是private的,并且有调用它的方法

    23Variable “ABC” must match pattern “^[a-z][a-zA-Z0-9]*$”变量“ABC”不符合命名规则“^[a-z][a-zA-Z0-9]*$”

    24“(” is followed by whitespace“(” 后面不能有空格 25“)” is proceeded by whitespace“)” 前面不能有空格

     

    不太明白的错误解答

    1.  'X' hides a field.

    public class Foo
    {
        private int bar;

        public Foo(int bar)
        {
            this.bar = bar;
        }

        public final int getBar()
        {
            return bar;
        }
    }

    解释:全局private int bar;和局部public Foo(int bar)的bar变量名字重复。
    此错误,可以忽略不检查。


    2. Parameter X should be final.


    public class Foo
    {
        private int bar;

        public Foo(int bar)
        {
            this.bar = bar;
        }

        public final int getBar()
        {
            return bar;
        }
    }

    解释:public Foo(int bar)的局部变量,被认为是不可改变的,检查需要加上final关键字定义public Foo(final int bar)
    此错误,可以忽略不检查。

    3. Redundant 'X' modifier.

    public interface CacheHRTreeService extends Manager {

     /**
      * Organization Tree
      *
      * @param orgDto
      * @return
      * @throws Exception
      */
     public void setOrganization(OrganizationDTO orgDto) throws Exception;

     /**
      * Organization Tree
      *
      * @return
      * @throws Exception
      */
     public OrganizationDTO getOrganization() throws Exception;
    ......
    }

    解释:多余的字段。public OrganizationDTO getOrganization() throws Exception;此时public为多余的字段,因为interface定义的时候,就是public的。

    需要检查。

    4. - Class X should be declared as final.

    解释:对于单例设计模式,要求返回唯一的类对象。但是HRFactory和ContextFactory为优化的两个类,不需求检查。
    其他的单例类,依然需要进行检查。


    5.  Utility classes should not have a public or default constructor.

    解释:工具类不必提供默认的构造方法。
    需要检查,仅仅为提示。

    6. File does not end with a newline.
    解释:虽然JAVA程序不要求结尾要用新行,但是习惯上应该要空一行。
    需要检查,仅仅为提示。

    7. - Method 'addChildrenId' is not designed for extension - needs to be
      abstract, final or empty.

    解释:通过父类继承的,此类有点特殊
    可以忽略此类。

    8. Variable 'id' must be private and have accessor methods.
    解释:BaseHRDTO类,为父类,属性给子类继承,比较特殊。
    但是其他的类,声名需要加上范围'private'关键字
    需要检查。

    9. -Array brackets at illegal position.
    解释:代码写法,习惯不一样。
    需要检查,仅仅提示。

     

  • 代码分析工具findbug简介和使用

    2008-09-10 10:08:12

    FindBugs(http://findbugs.sourceforge.net/)版本1.1.1

    简介:findbugs 是一个在java程序中查找bug的程序,它查找bug模式的实例,也就是 可能出错的代码实例,注意findbugs是检查java字节码,也就是*.class文件。

    自带检测器的介绍: findbugs 自带60余种Bad practice80余种Correntness1 Internationalization
        12Malicious code vulnerability27Multithreaded correntness23Performance43Dodgy


    Bad practice
    坏的实践

    一些不好的实践,下面列举几个:

    HE 类定义了equals(),却没有hashCode();或类定义了equals(),却使用Object. hashCode();或类定义了hashCode(),却没有equals();或类定义了hashCode(),却使用Object.equals();类继承了equals(),却使用Object.hashCode()

    SQL Statement execute方法调用了非常量的字符串;或Prepared Statement是由一个非常量的字符串产生。

    DE 方法终止或不处理异常,一般情况下,异常应该被处理或报告,或被方法抛出。


    Correctness
    一般的正确性问题

    可能导致错误的代码,下面列举几个:

    NP 空指针被引用;在方法的异常路径里,空指针被引用;方法没有检查参数是否nullnull值产生并被引用;null值产生并在方法的异常路径被引用;传给方法一个声明为@NonNullnull参数;方法的返回值声明为@NonNull实际是null

    Nm 类定义了hashcode()方法,但实际上并未覆盖父类ObjecthashCode();类定义了tostring()方法,但实际上并未覆盖父类ObjecttoString();很明显的方法和构造器混淆;方法名容易混淆。

    SQL 方法尝试访问一个Prepared Statement0索引;方法尝试访问一个ResultSet0索引。

    UwF 所有的write都把属性置成null,这样所有的读取都是null,这样这个属性是否有必要存在;或属性从没有被write


    Internationalization
    国际化

    当对字符串使用upperlowercase方法,如果是国际的字符串,可能会不恰当的转换。

        
       Malicious code vulnerability
    可能受到的恶意攻击

        如果代码公开,可能受到恶意攻击的代码,下面列举几个:

        FI 一个类的finalize()应该是protected,而不是public的。

        MS 属性是可变的数组;属性是可变的Hashtable;属性应该是package protected的。

       
       Multithreaded correctness
    多线程的正确性

        多线程编程时,可能导致错误的代码,下面列举几个:

        ESync 空的同步块,很难被正确使用。

        MWN 错误使用notify(),可能导致IllegalMonitorStateException异常;或错误的

    使用wait()

    No 使用notify()而不是notifyAll(),只是唤醒一个线程而不是所有等待的线程。

    SC 构造器调用了Thread.start(),当该类被继承可能会导致错误。

       
       
    Performance
    性能问题

        可能性能不佳的代码,下面列举几个:

        DM 方法调用了低效的Boolean的构造器,而应该用Boolean.valueOf(…);用类似

    Integer.toString(1) 代替new Integer(1).toString();方法调用了低效的float的构造器,应该用静态的valueOf方法。

    SIC 如果一个内部类想在更广泛的地方被引用,它应该声明为static

    SS 如果一个实例属性不被读取,考虑声明为static

    UrF 如果一个属性从没有被read,考虑从类中去掉。

    UuF 如果一个属性从没有被使用,考虑从类中去掉。

       
        Dodgy
    危险的

        具有潜在危险的代码,可能运行期产生错误,下面列举几个:

        BC 对抽象集合如ListSet的造型;对具体集合如ArrayListHashSet的造型;

    未检查或无法保证的造型;

    CI 类声明为final但声明了protected的属性。

    DLS 对一个本地变量赋值,但却没有读取该本地变量;本地变量赋值成null,却没有读取该本地变量。

    ICAST 整型数字相乘结果转化为长整型数字,应该将整型先转化为长整型数字再相乘。

    INT 没必要的整型数字比较,如X <= Integer.MAX_VALUE

    NP readline()的直接引用,而没有判断是否null;对方法调用的直接引用,而方法可能返回null

    REC 直接捕获Exception,而实际上可能时RuntimeException

    ST 从实例方法里直接修改类变量,即static属性。

     

    自定义检测器: findbugs 提供了强大的自定义检测器的功能,首先我们应该清楚需要

    检查的案例,findbugs的官方文档里并没有详细的介绍如何自定义,那我们只能直接阅读它的源码了,着重阅读BytecodeScanningDetectorByteCodePatternDetector的子类型,它们可以检测一般类型的问题。Findbugs利用了Byte Code Engineering Library(即BCELApache上的一个开源项目),以实现其检测器,所有的字节码扫描都是基于visitor模式。我们可以参照findbugs自带的检测器的类的源码,去编写一个自定义的检测器代码,编写完后编译成类文件,同时我们还需要提供两个XML文件,Findbugs.xmlmessage.xml,在Findbugs.xml里指定检测器和实现类,检测器的缩写、类型如快速或慢速,而message文件里则包括了该检测器的描述信息,可能是html的,然后将源文件、类文件和上面两个XML文件打包成jar文件,放在findbugs homeplugin文件夹下,这样我们就可以使用自定义检查器了。

     

    参考文档:

    FindBugs 官方文档(http://findbugs.sourceforge.net/

    FindBugs ,第 1 部分: 提高代码质量

    http://www-128.ibm.com/developerworks/cn/java/j-findbug1/

    FindBugs ,第 2 部分: 编写自定义检测器

    http://www-128.ibm.com/developerworks/cn/java/j-findbug2/

    代码静态分析(http://blog.donews.com/foxgem/archive/2005/04/23/347444.aspx

     

    Findbugs使用说明<br>目的<br> Findbugs是一个代码质量工具;我们用它来检查源代码中出现的伪问题,以期尽可能在项目的初始阶段将代码问题解决。本文主要介绍Findbugs的eclipse插件的应用。 对应的版本是:Findbugs (0.0.16);eclipse (3.1)<br><br>概要<br> FindBugs 是一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。我们利用它在eclipse中的插件来对它所过滤的工程的源代码进行检查。希望在程序员编写代码的过程中,将代码中的缺陷指出来,让编码人员在开发中将它们纠正。达到尽可能在项目编码中将问题解决得目的。而不是在编码结束的时候才用该软件对代码检查,修改。<br>

    Eclipse插件开发之FindBugs插件:http://soft.yesky.com/480/2291980_1.shtml

  • 如何进行集成测试(转)

    2008-09-09 15:03:09

    一软件集成测试
           单元测试完成之后,接下来的工作就是集成测试.软件集成测试主要依据软件结构设计(概要设计)文档,测试主要内容有功能性、可靠性、易用性、效率、维护性和可移植性中相关的部分,根据软件需求和设计的要求而选定。 验证各软件单元集成后形成的模块能否达到概要设计规格说明中各模块的设计目标;这里,模块可能是指某个软件部件,也可能是指某个或某几个子系统。通常在做集成测试时先是从子系统内部的集成测试开始做起,做完以后再测试各子系统是否能集成为最终要实现的整体系统。也有其他做法(如自顶向下集成测试方法、核心系统先做集成测试或每日集成测试等等)。总之,万变不离其宗,集成测试要保证模块的内部正确性以及保证模块能最终集成为完整的系统。集成测试有时也被称为组装测试或灰盒测试(有观点认为集成测试介于白盒与黑盒之间)。

    软件集成测试具体内容包括:

     1.功能性测试

      (1)程序的功能测试。检查各个子功能组合起来能否满足设计所要求的功能。               

      (2)一个程序单元或模块的功能是否会对另一个程序单元或模块的功能产生不利影响。

      (3)根据计算精度的要求,单个程序模块的误差积累起来,是否仍能够达到要求的技术指标。    

      (4)程序单元或模块之间的接口测试。把各个程序单元或模块连接起来时,数据在通过其接口时是否会出现不一致情况,是否会出现数据丢失。

      (5)全局数据结构的测试。检查各个程序单元或模块所用到的全局变量是否一致、合理。    

      (6)对程序中可能有的特殊安全性要求进行测试。

     2.可靠性测试

       根据软件需求和设计中提出的要求,对软件的容错性、易恢复性、错误处理能力进行测试。

     3.易用性测试

       根据软件设计中提出的要求,对软件的易理解性、易学性和易操作性进行检查和测试。

     4.性能测试

       根据软件需求和设计中提出的要求,进行软件的时间特性、资源特性测试。

    5.维护性测试 

      根据软件需求和设计中提出的要求,对软件的易修改性进行测试。

     6.可移植性测试

       根据软件需求和设计中提出的要求,对软件在不同操作系统环境下被使用的正确性进行测试。

    二集成测试 是什么
          某设计人员习惯于把所有模块按设计要求一次全部组装起来,然后进行整体测试,这称为非增量式集成。这种方法容易出现混乱。因为测试时可能发现一大堆错误,为每个错误定位和纠正非常困难,并且在改正一个错误的同时又可能引入新的错误,新旧错误混杂,更难断定出错的原因和位置。与之相反的是增量式集成方法,程序一段一段地扩展,测试的范围一步一步地增大,错误易于定位和纠正,界面的测试亦可做到完全彻底。下面讨论两种增量式集成方法。

    概述

    集成测试,也叫组装测试或联合测试。在单元测试的基础上,将所有模块按照设计要求)如根据结构图〕组装成为子系统或系统,进行集成测试。实践表明,一些模块虽然能够单独地工作,但并不能保证连接起来也能正常的工作。程序在某些局部反映不出来的问题,在全局上很可能暴露出来,影响功能的实现。

    集成测试方法

    集成测试应该考虑以下问题:

    1、在把各个模块连接起来的时候,穿越模块接口的数据是否会丢失;

    2、各个子功能组合起来,能否达到预期要求的父功能;

    3、一个模块的功能是否会对另一个模块的功能产生不利的影响;

    4、全局数据结构是否有问题;

    5、单个模块的误差积累起来,是否会放大,从而达到不可接受的程度。

    因此,单元测试后,有必要进行集成测试,发现并排除在模块连接中可能发生的上述问题,最终构成要求的软件子系统或系统。对子系统,集成测试也叫部件测试。

    任何合理地组织集成测试,即选择什么方式把模块组装起来形成一个可运行的系统,直接影响到模块测试用例的形式、所用测试工具的类型、模块编号和测试的次序、生成测试用例和调试的费用。通常,有两种不同的组装方式:一次性组装方式和增值式组装方式。

    集成测试的实施

    集成测试是一种正规测试过程,必须精心计划,并与单元测试的完成时间协调起来。在制定测试计划时,应考虑如下因素:

    1、是采用何种系统组装方法来进行组装测试;

    2、组装测试过程中连接各个模块的顺序;

    3、模块代码编制和测试进度是否与组装测试的顺序一致

    4、测试过程中是否需要专门的硬件设备;

    解决了上述问题之后,就可以列出各个模块的编制、测试计划表,标明每个模块单元测试完成的日期、首次集成测试的日期、集成测试全部完成的日期、以及需要的测试用例和所期望的测试结果。

    在缺少软件测试所需要的硬件设备时,应检查该硬件的交付日期是否与集成测试计划一致。例如,若测试需要数字化仪和绘图仪,则相应测试应安排在这些设备能够投入使用之时,并需要为硬件的安装和交付使用保留一段时间,以留下时间余量。此外,在测试计划中需要考虑测试所需软件(驱动模块、桩模块、测试用例生成程序等)的准备情况。

    集成测试完成标准

    怎样判定集成测试过程完成了, 可按以下几个方面检查:

    1、成功地执行了测试计划中规定的所有集成测试;

    2、修正了所发现的错误;

    3、测试结果通过了专门小组的评审。

    集成测试应由专门的测试小组来进行,测试小组由有经验的系统设计人员和程序员组成。整个测试活动要在评审人员出席的情况下进行。

    在完成预定的组装测试工作之后,测试小组应负责对测试结果进行整理、分析,形成测试报告。测试报告中要记录实际的测试结果、在测试中发现的问题、解决这些问题的方法以及解决之后再次测试的结果。此外还应提出目前不能解决、还需要管理人员和开发人员注意的一些问题,提供测试评审和最终决策,以提出处理意见。

    三如何进行集成测试
     集成测试(也叫组装测试联合测试)是单元测试的逻辑扩展。它的最简单的形式是:两个已经测试过的单元组合成一个组件,并且测试它们之间的接口。从这一层意义上讲,组件是指多个单元的集成聚合。在现实方案中,许多单元组合成组件,而这些组件又聚合成程序的更大部分。方法是测试片段的组合,并最终扩展进程,将您的模块与其他组的模块一起测试。最后,将构成进程的所有模块一起测试。此外,如果程序由多个进程组成,应该成对测试它们,而不是同时测试所有进程。

          集成测试识别组合单元时出现的问题。通过使用要求在组合单元前测试每个单元并确保每个单元的生存能力的测试计划,可以知道在组合单元时所发现的任何错误很可能与单元之间的接口有关。这种方法将可能发生的情况数量减少到更简单的分析级别。

          集成测试是在单元测试的基础上,测试在将所有的软件单元按照概要设计规格说明的要求组装成模块、子系统或系统的过程中各部分工作是否达到或实现相应技术指标及要求的活动。也就是说,在集成测试之前,单元测试应该已经完成,集成测试中所使用的对象应该是已经经过单元测试的软件单元。这一点很重要,因为如果不经过单元测试,那么集成测试的效果将会受到很大影响,并且会大幅增加软件单元代码纠错的代价。

          集成测试是单元测试的逻辑扩展。在现实方案中,集成是指多个单元的聚合,许多单元组合成模块,而这些模块又聚合成程序的更大部分,如分系统或系统。集成测试采用的方法是测试软件单元的组合能否正常工作,以及与其他组的模块能否集成起来工作。最后,还要测试构成系统的所有模块组合能否正常工作。集成测试所持的主要标准是《软件概要设计规格说明》,任何不符合该说明的程序模块行为都应该加以记载并上报。

          所有的软件项目都不能摆脱系统集成这个阶段。不管采用什么开发模式,具体的开发工作总得从一个一个的软件单元做起,软件单元只有经过集成才能形成一个有机的整体。具体的集成过程可能是显性的也可能是隐性的。只要有集成,总是会出现一些常见问题,工程实践中,几乎不存在软件单元组装过程中不出任何问题的情况。从图1可以看出,集成测试需要花费的时间远远超过单元测试,直接从单元测试过渡到系统测试是极不妥当的做法。

          集成测试的必要性还在于一些模块虽然能够单独地工作,但并不能保证连接起来也能正常工作。程序在某些局部反映不出来的问题,有可能在全局上会暴露出来,影响功能的实现。此外,在某些开发模式中,如迭代式开发,设计和实现是迭代进行的。在这种情况下,集成测试的意义还在于它能间接地验证概要设计是否具有可行性。

          集成测试的目的是确保各单元组合在一起后能够按既定意图协作运行,并确保增量的行为正确。它所测试的内容包括单元间的接口以及集成后的功能。使用黑盒测试方法测试集成的功能。并且对以前的集成进行回归测试

    一、集成测试过程

    二、单元测试工作内容及其流程

    三、集成测试需求获取

          集成测试需求所确定的是对某一集成工作版本的测试的内容,即测试的具体对象。集成测试需求主要来源于设计模型(Design Model)和集成构件计划(Integration Build Plan)。集成测试着重于集成版本的外部接口的行为。因此,测试需求须具有可观测、可测评性。

          1. 集成工作版本应分析其协作与消息序列,从而找出该工作版本的外部接口。

          2. 由集成工作版本的外部接口确定集成测试用例

          3. 测试用例应覆盖工作版本每一外部接口的所有消息流序列。

         注意:一个外部接口和测试用例的关系是多对多,部分集成工作版本的测试需求可映射到系统测试需求,因此对这些集成测试用例可采用重用系统测试用例技术。

    四、集成测试工作机制

          软件集成测试工作由产品评测部担任。需要项目组相关角色配合完成。如图示:

          软件评测部:

          软件项目组:

          集成测试工作内容及其流程工作流程:

    五、集成测试产生的工件清单

          1、 软件集成测试计划
          2、 集成测试用例
          3、 测试过程
          4、 测试脚本
          5、 测试日志
          6、 测试评估摘要

    六、集成测试常用方案选型

          集成测试的实施方案有很多种,如自底向上集成测试、自顶向下集成测试、Big-Bang集成测试、三明治集成测试、核心集成测试、分层集成测试、基于使用的集成测试等。在此,笔者将重点讨论其中一些经实践检验和一些证实有效的集成测试方案。

          ·自底向上集成测试

          自底向上的集成(Bottom-Up Integration)方式是最常使用的方法。其他集成方法都或多或少地继承、吸收了这种集成方式的思想。自底向上集成方式从程序模块结构中最底层的模块开始组装和测试。因为模块是自底向上进行组装的,对于一个给定层次的模块,它的子模块(包括子模块的所有下属模块)事前已经完成组装并经过测试,所以不再需要编制桩模块(一种能模拟真实模块,给待测模块提供调用接口或数据的测试用软件模块)。自底向上集成测试的步骤大致如下:

          步骤一: 按照概要设计规格说明,明确有哪些被测模块。在熟悉被测模块性质的基础上对被测模块进行分层,在同一层次上的测试可以并行进行,然后排出测试活动的先后关系,制定测试进度计划。图2给出了自底向上的集成测试过程中各测试活动的拓扑关系。利用图论的相关知识,可以排出各活动之间的时间序列关系,处于同一层次的测试活动可以同时进行,而不会相互影响。

          步骤二: 在步骤一的基础上,按时间线序关系,将软件单元集成为模块,并测试在集成过程中出现的问题。这里,可能需要测试人员开发一些驱动模块来驱动集成活动中形成的被测模块。对于比较大的模块,可以先将其中的某几个软件单元集成为子模块,然后再集成为一个较大的模块。

          步骤三: 将各软件模块集成为子系统(或分系统)。检测各自子系统是否能正常工作。同样,可能需要测试人员开发少量的驱动模块来驱动被测子系统。

          步骤四: 将各子系统集成为最终用户系统,测试是否存在各分系统能否在最终用户系统中正常工作。

          方案点评: 自底向上的集成测试方案是工程实践中最常用的测试方法。相关技术也较为成熟。它的优点很明显: 管理方便、测试人员能较好地锁定软件故障所在位置。但它对于某些开发模式不适用,如使用XP开发方法,它会要求测试人员在全部软件单元实现之前完成核心软件部件的集成测试。尽管如此,自底向上的集成测试方法仍不失为一个可供参考的集成测试方案。

          ·核心系统先行集成测试

          核心系统先行集成测试法的思想是先对核心软件部件进行集成测试,在测试通过的基础上再按各外围软件部件的重要程度逐个集成到核心系统中。每次加入一个外围软件部件都产生一个产品基线,直至最后形成稳定的软件产品。核心系统先行集成测试法对应的集成过程是一个逐渐趋于闭合的螺旋形曲线,代表产品逐步定型的过程。其步骤如下:

          步骤一: 对核心系统中的每个模块进行单独的、充分的测试,必要时使用驱动模块和桩模块;

          步骤二: 对于核心系统中的所有模块一次性集合到被测系统中,解决集成中出现的各类问题。在核心系统规模相对较大的情况下,也可以按照自底向上的步骤,集成核心系统的各组成模块。

          步骤三: 按照各外围软件部件的重要程度以及模块间的相互制约关系,拟定外围软件部件集成到核心系统中的顺序方案。方案经评审以后,即可进行外围软件部件的集成。

          步骤四: 在外围软件部件添加到核心系统以前,外围软件部件应先完成内部的模块级集成测试。

          步骤五: 按顺序不断加入外围软件部件,排除外围软件部件集成中出现的问题,形成最终的用户系统。

          方案点评: 该集成测试方法对于快速软件开发很有效果,适合较复杂系统的集成测试,能保证一些重要的功能和服务的实现。缺点是采用此法的系统一般应能明确区分核心软件部件和外围软件部件,核心软件部件应具有较高的耦合度,外围软件部件内部也应具有较高的耦合度,但各外围软件部件之间应具有较低的耦合度。

          ·高频集成测试

          高频集成测试是指同步于软件开发过程,每隔一段时间对开发团队的现有代码进行一次集成测试。如某些自动化集成测试工具能实现每日深夜对开发团队的现有代码进行一次集成测试,然后将测试结果发到各开发人员的电子邮箱中。该集成测试方法频繁地将新代码加入到一个已经稳定的基线中,以免集成故障难以发现,同时控制可能出现的基线偏差。使用高频集成测试需要具备一定的条件: 可以持续获得一个稳定的增量,并且该增量内部已被验证没有问题; 大部分有意义的功能增加可以在一个相对稳定的时间间隔(如每个工作日)内获得; 测试包和代码的开发工作必须是并行进行的,并且需要版本控制工具来保证始终维护的是测试脚本和代码的最新版本; 必须借助于使用自动化工具来完成。高频集成一个显著的特点就是集成次数频繁,显然,人工的方法是不胜任的。

          高频集成测试一般采用如下步骤来完成:

          步骤一: 选择集成测试自动化工具。如很多Java项目采用Junit+Ant方案来实现集成测试的自动化,也有一些商业集成测试工具可供选择。

          步骤二: 设置版本控制工具,以确保集成测试自动化工具所获得的版本是最新版本。如使用CVS进行版本控制。

          步骤三: 测试人员和开发人员负责编写对应程序代码的测试脚本。

          步骤四: 设置自动化集成测试工具,每隔一段时间对配置管理库的新添加的代码进行自动化的集成测试,并将测试报告汇报给开发人员和测试人员。

          步骤五: 测试人员监督代码开发人员及时关闭不合格项。

          按照步骤三至步骤五不断循环,直至形成最终软件产品。

          方案点评: 该测试方案能在开发过程中及时发现代码错误,能直观地看到开发团队的有效工程进度。在此方案中,开发维护源代码与开发维护软件测试包被赋予了同等的重要性,这对有效防止错误、及时纠正错误都很有帮助。该方案的缺点在于测试包有时候可能不能暴露深层次的编码错误和图形界面错误。

          以上我们介绍了几种常见的集成测试方案,一般来讲,在现代复杂软件项目集成测试过程中,通常采用核心系统先行集成测试和高频集成测试相结合的方式进行,自底向上的集成测试方案在采用传统瀑布式开发模式的软件项目集成过程中较为常见。读者应该结合项目的实际工程环境及各测试方案适用的范围进行合理的选型。


    附:集成测试计划书 模版

    原创作者:jerry
    转载请注明:来自Sawin系统分析之窗
    最后修改时间:2005-4-27

    1引言
    1.1编写目的
    本文是描述****集成测试的大纲文章,主要描述如何进行集成测试活动?如何控制集成测试活动?集成测试活动的流程以及集成测试活动的工作安排。本文主要的读者对象是项目负责人,集成部门经理,集成测试设计师。
    1.2背景
    项目名称:***集成测试
    项目相关对象:******************
    1.3定义
    **********:********************
    1.4参考资料
    《*********》
    2测试项目
    本测试主要为***系统的集成测试,目前***的版本为2.0,测试是***的最终集成测试,是建立在开发组程序员开发完毕自己的测试以及开发组测试的基础之上
    3 被测特性
    3.1操作性测试
    主要测试操作是否正确,有无误差?分为两部分:
    3.1.1返回测试
    由主界面逐级进入最终界面,按EXIT键逐级返回,检查返回时候屏幕聚焦是否正确
    比如:
    1. 进入“系统设置”
    2. 进入“频道搜索”
    3. 进入“自动频道搜索”
    4. 按EXIT键返回,检查当前聚焦是否为“频道搜索”
    5. 按EXIT键返回,检查当前聚焦是否为“系统设置”
    3.1.2进入测试
    由主界面逐级进入最终界面,按MENU键返回主界面,再次进入,检查是否聚焦正确
    比如:
    1. 进入“系统设置”
    2. 进入“频道搜索”
    3. 进入“自动频道搜索”
    4. 按MENU键返回主界面
    5. 当前聚焦是否为“系统设置”
    6. 进入“系统设置”,当前聚焦是否为“频道搜索”
    3.2功能测试
    测试机顶盒中每个应用的功能是否正确
    3.3性能测试
    3.3.1疲劳性测试
    测试连续开机1个月不关机器,每3天去运行一次应用。看系统的稳定性
    3.3.2大容量数据测试
    前段***数据库表中含有大量数据,测试***功能
    4 不被测特性
    5 测试方法
    1. 书写测试计划
    2. 审核测试计划,未通过返回第一步
    3. 书写测试用例;
    4. 审核测试用例,未通过返回第三步
    5. 测试人员按照测试用例逐项进行测试活动,并且将测试结果填写在测试报告上;(测试报告必须覆盖所有测试用例)
    6. 测试过程中发现bug,将bug填写在bugzilla上发给集成部经理;(bug状态NEW)
    7. 集成部经理接到bugzilla发过来的bug
    7.1 对于明显的并且可以立刻解决的bug,将bug发给开发人员;(bug状态ASSIGNED);
    7.2 对于不是bug的提交,集成部经理通知测试设计人员和测试人员,对相应文档进行修改; (bug状态RESOLVED,决定设置为INVALID);
    7.3 对于目前无法修改的,将这个bug放到下一轮次进行修改;(bug状态RESOLVED,决定设置为REMIND)
    8. 开发人员接到发过来的bug立刻修改;(bug状态RESOLVED,决定设置为FIXED)
    9. 测试人员接到bugzilla发过来的错误更改信息,应该逐项复测,填写新的测试报告(测试报告必须覆盖上一次中所有REOPENED的测试用例);
    10. 如果复测有问题返回第六步(bug状态REOPENED)
    11. 否则关闭这项BUG(bug状态CLOSED)
    12. 本轮测试中测试用例中有95%一次性通过测试,结束测试任务;
    13. 本轮测试中发现的错误有98%经过修改并且通过再次测试(即bug状态CLOSED),返回第五步进行新的一轮测试;
    14. 测试任务结束后书写测试总结报告;
    15. 正规测试结束进入非正规测试,首先是ALPHA测试,请公司里其他非技术人员以用户角色使用系统。发现bug通知测试人员,测试人员以正规流程处理bug事件;
    16. 然后是BETA测试,请用户代表进行测试。发现bug通知测试人员,测试人员以正规流程处理bug事件。
    几点说明:
    O 测试回归计划为三次;
    O 测试用例应该写得比较详尽,步骤一定要标明清楚(应该包括:编号,测试描述,前置条件,测试步骤以及测试希望结果);
    O 对于测试人员觉得应该进行的测试项目,测试人员应该报告测试设计人员,完善和健全测试用例;
    O 测试报告与测试用例分开,测试报告标明测试用例序号以及是否通过Y/N;
    O 对于集成部经理无法决定的上交项目负责人决定;
    O 性能测试中的疲劳性测试可以结合在功能测试部分,即测试期间不关闭机器;
    O 性能测试中的大容量数据测试放在测试后部分轮次(第二步,只需要进行一次)
    6 测试通过标准
    测试结果与测试用例中期望的结果一致,测试通过,否则标明测试未通过。
    6.1测试结果审批过程
    6.1.1测试回归申请结束
    测试人员提出申请这轮测试结束,提交集成部经理;
    集成部经理召集本组人员开会讨论;
    讨论通过,进行下一轮测试,并且部署下一轮测试的注意事项,流程等内容;
    如果发现这轮测试目前还存在问题没有解决,延期下一轮测试时间,讨论下一步工作应该如何进行。
    6.1.2测试结果申请结束
    测试人员提出申请测试结束,提交集成部经理;
    集成部经理召集本组人员开会讨论;
    1. 讨论通过,结束测试任务;
    2. 如果发现目前测试还存在问题没有解决,延期测试结束时间,并且讨论下一步工作应该如何进行。
    7 测试挂起和恢复条件
    7.1挂起条件
    O 进入第一轮测试,测试人员大体了解一下产品情况,如果在一小时之内发现5个以上(含5个)操作性错误,或者3个以上(含3个)功能性错误,退回测试组测试;
    O 遇到有项目优先级更高的集成测试任务;
    O 遇到有项目优先级更高的集成任务;
    O 在测试复测过程中发现产品无法运行下去;
    O 人员,设备不足。
    7.2恢复条件
    O 符合进入集成测试条件(一小时之内发现5个以下(不含5个)操作性错误,或者3个以下(不含3个)功能性错误);
    O 项目优先级更高的集成测试任务暂告完成;
    O 项目优先级更高的集成任务暂告完成;
    O 复测过程中产品可以运行下去;
    O 人员,设备到位。
    8应提供的测试文件
    O 测试计划书
    O 测试用例
    O 测试报告
    O 测试总结
    9测试任务
    O 制定审核测试计划
    O 制定和审核测试用例
    O 进行测试活动
    O 书写测试报告
    10测试环境需求
    10.1硬件需求
    ***********
    10.2软件需求
    ************
    10.3测试工具
    *************
    10.4测试需要的条件
    **************
    10.4.1 需要的文档
    O 用户手册
    O 应用手册
    O 安装说明
    10.4.2需要完成的任务
    O 程序员本人测试
    O 测试组完成测试
    11角色和职责
    O 集成(测试)经理:控制并完成测试任务和测试过程,决定测试人员提交上来的bug是否需要修改;
    O 测试设计人员:书写集成测试用例;
    O 测试人员:按照测试用例进行测试活动;
    O 开发人员:MHP程序bug修改;
    O 用户代表:进行BETA测试。
    12 人员和培训
    O 集成测试经理有责任对测试相关人员进行测试流程,规章制度培训;
    O 测试设计人员有责任对测试人员进行测试操作培训
    13 测试进度
    测试工作 进度(人*工作日)
    测试计划 8
    测试设计 60
    测试执行总共进度 30
        每次回归进度 10
    测试报告 2

    14风险及应急计划
    设备不到位:加紧设备购买;
    人员不到位
    人员请假:请假人员回来加班或赶紧测试进度/申请调配新的人员;
    人员离职:调配新的人员;
    人员调配到其他部门或项目:调配新的人员;
    开发人员开发频频出错:通知开发部门,商量策略;
    其他原因的测试工作频频被挂起或者挂起后迟迟恢复不了:加班或延期
    15审批
    集成部经理 技术部经理
    姓名: 姓名:
    日期: 日期:

    【作者介绍】 jerry
    97年毕业于北京某高校计算级专业,先后在软件公司和网络公司从事软件开发,系统分析和设计工作。2001年涉及软件质量保证,先后担任测试工程师,测试部经理,副经理。精通软件工程和测试流程,精通RUP, CMM, ISO, 6SIGMA软件质量保证工作。
    作者Email地址:guxiang625@vip.sina.com.cn

  • 什么是五险一金(转)

    2008-09-09 13:57:38

    问:什么是五险一金?  

            答:“五险一金”讲的是五种保险,包括养老保险、医疗保险、失业保险、工伤保险和生育保险;“一金”指的是住房公积金。  

            其中养老保险、医疗保险和失业保险,这三种险是由企业和个人共同缴纳的保费,工伤保险和生育保险完全是由企业承担的。个人不需要缴纳。这里要注意的是“五险”是法定的,而“一金”不是法定的。  

            问:“五险一金”的缴费比例是什么?  

            答:目前北京养老保险缴费比例:单位20%(其中17%划入统筹基金,3%划入个人帐户),个人8%(全部划入个人帐户);医疗保险缴费比例:单位10%,个人2%+3元。  

            失业保险缴费比例:单位1.5%,个人0.5%;工伤保险根据单位被划分的行业范围来确定它的工伤费率;生育保险缴费比例:单位0.8%,个人不交钱。  

            公积金缴费比例: 根据企业的实际情况,选择住房公积金缴费比例。但原则上最高缴费额不得超过北京市职工平均工资300%的10%。  

            统筹基金即:在养老保险制度从国家—单位制逐渐向国家—社会制转变的过程中需要国家统筹,以解决经济发展不平衡及人口老龄化等问题。  

            (1)以企业缴费为主建立社会统筹基金;(2)由职工和企业缴费为主建立个人帐户;(3)政府负担养老保险基金的管理费用。这种社会统筹和个人帐户相结合的半基金制有利于应付中国人口老龄化危机,逐渐分散旧制度到新制度的转轨成本,逐步实现由企业养老保险制度到个人养老保险制度的转变。  

            四险一金的缴纳额度每个地区的规定都不同,基数是以工资总额为基数。有的企业在发放时有基本工资,有相关一些补贴,但有的企业在缴纳时,只是基本工资,这是违反法律规定的。具体比例要向当地的劳动部门去咨询。  

            关于养老保险、失业保险和医疗保险的支取,是在法定允许的情况下才可以领取,是由设保登记部门来发放,比如“养老保险,要达到法定的年龄才可以,失业保险金的领取也是要具备条件,比如你到户口所在地的街道办事处办理失业证明,同时又办了求职证,就是指你失业以后还必须有求职的意愿,这样的条件才可以领取。  

            如果失业之后你不想工作,那么就不能给你发保险金。另外,养老金和失业金是不能同时享受的。  

            问:试用期内是否享有保险?  

            答:在试用期内也应该有享受保险,因为试用期是合同期的一个组成部分,它不是隔离在合同期之外的。所以在试用期内也应该上保险。另外,企业给员工上保险是一个法定的义务,不取决于当事人的意思或自愿与否,即使员工表示不需要交保险也不行,而且商业保险不能替代社会保险。养老保险的享受待遇。  

            累计缴纳养老保险15年以上,并达到法定退休年龄,可以享受养老保险待遇:  

            1、按月领取按规定计发的基本养老金,直至死亡。  

            基本养老金的计算公式如下:  

            基本养老金=基础养老金+个人账户养老金+过渡性养老金=退休前一年全市职工月平均工资×20%(缴费年限不满15年的按15%)+个人账户本息和÷120+指数化月平均缴费工资×1997年底前缴费年限×1.4%。  

            2、死亡待遇。(1)丧葬费(2)一次性抚恤费(3)符合供养条件的直系亲属生活困难补助费,按月发放,直至供养直系亲属死亡。  

            注意:养老保险应尽量连续缴纳,根据有关文件规定,凡企业或被保险人间断缴纳基本养老保险费的(失业人员领取失业保险金期间或按有关规定不缴费的人员除外),被保险人符合国家规定的养老条件,计算基本养老金时,其基础性养老金的计算基数,按累计间断的缴费时间逐年前推至相应年度上一年的本市职工平均工资计算(累计间断的缴费时间,按每满12个月为一个间断缴费年度计算,不满12个月不计算)  

            举例来说吧:  

            如果你2020年退休,正常你的基础养老金是2019年的社会平均工资×20%,但是如果你在退休之前养老保险中断了30个月,就是中断了2.5年,按2年算,你的基础养老金就是2017年社会平均工资×20%  

            问:参加医疗保险享受哪些待遇?  

            答:1、门、急诊医疗费用。在职职工年度内(1月1日-12月31日)符合基本医疗保险规定范围的医疗费累计超过2000元以上部分;  

            2、结算比例。合同期内派遣人员2000元以上部分报销50%,个人自付50%;在一个年度内累计支付派遣人员门、急诊报销最高数额为2万元。  

            3、参保人员要妥善保管好在定点医院就诊的门诊医疗单据(含大额以下部分的收据、处方底方等),作为医疗费用报销凭证;   

            4、三种特殊病的门诊就医:参保人员患恶性肿瘤放射治疗和化学治疗、肾透析、肾移植后服抗排异药需在门诊就医时,由参保人就医的二、三级定点医院开据”疾病诊断证明”,并填写《北京市医疗保险特殊病种申报审批表》,报区医保中心审批备案。这三种特殊病的门诊就医及取药仅限在批准就诊的定点医院,不能到定点零售药店购买。发生的医疗费符合门诊特殊病规定范围的,参照住院进行结算。  

            5、住院医疗  

            ●住院押金:符合住院条件的参保人员,在收入住院时,医院收取参保人员部分押金,押金数额由医院根据病情按比例确定。如被派遣人员单位和参保人员未能按时足额缴纳医疗保险费的,住院押金由派遣人员个人全额垫付。  

            ●结算周期:参保人员住院治疗每90天为一个结算周期:不超过90天的,每次住院为一个结算周期。  

            ●恶性肿瘤患者门诊放射治疗和化学治疗、肾透析、肾移植后服抗排异药、患有精神病需常年住院的患者其发生的医疗费用每360天为一个结算周期。  

            ●参保人员在定点的社区卫生服务中心(站)的家庭病床治疗发生的医疗费用,每90天为一个结算周期。  

            ●参保人员出院或阶段治疗结束时,需由派遣人员个人先与医院结清应由派遣人员个人自费和自付的费用,应由基本医疗保险统筹基金和大额医疗互助资金支付的医疗费用,由医院向医保中心申报审核、结算。  

            ●参保人员住院治疗,符合基本医疗保险规定范围的医疗费的结算,设定基本医疗统筹基金支付起付线和最高支付额。  

            ●起付线第一次住院为1300元,以后住院为650元,最高支付限额为5万元;超过最高支付上限的(不含起付标准以下以及派遣人员个人负担部分)大额医疗费用互助。  

            资金支付70%,派遣人员个人负担30%。在一个年度内最高支付10万元。住院费用的结算标准,在一个结算周期内按医院等级和费用数额采取分段计算、累加支付的办法。(各项比例有调整时,按新的标准执行)  

            注意:非因公交通事故,医保是免责的!  

            问:参加失业保险将能享受待遇?  

            答:失业保险连续缴纳一年以上,档案退回街道后。可以在街道享受失业保险待遇。  

            1.失业保险金:是指失业保险经办机构按规定支付给符合条件的失业人员的基本生活费用,它是最主要的失业保险待遇。失业保险待遇根据北京市相关文件执行。  

            2.领取失业保险金期间的医疗补助金:是指支付给失业人员领取失业保险金期间发生的医疗费用的补助。根据北京市有关政策法规执行。  

            3.领取失业保险金期间死亡的失业人员的丧葬补助金和其供养的配偶、直系亲属的抚恤金按有关规定执行。  

            问:参加工伤保险享受哪些待遇?  

            答:在合同期内不幸发生意外,需向企业索取情况说明,并加盖企业公章,尽快(最好在三个工作日内)申请工伤认定并需提供下列材料。  

            1、初次治疗诊断书或住院病历。  

            2、职业病诊断证明(原件、复印件各一份)。  

            3、交通事故需提供交通大队的事故裁决书或交通部门的交通事故证明。  

            4、身份证复印件。  

            5、有效期内的劳动合同原件。  

            问:参加生育保险享受哪些待遇?  

            答:可以报销与生育有关费用。报销范围包括,生育津贴、生育医疗费用、计划生育手术医疗费用、国家和本市规定的其他与生育有关的费用。   

            生育津贴按照女职工本人生育当月的缴费基数除以30再乘以产假天数计算。生育津贴为女职工产假期间的工资,生育津贴低于本人工资标准的,差额部分由企业补足。   

            生育医疗费用包括女职工因怀孕、生育发生的医疗检查费、接生费、手术费、住院费和药品费。计划生育手术医疗费用包括职工因计划生育发生的医疗费用。  
      现在要求,医保缴够20年,养老交够15年才有资格领养老金和享受退休后的医保报销。(完)
  • 电子书(转)

    2008-09-09 13:55:12

    《VC知识库5周年精华珍藏版》
    http://www.ibeifeng.com/read.php?tid=592&u=83
    C语言经典算法100例(强烈推荐)
    http://www.ibeifeng.com/read.php?tid=1334&u=83
    《C++程序调试实用手册》(DeBUGGING C++)
    http://www.ibeifeng.com/read.php?tid=587&u=83
    【0614】【孙鑫老师】【VC++深入详解视频及电子书】【flash版】【全20集】【大小:共786MB】
    http://www.ibeifeng.com/read.php?tid=2522&u=83
    《Visual C++灵感编程教学光盘》
    http://www.ibeifeng.com/read.php?tid=588&u=83
    《Visual C+++SQL Server数据库开发与实例》
    【中文】【CSDN-算法精华(收集)】【(CHM)(394.7KB)】
    http://www.ibeifeng.com/read.php?tid=2424&u=83
    算法ebook(10部算法经典著作的合集)
    http://www.ibeifeng.com/read.php?tid=339&u=83
    《C++程序调试实用手册》(DeBUGGING C++)
    http://www.ibeifeng.com/read.php?tid=1127&u=83
    《边用边学C语言视频教程》完全按照高等教育自学考试C语言教材授课
    http://www.ibeifeng.com/read.php?tid=586&u=83
    《C语言速成3.0视频教程》V3.0[ISO]
    http://www.ibeifeng.com/read.php?tid=590&u=83
    《VC++深入详解》视频教学DVD光盘
    http://www.ibeifeng.com/read.php?tid=1119&u=83
    【0610】【数据结构-清华严蔚敏老师】【C语言版视频教程】【 全52讲 完整版】
    http://www.ibeifeng.com/read.php?tid=630&u=83
    【0611】【青岛软件实训】【C++培训资料】【全】【F】
    http://www.ibeifeng.com/read.php?tid=2248&u=83
    【0620】【清华大学】【面向对象程序设计C++】【王萍】【F】
    http://www.ibeifeng.com/read.php?tid=2963&u=83
    【0610】【xx机构】【c语言速成】【全】
    http://www.ibeifeng.com/read.php?tid=223&u=83
    【0610】【MSDN】【 李建忠C++视频】【全】
    http://www.ibeifeng.com/read.php?tid=733&u=83
    《C++高级参考手册正确版》
    http://www.ibeifeng.com/read.php?tid=585&u=83
    循环递归算法设计
    http://www.ibeifeng.com/read.php?tid=2646&fpage=2&u=83
    《设计模式》中文版
    http://www.ibeifeng.com/read.php?tid=278&u=83
    【中文】【算法设计与实验题解】【王晓东】【(PDF)(8.24MB)】
    http://www.ibeifeng.com/read.php?tid=2427&u=83
    C语言经典算法100例(强烈推荐)
    http://www.ibeifeng.com/read.php?tid=1334&u=83
    算法导论(第二版)
    http://www.ibeifeng.com/read.php?tid=341&u=83
    现代计算机常用数据结构和算法
    http://www.ibeifeng.com/read.php?tid=342&u=83
    数据结构与算法分析学习笔记
    http://www.ibeifeng.com/read.php?tid=2652&u=83
    【中文】【CSDN-算法精华(收集)】【(CHM)(394.7KB)】
    http://www.ibeifeng.com/read.php?tid=2424&u=83
    算法ebook(10部算法经典著作的合集)
    http://www.ibeifeng.com/read.php?tid=339&u=83
    《C++程序调试实用手册》(DeBUGGING C++)
    http://www.ibeifeng.com/read.php?tid=587&u=83
    数据结构与算法综合资料库
    http://www.ibeifeng.com/read.php?tid=2650&u=83
    《C++语言的设计和演化》
    http://www.ibeifeng.com/read.php?tid=589&fpage=2&u=83
    【中文】【面向对象分析与设计(UML.2.0版)】
    http://www.ibeifeng.com/read.php?tid=290&fpage=2&u=83
    算法策略
    http://www.ibeifeng.com/read.php?tid=2648&fpage=2&u=83
    算法设计与分析
    http://www.ibeifeng.com/read.php?tid=2647&fpage=2&u=83
    H.S联盟VIP东西[黑客特训班]
    http://www.ibeifeng.com/read.php?tid=216&u=83
    oracle10g快捷版使用视频
    http://www.ibeifeng.com/read.php?tid=996&u=83
    [0630][Java私塾][Spring2.0培训教程(待续)][F]
    http://www.ibeifeng.com/read.php?tid=3646&u=83
    黎活明(中国第一本EJB书籍的作者)讲的
    一个实战项目(巴巴运动网的实现)采用EJB技术等实现,
    整套项目价值8万
    http://www.ibeifeng.com/thread.php?fid=247&u=83
    《J2EE 课程视频教程》赛迪网校罗泽彬老师主讲
    http://www.ibeifeng.com/read.php?tid=886&u=83
    《张孝祥JAVA视频教程》完整版[RMVB]
    http://www.ibeifeng.com/read.php?tid=422&u=83
    尚学堂148班高清晰版本Hibernate(王勇主讲)---共40集
    http://www.ibeifeng.com/read.php?tid=1338&u=83
    新东方J2ee系列
    http://www.ibeifeng.com/read.php?tid=531&u=83
    树人J2EE高级框架实战教学(视频教程)郭克华
    http://www.ibeifeng.com/read.php?tid=620&u=83
    MLDN J2EE 开发视频(共54讲)
    http://www.ibeifeng.com/read.php?tid=443&u=83
    北大青鸟 Asp.net 视频(主讲:于海涛)共32 讲
    http://www.ibeifeng.com/read.php?tid=475&u=83
    达内anyfo--EJB视频第一集发布!!
    http://www.ibeifeng.com/read.php?tid=1329&u=83
    郭克华J2ME
    http://www.ibeifeng.com/read.php?tid=241&u=83
    H.S联盟VIP东西[黑客特训班]
    http://www.ibeifeng.com/read.php?tid=216&u=83
    oracle10g快捷版使用视频
    http://www.ibeifeng.com/read.php?tid=996&u=83
    [0617][XX网校网络教育][JSP课程][全][F]
    http://www.ibeifeng.com/read.php?tid=2780&u=83
    《精通CSS,DIV+CSS 别具风格》数码照片版超清晰
    http://www.ibeifeng.com/read.php?tid=1360&u=83
    JSP+JAVAbean写的一个很好的新闻发布系统
    http://www.ibeifeng.com/read.php?tid=180&u=83
    仿淘宝网站SQL版本---------正版哦,大家来下啊!狂顶
    http://www.ibeifeng.com/read.php?tid=257&u=83
    【独家】【传智播客】【AJAX内部精品视频】
    http://www.ibeifeng.com/read.php?tid=2338&u=83
    软考精品内部资料----来自一流的培训机构
    http://www.ibeifeng.com/read.php?tid=270&u=83
    《赛迪网络工程师考试视频教程》[RMVB]
    http://www.ibeifeng.com/read.php?tid=269&u=83
    《赛迪网校-软件设计师》
    http://www.ibeifeng.com/read.php?tid=1125&u=83
    《补发 MCSE2000微软系统专家认证考试全套视频教程》(mcse2000)mcse200[ISO]
    http://www.ibeifeng.com/read.php?tid=267&u=83
    全国计算机等级考试上机模拟系统
    http://www.ibeifeng.com/read.php?tid=629&fpage=2&u=83
    《全国专业技术人员计算机应用能力考试模拟考试系统》1~3版
    http://www.ibeifeng.com/read.php?tid=263&fpage=2&u=83
    《CISCO教程》(CBTNUGGETS CISCO CCVP Exam Pack )(更新)[Bin]
    http://www.ibeifeng.com/read.php?tid=399&u=83
    软考联盟--解压后虚拟光驱放啊
    http://www.ibeifeng.com/read.php?tid=291&u=83
    CIU软考联盟--软件设计师视频教程下载
    http://www.ibeifeng.com/read.php?tid=1971&u=83
    【0710】【赛迪】【2008网络管理员培训课程][网络基础专题班]】【全套】【F】
    http://www.ibeifeng.com/read.php?tid=2161&u=83
    强烈推荐台湾中原大学的php教程。 诙谐幽默,那绝对是大陆的教程没法比的。
    http://www.ibeifeng.com/read.php?tid=1164&u=83
    【0617】【黑客基地】【PHP特训班】【21讲】【F】
    http://www.ibeifeng.com/read.php?tid=2812&u=83
    【0710】【东北人在线】【ASP项目实例开发】【全套】【F】
    http://www.ibeifeng.com/read.php?tid=2166&u=83
    [0617][XX网校网络教育][JSP课程][全][F]
    http://www.ibeifeng.com/read.php?tid=2780&u=83
    《精通CSS,DIV+CSS 别具风格》数码照片版超清晰
    http://www.ibeifeng.com/read.php?tid=1360&u=83
    JSP+JAVAbean写的一个很好的新闻发布系统
    http://www.ibeifeng.com/read.php?tid=180&u=83
    仿淘宝网站SQL版本---------正版哦,大家来下啊!狂顶
    http://www.ibeifeng.com/read.php?tid=257&u=83
    0610】【xx机构】【.net winform和asp.net视频教程】【全】
    http://www.ibeifeng.com/read.php?tid=1904&fpage=2&u=83
    【0610】【台湾微软】【SOA 服務導向架構線上教學課程】【全】
    http://www.ibeifeng.com/read.php?tid=578&fpage=2&u=83
    [0621][MSDN][跟我一起学Visual.Studio.2005][F]
    http://www.ibeifeng.com/read.php?tid=3020&u=83
    【.NET平台的AJAX】
    http://www.ibeifeng.com/read.php?tid=2931&u=83
    【青岛软件实训】【.net培训资料】
    http://www.ibeifeng.com/read.php?tid=2247&u=83
    【北大】【ASP课程超高速下载(经典)】【全】
    http://www.ibeifeng.com/read.php?tid=1698&u=83
    【北大青鸟 】【Asp.net 视频(主讲:于海涛)】【共32 讲】
    http://www.ibeifeng.com/read.php?tid=475&u=83
    【中美IT培训】【ASP.NET培训视频--一套经典的.NET教程】【001-008】
    http://www.ibeifeng.com/read.php?tid=100&u=83
    [MSDN][微软官方ASP.NET2.0快速入门][全]
    http://www.ibeifeng.com/read.php?tid=2588&u=83
    [xx机构][ASP.net最佳实践][全]
    http://www.ibeifeng.com/read.php?tid=2717&u=83
    【李建忠】【面向对象纵横谈-C#版本(23种设计模式)】【全】
    http://www.ibeifeng.com/read.php?tid=2801&u=83
    【MSDN】【C#游戏开发项目实战】【全】
    http://www.ibeifeng.com/read.php?tid=2582&u=83
    【中美IT培训】【DotNet全套】【全套】
    http://www.ibeifeng.com/read.php?tid=2168&u=83
    【台湾微软】【Visual Studio 2005视频】【全】
    http://www.ibeifeng.com/read.php?tid=2578&u=83
    【MSDN】【邵志东ASP.NET视频】【全】
    http://www.ibeifeng.com/read.php?tid=2920&u=83
    《张孝祥JAVA视频教程》完整版[RMVB]
    http://www.ibeifeng.com/read.php?tid=422&u=83
    尚学堂148班高清晰版本Hibernate(王勇主讲)---共40集
    http://www.ibeifeng.com/read.php?tid=1338&u=83
    郭克华J2ME
    http://www.ibeifeng.com/read.php?tid=241&u=83
  • JAVA学习问题汇总

    2008-08-28 14:07:47

    1.通过了编译,运行时抛出异常如下:
    Exception in thread "main" java.lang.NoClassDefFoundError:StringTest

    解决方法,在环境变量中加上那个.(dot)  

    ★记住:环境变量中的   .   切记不能少,它表示当前路径,如果少掉就出现以上的错误  

    2.

  • JAVA学习的几个基本概念

    2008-06-16 17:38:21

    1:基本概念
    dk1.4:java的编程环境,开发包阿,sun提供的一些类库
    WebLogic:一个j2ee服务器,功能强大
    Tomcat:一个jsp服务器,免费不错
    JBoss4:也是一个j2ee服务器,免费,不过跟sun的标准有点冲突
    apache:一个应用服务器,跟iis 类似,可以跟tomcat结合使用,
    javabean:其实是一个java类,在java里作用很大,里面由setXXX(),getXXX()的方法组成,组件化开发,譬如你可以把数据库操作写成一个javabean,
    struts:一个框架,远用了mvc思想,一般用与开发大中型网站,精典
    插件包CDT:使eclipse支持C++开发

    4:Eclipse开发环境介绍
          Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Tools,JDT)。
      虽然大多数用户很乐于将 Eclipse 当作 Java IDE 来使用,但 Eclipse 的目标不仅限于此。Eclipse 还包括插件开发环境(Plug-in Development Environment,PDE),这个组件主要针对希望扩展 Eclipse 的软件开发人员,因为它允许他们构建与 Eclipse 环境无缝集成的工具。由于 Eclipse 中的每样东西都是插件,对于给 Eclipse 提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。
      这种平等和一致性并不仅限于 Java 开发工具。尽管 Eclipse 是使用 Java 语言开发的,但它的用途并不限于 Java 语言;例如,支持诸如 C/C++、COBOL 和 Eiffel 等编程语言的插件已经可用,或预计会推出。Eclipse 框架还可用来作为与软件开发无关的其他应用程序类型的基础,比如内容管理系统。

    5:WINDOWS 2000 环境下JAVA环境配置
    1.从java.sun.com下载 j2sdk-1_4_1_01-windows-i586.exe
    2.安装j2sdk-1_4_1_01-windows-i586.exe到c:\j2sdk目录下
    3.从jakarta.apache.org下载jakarta-tomcat-4.1.17.exe
    4.将jakarta-tomcat-4.1.17.exe安装到C:\Tomcat 4.1目录下
    5.选择 “开始”—“设置”—“控制面板”—“系统”—“高级”—“环境变量”
    6.在系统变量栏目中新建系统变量JAVA_HOME,变量值为c:\j2sdk
    7.在系统变量栏目中新建系统变量CATALINA_HOME,变量值为C:\Tomcat 4.1
    8.修改系统变量栏目中系统变量PATH,加入C:\j2sdk\bin
    9.在系统变量栏目中新建系统变量CLASSPATH,变量值为C:\j2sdk\lib\tools.jar;C:\Tomcat 4.1\common\lib\servlet.jar
    10.注销当前用户使系统变量的配置生效。
    11.启动Tomcat

     

    几个概念:作用域:{如果是在作用域内定义的变量,出了作用域后就消失}

    1:JAVA的基本变量
    变量                         最小值                               最大值                            表示方法
    boolean:                     false                                      true                                  boolean b=false;
    char                           单个字符                                                                     char c='c';
    byte                           -128                                      127                                 byte t=8;
    short                         -32768                                   32767                             short r=12345;
    int                             -2  *  31                                 2  * 31 -1                        int i=3;
    long                          -2  *  63                                  2 * 63 -1                        long l=12345678;
    float                                                                                                                float f= (float) 1.0  或者 float f=1.0f;
    double                                                                                                            double d=123.23
    String (String是一个类,类的第一个字母是大的)                                      String s=new String(“abcdefgh“); 
    数组:
    定义                               一维: int a[]=new int[3];   二维: int a[][]=new int[2][3];
    赋值                               a[0]=1;a[0][0]=2;
    长度                              第一维的长度:a.length; 第二维的长度:a[0].length;
    定义时直接赋值:          String names[]={“cheng“,“zhang“,“li“);
                                          相当于:
                                          String names[];

                                          names=new String[3];
                                          names[0]=new String(“cheng“);
                                          names[1]=new String(“zhang“);
                                          names[2]=new String(“li“);
    2:变量的转换

    3:变量的运算
    & 、|     :是非短路运算,必须进行右计算
    && 、|| :是短路运算,只要左边的符合情况,就不会进行右边的计算
    %          :取余,可以用于浮点数
    ==  ,!=       :判断等于,不等于


     

  • JAVA语法学习一

    2008-06-16 17:22:10

    )起源:
       源于sun的一个叫Green的项目,给家用电子产品开发一个分布式系统,通过给家用电器发送EMail来控制它们。

    开始准备采用C++,但是C++太复杂,安全性差,所以就开发了一个类C的语言,名字叫Oak,这是java的前身。后来竞

    争失败,走投无路的时候受NetScape启发,继续完善改名为java,开发了一个HotJava浏览器。


    2)特点:
      a:跨平台,编译成与平台无关的中间码

      b:象指针和释放内存等操作被删除,屏弃C++中容易出错的地方,具有内存自动回收功能。是代码具有健壮性。
        去掉了C++中的:指针运算,结构,typedefs,#define,全局变量的定义。释放内存。

      c:包括一个支持http和ftp的基于tcp/ip协议的类库,使开发internet上的程序更容易。

    3)文件说明
       javac :java语言编辑器,叫源代码(后缀为java)编译成字节码(后缀为class) ---使用方法:javac 代码文

    件.java
       java  :java字节码解释器                                                  ---使用方法:java  字节文

    件.class


    4)语法:
      a:注释://---表示注释一行  /*  */---表示注释N行

      b:数据类型:(8进制前面有个0,16进制前面有0x,或者0X)
        1、整型----------byte(-128--128),short(-32768-32767),int(-21亿,2的32次方),long(2的64次方)
        2、浮点型--------float,double
        3、布耳型--------boolean
        4、字符型--------Char     //char b='c';
        5、字符串型------string   //String b="abcdefg";

      c:数组:
        1、定义:一维:int a[],二维:float b[][]
        2、设置长度:a=new int[10] 或者写在一起:int a[]=new int[10];
        3、长度:数组名.length   
      
      d:表达式
        1、基本运算符号----:+,-,*,/,%(取模)
        2、单目运算符号----:++,--,&(位与),|(位或)
        3、判断符号--------: ==,!=,&&(并且),||(或者)
        4、对象运算符------:if (myobjcet instanceof 父类)   //判断是否是该父类的子类
        5、三元运算符------:i=b?1:0 //表示如果b=true 则i=1,否则为0
      
      e:控制结构:
        1、判断结构:  if (条件) {} else {}
        2、开关结构:switch (表达式) {
                      case 值1:... break;
                      case 值2:... break;
                      case 值3:... break;
                      default:...
                       }
        3:for循环结构:   for (int i;i<=N;i++) {....}
        4:while循环结构:  while (条件) {....}
        5:do循环结构:    do {...} while (条件)
        6:其他控制语句:
           ---break;
           ---continue;
           ---return 值;
           ---label:提供break,continue跳出循环的作用.跳转比如:break lab;

    5)常用函数:
       1:常用数学函数:java.lang.Math

       2:字符串函数:
          a、Char   CharAt(i) ------------------返回第N个字符:
          b、int    CompareTo(字符串)-----------比较两个字符串:  小于0表示比他小,等于0表示相等,大于0表

    示比他大     
          c、String Concat(字符串)--------------将两个字符串连接起来
          d、int    Indexof(字符或者字符串)-----求字符的位置,找不到返回-1
          e、Stinrg Substing(其始位置,结束位置)-求子串
          f、String trim()-----------------------去掉空格

       3:转换函数:
          a.字符串转化为数值:f=new float(s).floatvalue();
                              d=new double(s).doublevalue();

       4:格式化函数:   
          a、格式话数字:format('2222%s3333%s1111',v1,v2) -------没有,java5才有。
          b、格式话日期:java.text.SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
             Date d = sdf.parse(date);
             java.text.SimpleDateFormat sdfNew = new SimpleDateFormat("MMddyyyy");
             return sdfNew.format(d);


    *****************************************************************************************************

    6)类结构说明:
      a、构造函数:与类名相同的函数比如: public HelloWorld () {...} ---构造函数没有返回值,void也没有,

    如果有那就不是构造函数了
      b、结束函数:java没有提供析构函数,因为java本身具有自动清除功能,但是他也提供了一个自动垃圾箱的成员

    函数:
                   Protected void finaliaze () {...}
      c、父类与子类:
                   class woman extends men {...}
      d、访问控制:
          1、public--------------可以被任意其他类调用
          2、protected-----------只能在该类和其子类调用(自己也不能调用????)
          3、private-------------只能在本类中调用
          4、friendly------------(缺省)可以被本包里的任意对象访问。
      e、静态:static
         1、静态变量:static int i=1;           //无论在哪个对象里面改变了静态变量的值,则所有对象的该静

    态变量都要改变。
         2、静态函数:static void add() {...}   //静态函数不能访问非静态函数和变量。他的作用是:可直接调

    用。同delphi中的类函数。
      f、this 和 super
         1、this代表本类。
         2、super代表父类。
      g、类的类型:
         1、abstract------------抽象类,必须至少有一个虚函数。一个抽象类不能创建对象,必须继承子类才能创

    建对象。
         2、final---------------结束类:表示该类不能再派生出之类。
         3、public--------------公共类:表示其他类可以调用,其他包要使用该类则:import 包。类。
         4、synchronicable------同步类:表示这些类的成员函数必须同步。
      h、接口:
         1、定义:public interface TestIn {....声明空的方法}
         2、使用:class MyClass implements 接口 {实现接口中的方法}

    7)异常处理:
       1、结构1:
              try
                {...}
              catch (Exception e)
                {...}

        2、结构2:
              try
                {...}
              finally
                {...}      
        3、抛出错误 throw e;


    8)HelloWorld例子:
       public class HelloWord {
     public static void main(String[] args) {
      System.out.println("Hello,Wrold!");
     }
    }
       //接收外部参数参数:int a=Integer.ParseInt(args[0]);
                           int b=Integer.ParseInt(args[1]);
             
         
    *****************************************************************************************************

    9)JAVA中的类:(根类:object)
      1、输入输出类:java的输入输出类要使用java.lang程序包中的类
         a: java.lang.System
         b: java.lang.Inputstream
         c: java.lang.Printstream
         ------------------------------------------------
         System.in为 Inputstream的对象
         System.out为Printstream的对象
         System.err为Printstream的对象,用于错误信息的输出。
     
      2、Date类  Date d1=new Date();  //定义一个当前时间的类

      import java.utils.*

      3、Hashtable类    //hash:杂乱序号 hash code:混列码
         说明:Hashtable提供一个hash表,定义:Hashtable h1=new Hashtable();  Hashtable h2=new

    Hashtable(20,)
     
      4、Random类 随机数类

      5、Vector类:安装一个可延续的对象数组

      6、AWT类
       

    10)不明白的代码
         1、System.out.flush

    ---------flush()的作用是清空缓冲区,更新缓冲区,不然有时候会看不到输出,用BufferedReader用了一个系统

    分配的缓冲区,只有缓冲区满了时候才会读出,如果没满而你又想操作的话,就要用flush清空缓冲区,让结果输出!

         2、Integer.parseInt  ---------//pa:z//解析,使用格式:parseInt(String s,int radix),返回一个整数

    ,为radix进制的

         3、hashcode  ---------------对象的散列标识,就和你的身份证类似,可以一下子就找到你的资料.数据结

    构哈希散列的具体应用
            hashtable和hashmap的区别-a、HashTable是线程安全的一个Collection,HashMap不是线程安全的
                                     b、前者是图,后者是哈希表,在HashMap中不能由get()方法来判断HashMap中

    是否存在某个键,而应该用containsKey()方法来判断。
                                     c、前者的关键词是,遍历、查找、搜索(如最短路径)后者的关键词是,冲

    突处理,排序,
                                     d、都属于Map接口的类,实现了将惟一键映射到特定的值上。HashMap 类没有

    分类或者排序。它允许一个 null 键和多个 null 值。 Hashtable 类似于 HashMap,但是不允许 null 键和 null

    值。它也比 HashMap 慢,因为它是同步的。
                                     e、Hashtable缺省的初始大小为101,载入因子为0.75,即如果其中的元素个数

    超过75个,它就必须增加大小并重新组织元素,所以,如果你知道在创建一个新的Hashtable对象时就知道元素的确切

    数目如为110,那么,就应将其初始大小设为110/0.75=148,这样,就可以避免重新组织内存并增加大小

            一个hashtable的例子:
            HashTable h=new HashTable();
            h.put("用户1",new Integer(90));
            h.put("用户2",new Integer(50));
            h.put("用户3",new Integer(60));
            h.put("用户4",new Integer(70));
            Enumeration e=h.elements();
            while(e.hasMoreElements()){System.out.println(e.nextElement());

         4、没有结构怎么处理?-----------------用类代替。
         5、vector //向量与arraylist-----a、Vector和ArrayList Vector和ArrayList在使用上非常相似,都可用来

    表示一组数量可变的对象应用的集合,并且可以随机地访问其中的元素。
                                 

    b、Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的

    同步必然要影响性能,因此,ArrayList的性能比Vector好。
                                 c、当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,

    而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间


    11)常出现的错误信息
        1、The method readLine() from the type DataInputStream is deprecated  //deprikeit//抗议,不赞成。
           说明:说明这个方法或类java不再建议您使用,以后的版本也不会再更新这个方法或类。 

        2、Unhandled exception type IOException
           说明:要用try   ...catch...语句把会出错的地方包含起来  //Throws IOException

        3、XXX cannot be resolved 
           说明:该变量没有定义或者不在定义范围之内。在{}内定义的变量只在{}内有效。

     Java语法学习:字符串

    Java的String太特别了,也太常用了,所以重要。我初学Java就被它搞蒙了,太多混淆的概念了,比如它的不变性。所以必须深入机制地去理解它。


    1、String中的每个字符都是一个16位的Unicode字符,用Unicode很容易表达丰富的国际化字符集,比如很好的中文支持。甚至Java的标识符都可以用汉字,但是没人会用吧(只在一本清华的《Java2实用教程》看过)。

    2、判断空字符串。根据需要自己选择某个或者它们的组合
       if ( s == null )   //从引用的角度
       if ( s.length() == 0 )    //从长度判别
       if ( s.trim().length () == 0 )    //是否有多个空白字符
    trim()方法的作用是是移除前导和尾部的Unicode值小于'"u0020'的字符,并返回“修剪”好的字符串。这种方法很常用,比如需要用户输入用户名,用户不小心加了前导或者尾部空格,一个好的程序应该知道用户不是故意的,即使是故意的也应该智能点地处理。
    判断空串是很常用的操作,但是Java类库直到1.6才提供了isEmpty()方法。当且仅当 length() 为 0 时返回 true。

    3、未初始化、空串""与null。它们是不同的概念。对未初始化的对象操作会被编译器挡在门外;null是一个特殊的初始化值,是一个不指向任何对象的 引用,对引用为null的对象操作会在运行时抛出异常NullPointerException;而空串是长度为0的字符串,和别的字符串的唯一区别就是 长度为0。
    例子:
       public class StringTest{
           static String s1;
           public static void main(String[] args) {
               String s2;
               String s3 = "";
               System.out.print(s1.isEmpty());   //运行时异常
               System.out.print(s2.isEmpty());   //编译出错
               System.out.print(s3.isEmpty());   //ok!输出true
           }
       }

    4、String类的方法很多,在编写相关代码的时候看看JDK文档时有好处的,要不然花了大量时间实现一个已经存在的方法是很不值得的,因为编写、测试、维护自己的代码使项目的成本增加,利润减少,严重的话会导致开不出工资……

    5、字符串的比较。
    Java不允许自定义操作符重载,因此字符串的比较要用compareTo() 或者 compareToIgnoreCase()。s1.compareTo(s2),返回值大于0则,则前者大;等于0,一般大;小于0,后者大。比较的依 据是字符串中各个字符的Unicode值。

    6、toString()方法。
    Java的任何对象都有toString()方法,是从Object对象继承而来的。它的作用就是让对象在输出时看起来更有意义,而不是奇怪的对象的内存地址。对测试也是很有帮助的。

    7、String对象是不变的!可以变化的是String对象的引用。
    String name = "ray";
    name.concat("long"); //字符串连接
    System.out.println(name); //输出name,ok,还是"ray"
    name = name.concat("long"); //把字符串对象连接的结果赋给了name引用
    System.out.println(name); //输出name,oh!,变成了"raylong"
    上述三条语句其实产生了3个String对象,"ray","long","raylong"。第2条语句确实产生了"raylong"字符串,但是没有 指定把该字符串的引用赋给谁,因此没有改变name引用。第3条语句根据不变性,并没有改变"ray",JVM创建了一个新的对象,把"ray", "long"的连接赋给了name引用,因此引用变了,但是原对象没变。

    8、String的不变性的机制显然会在String常量内有大量的冗余。如:"1" + "2" + "3" +......+ "n" 产生了n+(n+1)个String对象!因此Java为了更有效地使用内存,JVM留出一块特殊的内存区域,被称为“String常量池”。对 String多么照顾啊!当编译器遇见String常量的时候,它检查该池内是否已经存在相同的String常量。如果找到,就把新常量的引用指向现有的 String,不创建任何新的String常量对象。

    那么就可能出现多个引用指向同一个String常量,会不会有别名的危险呢?No problem!String对象的不变性可以保证不会出现别名问题!这是String对象与普通对象的一点区别。

    乍看起来这是底层的机制,对我们编程没什么影响。而且这种机制会大幅度提高String的效率,实际上却不是这样。为连接n个字符串使用字符串连接操作 时,要消耗的时间是n的平方级!因为每两个字符串连接,它们的内容都要被复制。因此在处理大量的字符串连接时,而且要求性能时,我们不要用String, StringBuffer是更好的选择。

    8、StringBuffer类。StringBuffer类是可变的,不会在字符串常量池中,而是在堆中,不会留下一大堆无用的对象。而且它可将字符串 缓冲区安全地用于多个线程。每个StringBuffer对象都有一定的容量。只要StringBuffer对象所包含的字符序列的长度没有超出此容量, 就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。这个固定的容量是16个字符。我给这种算法起个名字叫“添饭算法”。先给你一满碗 饭,不够了再给你一满碗饭。
    例子:
       StringBuffer sb = new StringBuffer();   //初始容量为 16 个字符
       sb.append("1234");   //这是4个字符,那么16个字符的容量就足够了,没有溢出
       System.out.println(sb.length());   //输出字符串长度是4
       System.out.println(sb.capacity());   //输出该字符串缓冲区的容量是16

       sb.append("12345678901234567");       //这是17个字符,16个字符的容量不够了,扩容为17+16个字符的容量
       System.out.println(sb.length());   //输出字符串长度是17
       System.out.println(sb.capacity());   //输出该字符串缓冲区的容量是34

       sb.append("890").reverse().insert(10,"-");  
       System.out.println(sb);       //输出0987654321-09876543214321

    字符串的长度和字符缓冲区的容量是两个概念,注意区别。
    还有串联的方式看起来是不是很酷!用返回值连接起来可以实现这种简洁和优雅。

    10、StringBuilder类。 从J2SE 5.0 提供了StringBuilder类,它和StringBuffer类是孪生兄弟,很像。它存在的价值在于:对字符串操作的效率更高。不足的是线程安全无法保证,不保证同步。那么两者性能到底差多少呢?很多!
    请参阅:http://javadby.com#副标题#e#
    实践:
    单个线程的时候使用StringBuilder类,以提高效率,而且它的API和StringBuffer兼容,不需要额外的学习成本,物美价廉。多线程时使用StringBuffer,以保证安全。

    11、字符串的比较。
    下面这条可能会让你晕,所以你可以选择看或者不看。它不会对你的职业生涯造成任何影响。而且谨记一条,比较字符串要用equals()就ok了!一旦用了 “==”就会出现很怪异的现象。之所以把这部分放在最后,是想节省大家的时间,因为这条又臭又长。推荐三种人:一、没事闲着型。二、想深入地理解Java 的字符串,即使明明知道学了也没用。三、和我一样爱好研究“茴”字有几种写法。

    还是那句老话,String太特殊了,以至于某些规则对String不起作用。个人感觉这种特殊性并不好。看例子:
    例子A:
       String str1 = "java";
       String str2 = "java";
       System.out.print(str1==str2);
    地球上有点Java基础的人都知道会输出false,因为==比较的是引用,equals比较的是内容。不是我忽悠大家,你们可以在自己的机子上运行一 下,结果是true!原因很简单,String对象被放进常量池里了,再次出现“java”字符串的时候,JVM很兴奋地把str2的引用也指向了 “java”对象,它认为自己节省了内存开销。不难理解吧 呵呵
    例子B:
       String str1 = new String("java");
       String str2 = new String("java");
       System.out.print(str1==str2);
    看过上例的都学聪明了,这次肯定会输出true!很不幸,JVM并没有这么做,结果是false。原因很简单,例子A中那种声明的方式确实是在 String常量池创建“java”对象,但是一旦看到new关键字,JVM会在堆中为String分配空间。两者声明方式貌合神离,这也是我把“如何创 建字符串对象”放到后面来讲的原因。大家要沉住气,还有一个例子。
    例子C:
       String str1 = "java";
       String str2 = "blog";
       String s = str1+str2;
       System.out.print(s=="javablog");
    再看这个例子,很多同志不敢妄言是true还是false了吧。爱玩脑筋急转弯的人会说是false吧……恭喜你,你会抢答了!把那个“吧”字去掉你就完 全正确。原因很简单,JVM确实会对型如String str1 = "java"; 的String对象放在字符串常量池里,但是它是在编译时刻那么做的,而String s = str1+str2; 是在运行时刻才能知道(我们当然一眼就看穿了,可是Java必须在运行时才知道的,人脑和电脑的结构不同),也就是说str1+str2是在堆里创建的, s引用当然不可能指向字符串常量池里的对象。没崩溃的人继续看例子D。
    例子D:
       String s1 = "java";
       String s2 = new String("java");
       System.out.print(s1.intern()==s2.intern());
    intern()是什么东东?反正结果是true。如果没用过这个方法,而且训练有素的程序员会去看JDK文档了。简单点说就是用intern()方法就 可以用“==”比较字符串的内容了。在我看到intern()方法到底有什么用之前,我认为它太多余了。其实我写的这一条也很多余,intern()方法 还存在诸多的问题,如效率、实现上的不统一……
    例子E:
       String str1 = "java";
       String str2 = new String("java");
       System.out.print(str1.equals(str2));
    无论在常量池还是堆中的对象,用equals()方法比较的就是内容,就这么简单!

  • JAVA程序员之路(转)

    2008-06-04 11:10:50

    很多网友问我学习Java有没有什么捷径,我说“无他,唯手熟尔”。但是我却很愿意将自己学习的一些经验写出来,以便后来者少走弯路,帮助别人是最大的快乐嘛!
    要想学好Java,首先要知道Java的大致分类。我们知道,自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。J2SE开发桌面应用软件比起VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。所以现在应用最广泛又最好学的就是J2EE了。J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。
    那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。然后你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?还好,SUN提供了Javabean可以把你的JSP中的Java代码封装起来,便于调用也便于重用。接着就是EJB了,EJB就是Enterprise JavaBean,看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail了。
    好了,对Java和J2EE有了一些基本概念之后,你就应该编一些程序了,千万不要纸上谈兵哦。最好找一些有实例且带光盘的书来看,这样看到好的程序就可以直接Ctrl+C再Ctrl+V,也不用劳您老大架再亲自把它再输一遍吧,再说直接复制还不用怕出错,何乐而不为呢!还有就是要经常上一些好的Java编程文章,有好的文章要Cut下来,有问题尽管问,只要问题不是太傻,一般高手都会回答你的。下面介绍几个好的Java方面的编程网站:
    CSDN论坛http://www.csdn.net/ 中国最有名的技术论坛,《程序员》杂志就是他们出版的,你可以在上面提出问题,马上就有人回答你,如果你觉得好,你可以给那人加分;
    Java研究组http://www.javaresearch.org/ 上面有很多原创文章,高手还是挺多的;
    Java开发者http://www.chinajavaworld.com/ 那里Java资料比较全;
    java.com.cn http://www.java.com.cn/ 看这域名就知道有多牛,注册用户快接近一万了,同时在线人数也在一千左右,人气很旺的;
    IBM的开发者网http://www-900.ibm.com/developerWorks/cn/java/index.shtml IBM永远的蓝色巨人;

    那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。所以你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他还愿意不厌其烦地教你,这样好象有点难哦!
    还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,最近《金装四大才子》看多了)。学Java必读的两个开源程序就是Jive和Pet Store.。Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名鼎鼎的banq在Jive2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网http://www.jdon.com/ 去下载,或到同济技术论坛的服务器上ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要错过了。
    你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得我也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是我泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧,让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。关于设计模式的资料,还是向大家推荐banq的网http://www.jdon.com/ ,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring(重整)和极限XP编程,相信你又会上一个台阶。
    做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧,你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的来了。。。。。。
    当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
    下面介绍两个好的开源项目网站:
    湖北省软件公共开发平http://gro.clinux.org/
    共创联http://cosoft.org.cn/
    哇,好高兴哦,我终于成为高手了!非也,非也。古人云:“识时务者为俊杰”。你知道计算机界现在的发展形势吗?你知道微软的.NET蓝图和SUN ONE计划之间的明争暗斗吗?你知道计算机技术将向何处发展吗?其实从各大计算机厂商最近的动作,都可以看出来“Web服务将是下一代互联网应用的制高点”,而微软的.NET蓝图和SUN ONE计划的斗争焦点,也就是Web服务。Web服务就是一个崭新的分布式计算模型,它是一系列标准的综合(XML,SOAP,UDDI,WSDL和WSFL等)。它使得不同语言编写的软件能够轻易的集成起来,使网络资源和Web站点变成一种服务而不是混乱的垃圾场。不远的将来,我们就可以在家里点击一下鼠标,就可以完成出门旅游的全部准备工作,包括定飞机票,定旅游线路,定好房间等。请注意,这所有的一切都是Web站点间自动完成的,再也不用象现在一样,表面上是电子商务,实际上很多环节都是人工操作。也许你会觉得这是天方夜谈,不过就近的说,你也很有可能承接一个项目,要集成两个企业的ERP系统。很有可能上游企业的系统是用Dephi编的,而下游企业的系统是用Java编的。你说你是Java高手,大家都看者你怎么做呢。所以啊,你还得学习新技术,如Web服务,而且你Dephi也要懂一点吧(Dephi6现在已经提供Web服务的控件了)。 你编的Java系统,可能要和.NET集成,所以你.NET要懂一点吧?到最后,你可能发现你已经成为Java高手了,但很多时间却在搞别的技术。太极张三丰里说,最厉害的招式就是没有招式,可能就是这个道理吧!
    因为刚刚兴起,所以网上Web服务的资料不是很多,我还是给大家推荐几个网站吧:
    中国UDDI技术联http://www.uddi-china.org/
    CSDN的柴晓路专http://www.csdn.net/develop/author/ColumnAuthor/fennivel/ (注:柴晓路也是互联网上一个有名的人物,他发表过很多关于Web服务的文章,还出了一书,应该称的上是中国Web服务技术的先行者)
    IBM的开发者网络的XML&Web Service专栏:
    http://www-900.ibm.com/developerWorks/cn/xml/index.shtml?csdn IBM可是Web服务的力推者
  • 如何学习JAVA? (转)

    2008-06-02 15:57:45

    前言
      
      在ChinaITLAB导师制辅导中,笔者发现问得最多的问题莫过于"如何学习编程?JAVA该如何学习?"。类似的问题回答多了,就萌生了写下本文的想法。到时候再有人问起类似的问题,我可以告诉他(她),请你去看看《JAVA学习之路》。拜读过台湾蔡学镛先生的《JAVA夜未眠》,有些文章如《JAVA学习之道》等让我们确实有共鸣,本文题目也由此而来。
      
      软件开发之路是充满荆棘与挑战之路,也是充满希望之路。JAVA学习也是如此,没有捷径可走。梦想像《天龙八部》中虚竹一样被无崖子醍醐灌顶而轻松获得一甲子功力,是很不现实的。每天仰天大叫"天神啊,请赐给我一本葵花宝典吧",殊不知即使你获得了葵花宝典,除了受自宫其身之苦外,你也不一定成得了"东方不败",倒是成"西方失败"的几率高一点。
      
      "不走弯路,就是捷径",佛经说的不无道理。
      
      今天我们来谈谈如何学习Java
      
      1. JAVA学习路线
      
      1.1 基础语法及JAVA原理
      
      基础语法和JAVA原理是地基,地基不牢靠,犹如沙地上建摩天大厦,是相当危险的。学习JAVA也是如此,必须要有扎实的基础,你才能在J2EE、J2ME领域游刃有余。参加SCJP(SUN公司认证的JAVA程序员)考试不失为一个好方法,原因之一是为了对得起你交的1200大洋考试费,你会更努力学习,原因之二是SCJP考试能够让你把基础打得很牢靠,它要求你跟JDK一样熟悉JAVA基础知识;但是你千万不要认为考过了SCJP就有多了不起,就能够获得软件公司的青睐,就能够获取高薪,这样的想法也是很危险的。获得"真正"的SCJP只能证明你的基础还过得去,但离实际开发还有很长的一段路要走。
      
      1.2 OO思想的领悟
      
      掌握了基础语法和JAVA程序运行原理后,我们就可以用JAVA语言实现面向对象的思想了。面向对象,是一种方法学;是独立于语言之外的编程思想;是CBD基于组件开发的基础;属于强势技术之一。当以后因工作需要转到别的面向对象语言的时候,你会感到特别的熟悉亲切,学起来像喝凉水这么简单。
      
      使用面向对象的思想进行开发的基本过程是:
      
      ●调查收集需求。
      
      ●建立用例模型。
      
      ●从用例模型中识别分析类及类与类之间的静态动态关系,从而建立分析模型。
      
      ●细化分析模型到设计模型。
      
      ●用具体的技术去实现。
      
      ●测试、部署、总结。
      
      1.3 基本API的学习
      
      进行软件开发的时候,并不是什么功能都需要我们去实现,也就是经典名言所说的"不需要重新发明轮子"。我们可以利用现成的类、组件、框架来搭建我们的应用,如SUN公司编写好了众多类实现一些底层功能,以及我们下载过来的JAR文件中包含的类,我们可以调用类中的方法来完成某些功能或继承它。那么这些类中究竟提供了哪些方法给我们使用?方法的参数个数及类型是?类的构造器需不需要参数?总不可能SUN公司的工程师打国际长途甚至飘洋过海来告诉你他编写的类该如何使用吧。他们只能提供文档给我们查看,JAVA DOC文档(参考文献4.4)就是这样的文档,它可以说是程序员与程序员交流的文档。
      
      基本API指的是实现了一些底层功能的类,通用性较强的API,如字符串处理/输入输出等等。我们又把它成为类库。熟悉API的方法一是多查JAVA DOC文档(参考文献4.4),二是使用JBuilder/Eclipse等IDE的代码提示功能。
      
      1.4 特定API的学习
      
      JAVA介入的领域很广泛,不同的领域有不同的API,没有人熟悉所有的API,对一般人而言只是熟悉工作中要用到的API。如果你做界面开发,那么你需要学习Swing/AWT/SWT等API;如果你进行网络游戏开发,你需要深入了解网络API/多媒体API/2D3D等;如果你做WEB开发,就需要熟悉Servlet等API啦。总之,需要根据工作的需要或你的兴趣发展方向去选择学习特定的API。
      
      1.5 开发工具的用法
      
      在学习基础语法与基本的面向对象概念时,从锻炼语言熟练程度的角度考虑,我们推荐使用的工具是Editplus/JCreator+JDK,这时候不要急于上手JBuilder/Eclipse等集成开发环境,以免过于关注IDE的强大功能而分散对JAVA技术本身的注意力。过了这一阶段你就可以开始熟悉IDE了。
      
      程序员日常工作包括很多活动,编辑、编译及构建、调试、单元测试、版本控制、维持模型与代码同步、文档的更新等等,几乎每一项活动都有专门的工具,如果独立使用这些工具的话,你将会很痛苦,你需要在堆满工具的任务栏上不断的切换,效率很低下,也很容易出错。在JBuilder、Eclipse等IDE中已经自动集成编辑器、编译器、调试器、单元测试工具JUnit、自动构建工具ANT、版本控制工具CVS、DOC文档生成与更新等等,甚至可以把UML建模工具也集成进去,又提供了丰富的向导帮助生成框架代码,让我们的开发变得更轻松。应该说IDE发展的趋势就是集成软件开发中要用到的几乎所有工具。
      
      从开发效率的角度考虑,使用IDE是必经之路,也是从一个学生到一个职业程序员转变的里程碑。
      
      JAVA开发使用的IDE主要有Eclipse、JBuilder、JDeveloper、NetBeans等几种;而Eclipse、JBuilder占有的市场份额是最大的。JBuilder在近几年来一直是JAVA集成开发环境中的霸主,它是由备受程序员尊敬的Borland公司开发,在硝烟弥漫的JAVA IDE大战中,以其快速的版本更新击败IBM的Visual Age for JAVA等而成就一番伟业。IBM在Visual Age for JAVA上已经无利可图之下,干脆将之贡献给开源社区,成为Eclipse的前身,真所谓"柳暗花明又一村"。浴火重生的Eclipse以其开放式的插件扩展机制、免费开源获得广大程序员(包括几乎所有的骨灰级程序员)的青睐,极具发展潜力。
      
      1.6 学习软件工程
      
      对小型项目而言,你可能认为软件工程没太大的必要。随着项目的复杂性越来越高,软件工程的必要性才会体现出来。参见"软件开发学习路线"小节。
      
      2. 学习要点
      
      确立的学习路线之后,我们还需要总结一下JAVA的学习要点,这些要点在前文多多少少提到过,只是笔者觉得这些地方特别要注意才对它们进行汇总,不要嫌我婆婆妈妈啊。
      
      2.1勤查API文档
      
      当程序员编写好某些类,觉得很有成就感,想把它贡献给各位苦难的同行。这时候你要使用"javadoc"工具(包含在JDK中)生成标准的JAVA DOC文档,供同行使用。J2SE/J2EE/J2ME的DOC文档是程序员与程序员交流的工具,几乎人手一份,除了菜鸟之外。J2SE DOC文档官方下载地址:http://java.sun.com/j2se/1.5.0/download.jsp,你可以到google搜索CHM版本下载。也可以在线查看:http://java.sun.com/j2se/1.5.0/docs/api/index.html。
      
      对待DOC文档要像毛主席语录,早上起床念一遍,吃饭睡觉前念一遍。
      
      当需要某项功能的时候,你应该先查相应的DOC文档看看有没有现成的实现,有的话就不必劳神费心了直接用就可以了,找不到的时候才考虑自己实现。使用步骤一般如下:
      
      ●找特定的包,包一般根据功能组织。
      
      ●找需要使用类,类命名规范的话我们由类的名字可猜出一二。
      
      ●选择构造器,大多数使用类的方式是创建对象。
      
      ●选择你需要的方法。
      
      2.2 查书/google->写代码测试->查看源代码->请教别人
      
      当我们遇到问题的时候该如何解决?
      
      这时候不要急着问别人,太简单的问题,没经过思考的问题,别人会因此而瞧不起你。可以先找找书,到google中搜一下看看,绝大部分问题基本就解决了。而像"某些类/方法如何使用的问题",DOC文档就是答案。对某些知识点有疑惑是,写代码测试一下,会给你留下深刻的印象。而有的问题,你可能需要直接看API的源代码验证你的想法。万不得已才去请教别人。
      
      2.3学习开源软件的设计思想
      
      JAVA领域有许多源代码开放的工具、组件、框架,JUnit、ANT、Tomcat、Struts、Spring、Jive论坛、PetStore宠物店等等多如牛毛。这些可是前辈给我们留下的瑰宝呀。入宝山而空手归,你心甘吗?对这些工具、框架进行分析,领会其中的设计思想,有朝一日说不定你也能写一个XXX框架什么的,风光一把。分析开源软件其实是你提高技术、提高实战能力的便捷方法。
      
      2.4 规范的重要性
      
      没有规矩,不成方圆。这里的规范有两层含义。第一层含义是技术规范,多到http://www.jcp.org下载JSRXXX规范,多读规范,这是最权威准确最新的教材。第二层含义是编程规范,如果你使用了大量的独特算法,富有个性的变量及方法的命名方式;同时,没给程序作注释,以显示你的编程功底是多么的深厚。这样的代码别人看起来像天书,要理解谈何容易,更不用说维护了,必然会被无情地扫入垃圾堆。JAVA编码规范到此查看或下载http://java.sun.com/docs/codeconv/,中文的也有,啊,还要问我在哪,请参考3.2.2节。
      
      2.5 不局限于JAVA
      
      很不幸,很幸运,要学习的东西还有很多。不幸的是因为要学的东西太多且多变,没时间陪老婆家人或女朋友,导致身心疲惫,严重者甚至导致抑郁症。幸运的是别人要抢你饭碗绝非易事,他们或她们需要付出很多才能达成心愿。
      
      JAVA不要孤立地去学习,需要综合学习数据结构、OOP、软件工程、UML、网络编程、数据库技术等知识,用横向纵

  • 汶川

    2008-05-22 14:25:22

  • 10款常用的JAVA测试工具

    2008-05-22 11:50:47

    发布时间: 2007-11-09 13:45    作者: 未知    来源: 网络转载

    字体      | 上一篇 下一篇 | 打印  | 我要投稿

    1. 美国Segue公司的Silk系列产品
        Segue
    公司一直专注于软件质量优化领域。在Segue的产品套件中,拥有业内最强劲且最容易使用的、用于企业应用测试、调优和监测的自动化工具,能够帮助用户保障应用在其生命周期内的可靠性和性能。

    (1) SilkPerformer——
    企业级性能测试工具
    u
    企业级自动化测试工具能够支持多种系统,如Java.NetWirelessCOMCORBAOracleCitrixMetaFrame、客户机/服务器、以及各种ERP/CRM应用
    u
    多项专利技术精确模拟各种复杂的企业环境
    u
    可视化脚本记录功能及自定义工具简化了测试创建工作
    u SilkPerformer
    Java/.NET浏览器以及JUnit/NUnit测试输入功能简化了对并发访问情况下远程应用组件的早期负载测试工作
    u
    方便易用,工作流向导会逐步引导用户完成整个测试流程 

    (2) Silk
    Test International——业内唯一的Unicode功能测试工具
    u SilkBean 充分利用 Java 语言的编写一次,随处使用的优点,让用户不必修改现有的脚本而能够在多种基于 Unix 的系统上运行
    u
    能够识别多种开发平台,如JavaJavascrīptHTMLActiveXVisual Basic C/C++
    u
    一套脚本可供所有支持的语言使用
    u
    内置的错误恢复系统不仅具有自定义功能,可进行无人看守的自动测试
    赛格瑞(Segue)公司是全球范围内专注于软件质量优化解决方案的领导者。2005年,赛格瑞(Segue)公司在中国设立了专门的销售服务公司,因此,赛格瑞(Segue)公司的软件测试产品在中国有了更好的技术支持。
    参考网站:http://www.segue.com.cn/
    推荐指数:★★★★★

    2. MaxQ
        MaxQ
    是一个免费的功能测试工具。它包括一个HTTP代理工具,可以录制测试脚本,并提供回放测试过程的命令行工具。测试结果的统计图表类似于一些较昂贵的商用测试工具MaxQ希望能够提供一些关键的功能,比如HTTP测试录制回放功能,并支持脚本。
    参考网站:http://maxq.tigris.org/
    推荐指数:★★★☆☆

    3. Httpunit
        HttpUnit
    是一个开源测试工具,是基于JUnit的一个测试框架,主要关注于测试Web应用,解决使用JUnit框架无法对远程Web内容进行测试的弊端。
        HttpUnit
    提供的帮助类让测试者可以通过Java类和服务器进行交互,并且将服务器端的响应当作文本或者DOM对象进行处理。HttpUnit还提供了一个模拟Servlet容器,让测试者不需要发布Servlet,就可以对Servlet的内部代码进行测试。本文中作者将详细的介绍如何使用HttpUnit提供的类完成集成测试。
    参考网站:http://www.httpunit.org/
    推荐指数:★★★☆☆

    4. Junit
       
    是通用的测试 java 程序的测试框架JUnit可以对Java代码进行白盒测试。通过JUnitk可以用mock objects进行隔离测试;用Cactus进行容器内测试;用AntMaven进行自动构建;在Eclipse内进行测试;对Java应用程序、FilterServletEJBJSP数据库应用程序、Taglib等进行单元测试
    参考网站:http://www.junit.org/
    推荐指数:★★★★★

    5. Jtest
        Jtest
    Parasoft公司推出的一款针对java语言的自动化白盒测试工具,它通过自动实现java的单元测试和代码标准校验,来提高代码的可靠性。Jtest先分析每个java类,然后自动生成junit测试用例并执行用例,从而实现代码的最大覆盖,并将代码运行时未处理的异常暴露出来;另外,它还可以检查以DbCDesign by Contract)规范开发的代码的正确性。用户还可以通过扩展测试用例的自动生成器来添加更多的junit用例。Jtest还能按照现有的超过350个编码标准来检查并自动纠正大多数常见的编码规则上的偏差,用户可自定义这些标准,通过简单的几个点击,就能预防类似于未处理异常、函数错误、内存泄漏、性能问题、安全隐患这样的代码问题。
        JTest
    最大的优势在于静态代码分析,至于自动生成测试代码,当然生成测试代码框架也是不错的,但要做好单元测试用户还要做大量的工作。
    参考网站:http://www.parasoft.com/jsp/aep/aep.jsp
    推荐指数:★★★★☆

    6. Hansel
        Hansel
    是一个测试覆盖率的工具——与用于单元测试的 JUnit framework 相集成,很容易检查单元测试套件的覆盖情况。
    参考网站:http://hansel.sourceforge.net/
    推荐指数:★★☆☆☆

    7. Cactus
        Cactus
    是一个基于JUnit框架的简单测试框架,用来单元测试服务Java代码。Cactus框架的主要目标是能够单元测试服务端的使用Servlet对象的Java方法如HttpServletRequest,HttpServletResponse,HttpSession
       
    针对外部可测试组件运行时,需要把JUnit测试运行为发送HTTP请求给组件的客户端进程。为了在服务器容器内部运行JUnit测试,可以用Cactus框架,它是一个免费的开源框架,是Apache Jakarta项目的一部分。Cactus 包含了关于JUnit客户端如何连接到服务器,然后使测试运行的详细信息。
    参考网站:http://jakarta.apache.org/cactus/
    推荐指数:★★★★☆

    8. JFCUnit
        JFCUnit
    使得你能够为Java偏移应用程序编写测试例子。它为从用代码打开的窗口上获得句柄提供了支持;为在一个部件层次定位部件提供支持;为在部件中发起事件(例如按一个按钮)以及以线程安全方式处理部件测试提供支持。
    参考网站:http://jfcunit.sourceforge.net/
    推荐指数:★★★☆☆

    9. StrutsTestCase
        StrutsTestCase
    STC)框架是一个开源框架,用来测试基于 Struts Web 应用程序。这个框架允许您在以下方面进行测试:
    u
    ActionForm 类中的验证逻辑(validate() 方法)
    u
    Action 类中的业务逻辑(execute() 方法)
    u
    动作转发(Action Forwards)。
    u
    转发 JSP
    STC
    支持两种测试类型:
    u Mock
    方法 —— 在这种方法中,通过模拟容器提供的对象(HttpServletRequest HttpServletResponse ServletContext),STC 不用把应用程序部署在应用服务器中,就可以对其进行测试。
    u Cactus
    方法 —— 这种方法用于集成测试阶段,在这种方法中,应用程序要部署在容器中,所以可以像运行其他 JUnit 测试用例那样运行测试用例。
    参考网站:http:// strutstestcase.sourceforge.net/
    推荐指数:★★★★☆

    10. TestNG
        TestNG
    是根据 查看(869) 评论(0) 收藏 分享 管理

  • 软件测试工具速查手册

    2008-05-22 11:49:23

    1、 从测试功能上分
    1单元测试
    针对不同语言,如JUNIT
    2) 功级测试

    E—Test
    :功能强大,由于不是采用POST URL的方式回放脚本,所以可以支持多内码的测试数据(当然要程序支持),基本上可以应付大部分的WEB SITE
    MI
    公司的WINRUNNER
    COMPUWARE
    QARUN
    RATIONAL
    SQA ROBOT
    3
    压力测试
    MI
    公司的WINLOAD
    COMPUWARE
    QALOAD
    RATIONAL
    SQA LOAD
    4) 负载测试

    LOADRUNNER
    RATIONAL VISUAL QUANTIFY
    5 WEB测试工具
    MI
    公司的ASTRA系列
    RSW
    公司的E—TEST SUITE
    6 WEB系统测试工具
    WORKBENCH
    WEB APPLICATION STRESS TOOL
    WAS
    7数据库测试工具
    TESTBYTES
    8) 回归测试工具
    RATIONAL TEAM TEST
    WINRUNNER
    9嵌入式测试工具
    ATTOLTESTWARE
    。是ATTOLTESTWARE公司的自动生成测试代码软件测试工具,特别适用于嵌入式实时应用软件单元和通信系统测试。
    CODETEST
    AppliedMicrosystemsCorp.公司的产品,是广泛应用的嵌入式软件在线测试工具。
    GammaRay
    GammaRay系列产品主要包括软件逻辑分析GammaProfiler、可靠性评测工具GammaRET等。
    LogiScope
    TeleLogic公司的工具套件,用于代码分析、软件测试、覆盖测试。
    LynxInsure++
    LynxREAL-TIMESYSTEMS公司的产品,基于LynxOS的应用代码检测与分析测试工具。
    MessageMaster
    ElviorLtd.公司的产品,测试嵌入式软件系统工具,向环境提供基于消息的接口。
    VectorCast
    VectorSoftware.Inc公司的产品。由6个集成的部件组成,自动生成测试代码,为主机和嵌入式环境构造可执行的测试架构。
    10) 系统性能测试工具
    Rational Performance
    11) 页面链接测试
    Link Sleuth
    12) 测试流程管理工具
    Test Plan Control
    13) 测试管理工具
    TestDirector
    Rational
    公司的Test Manager
    Compuware
    公司的
    QADirector
    TestExpert
    :是Silicon Valley Networks公司产品的测试管理工具,能管理整个测试过程,从测试计划、测试例程、测试执行到测试报告。

    14) 缺陷跟踪工具
    TrackRecord

    15) 其他测试工具包
    TestVectorGenerationSystem
    T—VECTechnologies公司的产品。提供自动模型分析、测试生成、测试覆盖分析和测试执行的完整工具包,具有方便的用户接口和完备的文档支持。
    TestQuestPro
    TestQuest公司的非插入码式的自动操纵测试工具,提供一种高效的自动检测目标系统,获取其输出性能的测试方法
    TestWorks
    SoftwareResearch.Inc公司的一整套软件测试工具,既可单独使用,也可捆绑销售使用。

    2 从测试的方法上分:
    1 白盒测试工具
    白盒测试工主要有:NumegaPuRe、软件纠错工具(Rational Purify)。
    内存资源泄漏检查:
    Numega
    中的BounceChecher
    Rational
    Purify
    代码覆盖率检查:
    Numega
    TrueCoverage
    Rational
    PureCoverage
    TeleLogic
    公司的LogiScope
    Macabe
    公司的Macabe
    代码性能检查:
    Numega
    TrueTime
    Rational
    Quantify
    代码静态度量分析度量检查工具:LogiScopeMacabe
    黑盒测试工具主要有:QACenterSQATeamTestRational Visual Visual Test
    QACenter
    QACenter帮助所有测试人员创建一个快速、可重用的测试过程。这些测试工具自动帮助管理测试过程、快速分析和调试程序,包括针对回归、强度、单元、并发、集成、移植,容量和负载建立测试用例,自动执行测试和产生文档结果。QACenter主要包括以下几个模块:
    QARun
    :应用的功能测试工具。
    QALoad
    :强负载下应用的性能测试工具。
    QADirector
    :测试的组织设计和创建以及管理工具。
    TrackRecord
    :集成的缺陷跟踪管理工具。
    EcoTools
    :高层次的性能监测工具。


    3
    、部分具体测试工具的介绍
    1)、性能优化工具EcoScope
    EcoScope
    是一套定位于应用(即服务提供者本身)及其所依赖的所有网络计算资源的解决方案。EcoScope可以提供应用视图,并标出应用是如何与基础架构相关联的。这种视图是其他网络管理工具所不能提供的。EcoScope能解决在大型企业复杂环境下分析与测量应用性能的难题。通过提供应用的性能级别及其支撑架构的信息,EcoScope能帮助IT部门就如何提高应用性能提出多方面的决策方案。
    EcoScope
    的应用主要表现在以下几个方面:
    确保成功部署新应用
    维护性能的服务水平
    加速问题检测与纠正的高级功能
    定制视图有助于高效地分析数据
    2)、数据库测试数据自动生成工具——TestBytes
    在数据库开发的过程中,为了测试应用程序对数据库的访问,应当在数据库中生成测试用例数据,我们可能会发现当数据库中只有少量数据时,程序可能没有问题,但是当真正投入到运用中产生了大量数据时就出现问题了,这往往是因为程序的编写没有达到,所以一定及早地通过在数据库中生成大量数据来帮助开发人员完善这部分功能和性能。
    TestBytes
    是一个用于自动生成测试数据的强大易用的工具,通过简单的点击式操作,就可以确定需要生成的数据类型(包括特殊字符的定制),并通过与数据库的连接来自动生成数百万行正确的测试数据,可以极大地提高数据库开发人员、QA测试人员、数据仓库开发人员、应用开发人员的工作效率。
    3)、PC—LINT
    PC—LINT
    主要进行更严格的语法检查功能,还完成相当程度的语义检查功能。可以这样认为:PC—LINT是一个更加智能、更加严格的编译器。PC—LINT在实现语法和某些语义规则检查时,是通过参数配置完成的,它的选项就有数百个之多,因此,在使用PC—LINT过程中,了解选项的含义也很重要。
    4)、TCL
    TCL
    Tool Command Language的缩写,它是一种很流行的脚本解释器,尤其在测试领域,它的最大特点是可移植性好,接口简单,方便,可以很容易地嵌入到软件中,作为自己的解释器使用。
    TCL
    提供两种接口:编程接口和用户接口。编程接口是通过LIBDLL形式提供的,提供了一些函数(命令)供调用,包括:分配一个解释器指针(对象);初始化解释器(指针);注册扩展函数等。用户接口很简单,即编写的脚本,脚本里面包含对扩展命令的调用。
    5VB测试工具:VB Watch
    6Java 程序的测试工具
    1
    Bean—Test
    2
    EJBQuickTest
    3
    JStyle
    4
    JTest
    5
    HttpUnit
    6
    JUnit
    7)、覆盖测试
    C—Cover
    C—Cover
    是一个测试工具软件,用来找出没有被测到的代码,并报告测试的覆盖率。C—Cover
    只支持C/C++的代码覆盖率分析,其它语言不支持。但不受OS的限制

    单元测试方面:(对开发人员比较有用) J-Unit工具。
     
    功能测试方面:E-test是个不错的选择,功能很强大,由于不是采用Post URL的方式回放脚本,所以可以支持多内码的测试数据(当然要程序支持)。基本上可以应付大部分的Web Site
     
    如果只是利用脚本回放代替手工劳动,或者做对页面响应数的性能测试,Microsoft Web Application Stress Tool是个不错的选择。
      
    另外,在性能测试方面,PureLoad也是一个不错的工具,完全用Java写成,可以测试各种C/S程序,如SMTP Server等。这两个工具都是使用Post URL的方法测试Web Application的。对大量使用Javascrīpt的页面不太适合。当然,如果程序在Unixlinux下面运行的话,可以直接编写Shell 脚本程序,更加方便。
     
    另外,还有很多专门的工具,比如说Linkbot是专门作页面链接测试的。
     
    另外,测试流程管理工具也有不少,个人用过也一直在用的是Test Plan Control,短小精悍,不错。   至于WinRunnerLoadRunner之类,因为没有License,所以都没怎么用过,惭愧。不过我看过一篇英国人评价英国测试市场上最流行的五个软件的文章。WinRunner得分最高。
     
    测试工具从测试的方法上可以分为两种:白盒测试和黑盒测试   白盒测试工具主要有:
     
    内存资源泄漏检查:Numega中的bouncechecker,RationalPurify
      
    代码覆盖率检查:Numega中的truecoverage,RationalPurecoverageTelelogic公司的 logiscope, Macabe公司的Macabe   代码性能检查:Numega中的truetime,RationalQuantify
     
    代码静态度量分析质量检查工具:logiscopeMacabe
     
    黑盒测试工具主要有:   客户端功能测试:MI公司的winrunner,compuwareqarun,RationalSQA robot等等
     
    服务器端压力性能测试: MI公司的winload,compuwareqaload,RationalSQA load等等
      Web
    测试工具:MI公司的Astra系列,rsw公司的e-test suite等等
     
    测试管理工具:rationaltest manager,compuwareqadirector等等,此外还有缺陷跟踪工具 trackrecord等。
     
    数据库测试工具:TestBytes
     
    黑盒测试工具:QACenterSQATeamTestRational Viaual Test
     
    回归测试工具:Rational TeamTestWinRunnerMI公司)
      WEB
    系统测试工具:TESTWorkberchWeb Appication Stress ToolWAS
     
    白盒测试工具:Numega PuRe、软件纠错工具(Rational Purity)。
     
    嵌入式测试工具:Logiscope(静态测试工具)、CodeTest
     
    系统负荷测试工具:RationalPerformance
     
    涵盖测试工具范围评估工具
     
    软件性能测试工具:LoadRunnerMI产品)、Rational Visual Qantify
     
    测试管理工具:TestDirectorMI产品支持整个生命周期中测试流程管理)

     

    测试基于Web的应用程序
    测试web应用程序和测试桌面系统用很多共同点:例如你需要和执行所有标准测试类型一样测试常见的功能点,配置及兼容性。但是由于与应用程序交互的所有分布式系统组件的复杂性成倍的增加的原因,导致web应用程序测试更加的困难。当我们在web环境中看到一个错误时,通常很难指出错误发生的地方,并且由于我们看到的行为或我们接受到的错误信息可能是发生在Web系统中不同部分的错误的结果。错误可能是很难重现的。那么我们如何在web系统中分析错误呢,并且为了重现那些错误又应该做哪些考虑呢?
    当我们对潜在的技术有一个了解时,我们可以更好的最大化测试效率-编写更多可重现的bug报告并且在较少的时间里发现更多的错误。说比做更加容易-特别是在web环境里。Web环境在错误倾向技术变量是密度高的。以下是测试Web应用程序的需要考虑的5个基本事项:
    1
    当我们在客户端看到一个错误时,我们所看到的是错误的症状,而不是错误本身。
    2
    错误可能是与环境相关的,并且可能不出现在不同的环境里
    3
    错误可能是存在代码或是配置中的
    4
    错误可能驻留在几个层中的任一个层中
    5
    检查操作系统中的两个类别-静态vs动态-需要不同的方法。
    现在让我们来详细的看看这5个需要考虑的事项。
     
    1.    
    什么是我们真正看到的东西?是一个错误还是一个症状?
    如果不诊断环境,我们不能够确定是什么导致了一个症状出现。如果客户端和服务器端的一个环境特定的变量被移除或被改变的话,我们或许将不能够重现问题。
    查看(474) 评论(1) 收藏 分享 管理

  • 提高网页打开速度的一些小窍门(转)

    2008-05-20 14:34:13

    互联网带宽越来越宽,似乎让网页的加载速度得到了质的飞跃。其实不然,因为随着带宽的提高,网页上的对象也越来越多,因此加快网页打开速度还是一个重要的课题。加快网页的打开速度,有三个路径,一是提高网络带宽,二是用户在本机做优化,三是网站设计者对网页做一定的优化。这篇文章站在一个网站设计者的角度,分享一些优化网页加载速度的小技巧。

    一、优化图片

    几乎没有哪个网页上是没有图片的。如果你经历过56K猫的年代,你一定不会很喜欢有大量图片的网站。因为加载那样一个网页会花费大量的时间。

    即使在现在,网络带宽有了很多的提高,56K猫逐渐淡出,优化图片以加快网页速度还是很有必要的。

    优化图片包括减少图片数、降低图像质量、使用恰当的格式。

    1、减少图片数:去除不必要的图片。

    2、降低图像质量:如果不是很必要,尝试降低图像的质量,尤其是jpg格式,降低5%的质量看起来变化不是很大,但文件大小的变化是比较大的。

    3、使用恰当的格式:请参阅下一点。

    因此,在上传图片之前,你需要对图片进行编辑,如果你觉得photoshop太麻烦,可以试试一些在线图片编辑工具。懒得编辑而又想图片有特殊的效果?可以试试用过调用javascrīpt来实现图片特效。

    二、图像格式的选择

    一般在网页上使用的图片格式有三种,jpg、png、gif。三种格式的具体技术指标不是这篇文章探讨的内容,我们只需要知道在什么时候应该使用什么格式,以减少网页的加载时间。

    1、JPG:一般用于展示风景、人物、艺术照的摄影作品。有时也用在电脑截屏上。

    2、GIF:提供的颜色较少,可用在一些对颜色要求不高的地方,比如网站logo、按钮、表情等等。当然,gif的一个重要的应用是动画图片。就像用Lunapic制作的倒映图片。

    3、PNG:PNG格式能提供透明背景,是一种专为网页展示而发明的图片格式。一般用于需要背景透明显示或对图像质量要求较高的网页上。

    三、优化CSS

    CSS叠层样式表让网页加载起来更高效,浏览体验也得到提高。有了CSS,表格布局的方式可以退休了。

    但有时我们在写CSS的时候会使用了一些比较罗嗦的语句,比如这句:


    margin-top: 10px;
    margin-right: 20px;
    margin-bottom: 10px;
    margin-left: 20px;


    你可以将它简化为:


    margin: 10px 20px 10px 20px;


    又或者这句:


    <p class="decorated">A paragraph of decorated text </p>
    <p class="decorated">Second paragraph </p>
    <p class="decorated">Third paragraph </p>
    <p class="decorated">Forth paragraph </p>


    可以用div来包含:


    <div class="decorated">
    <p>A paragraph of decorated text </p>
    <p>Second paragraph </p>
    <p>Third paragraph </p>
    <p>Forth paragraph </p>
    </div>


    简化CSS能去除冗余的属性,提高运行效率。如果你写好CSS后懒得去做简化,你可以使用一些在线的简化CSS工具,比如CleanCSS。

    四、网址后加斜杠

    有些网址,比如"www.kenengba.com/220",当服务器收到这样一个地址请求的时候,它需要花费时间去确定这个地址的文件类型。如果220是一个目录,不妨在网址后多加一个斜杠,让其变成www.kenengba.com/220/,这样服务器就能一目了然地知道要访问该目录下的index或default文件,从而节省了加载时间。

    五、标明高度和宽度

    这点很重要,但很多人由于懒惰或其它原因,总是将其忽视。当你在网页上添加图片或表格时,你应该指定它们的高度和宽度,也就是height和width参数。如果浏览器没有找到这两个参数,它需要一边下载图片一边计算大小,如果图片很多,浏览器需要不断地调整页面。这不但影响速度,也影响浏览体验。

    下面是一个比较友好的图片代码:


    <img id="moon" height="200" width="450" src="http://www.kenengba.com/moon.png" alt="moon image" />


    当浏览器知道了高度和宽度参数后,即使图片暂时无法显示,页面上也会腾出图片的空位,然后继续加载后面的内容。从而加载时间快了,浏览体验也更好了。

    六、减少http请求

    当浏览者打开某个网页,浏览器会发出很多对象请求(图像、脚本等等),视乎网络延时情况,每个对象加载都会有所延迟。如果网页上对象很多,这可以需要花费大量的时间。

    因此,要为http请求减负。如何减负?

    1、去除一些不必要的对象。

    2、将临近的两张图片合成一张。

    3、合并CSS

    看看下面这段代码,需要加载三个CSS:


    <link rel="stylesheet" type="text/css" href="/body.css" />
    <link rel="stylesheet" type="text/css" href="/side.css" />
    <link rel="stylesheet" type="text/css" href="/footer.css" />


    我们可以将其合成一个:


    <link rel="stylesheet" type="text/css" href="/style.css" />


    从而减少http请求。

    七、其它小技巧(译者添加)

    1、去除不必要加载项。

    2、如果在网页上嵌入了其它网站的widget,如果有选择余地,一定要选择速度快的。

    3、尽量用图片代替flash,这对SEO也有好处。

    4、有些内容可以静态化就将其静态化,以减少服务器的负担。

    5、统计代码放在页尾。
  • 全国哀悼日; 我有一个强大的祖国(转)

    2008-05-19 14:16:33

    国务院公告

    为表达全国各族人民对四川汶川大地震遇难同胞的深切哀悼,国务院决定,2008年5月19日至21日为全国哀悼日。在此期间,全国和各驻外机构下半旗志哀,停止公共娱乐活动,外交部和我国驻外使领馆设立吊唁簿。5月19日14时28分起,全国人民默哀3分钟,届时汽车、火车、舰船鸣笛,防空警报鸣响。
     
     

     
     
    我有一个强大的祖国
     
    作者/叶浪

     

      那是一张熟悉的脸

      是我痛失亲人后看到的最真切的笑脸

      眼里闪着泪花

      话里充满着力量

      那一刻

      我感到自己有一个强大的祖国

      那是一张陌生的脸

      是我埋在瓦砾下看见的最勇敢的脸

      撬开了残垣

      搬走了巨石

      那一刻

      我感到自己有一个强大的祖国

      那是一张美丽的脸

      是我躺在病床上看见的天使的脸

      包扎我的创伤

      驱走我的恐惧

      那一刻,

      我感到自己有一个强大的祖国

      那是一张慈祥的脸

      是我奔离教室前看过的最镇静的脸

      为了自己的学生

      成就了自己的永恒

      那一刻

      我感到自己有一个强大的祖国

      那是一张年轻的脸

      是我在排队长列里看到的最急切的脸

      为了灾区的伤员

      献出了自己的殷殷鲜血

      那一刻

      我感到自己有一个强大的祖国

      那是一张忙碌的脸

      是我在救灾一线上看到的最疲惫的脸

      眼里布满血丝

      来不及顾及自己的家人

      那一刻

      我感到有一个强大的祖国

      那是世上最可爱的脸

      是家乡地震后不曾面见过的男男女女的脸

      虽远在他乡海外

      温暖的目光却紧紧地落在了我的身上

      那一刻

      我感到自己有一个强大的祖国

      地动天不塌

      大灾有大爱

      我感到自己有一个强大的祖国

      2008年5月14日作于成都市抗震救灾指挥部

      □作者简介

      叶浪,成都市某局副局长。在成都市抗震救灾指挥部值班期间,眼见全民一心抢灾救灾感人场面,多次泪湿双眼。他利用工作间隙,在手机上写下真实感受。“在抗灾这几天,我最强烈最真实的感觉,正是这首词的题目,我相信,在强大祖国的支持下,我们全民一心,众志成城,一定能够战胜灾难!”叶浪说。



622/4<1234>
Open Toolbar