收集天下好文,各位朋友尽情发言。

发布新日志

  • 学好性能测试需要搞懂的问题

    2011-04-22 15:49:59

  • javascript中javascript:void(0) 的意思

    2011-01-12 10:28:58

  • Asp - SQL注入防范方法[最终篇]

    2011-01-09 23:46:40

  • Asp - SQL注入原理及防范[高级篇]

    2011-01-09 23:45:48

  • Asp - SQL注入原理及防范[中级篇]

    2011-01-09 23:45:00

  • Asp - SQL注入原理及防范[入门篇]

    2011-01-09 23:44:06

  • SQL注入原理详细分析

    2011-01-09 23:42:16

  • 关于oracle 去掉重复数据问题

    2011-01-07 11:27:55

  • Ivy与Ant的基本介绍(4)

    2010-11-18 12:37:33

    Ivy与Ant的基本介绍(4)
    2009-02-03 14:30
    前面的几篇文章,主要想介绍一些ivy的东西,但是一说ant,就啰嗦了那么多。一直没有进入正题,现在就开始吧。关于ivy和maven的区别和优缺点就不多说了,可以上网上查看一些。如果对maven感兴趣,可以看一下前面有关maven的博客

    首先,下载ivy,下载地址为:http://ant.apache.org/ivy/download.cgi 我现在的版本是2.0。然后将ivy-2.0.0.jar拷贝到ANT_HOME的lib目录下。我的lib目录为:C:\apache-ant-1.7.1\lib

    例子1:jar包版本控制以及拷贝到lib目录
    >> build.xm文件
    <?xml version="1.0"?>
    <project name="antwebproject" default="run" xmlns:ivy="antlib:org.apache.ivy.ant" basedir="e:/antTemp">
        <property name="lib.dir" value="lib" />
        <property name="build.dir" value="build" />
        <property name="src.dir" value="src" />

        <target name="resolve" description="--> retreive dependencies with ivy">
            <ivy:retrieve/>
        </target>
     

        <target name="run" depends="resolve" description="--> compile and run the project">
            <mkdir dir="${build.dir}" />
        </target>
    </project>


    >> 建立ivy.xml文件,将其放到 e:/antTemp 下面,因为在build.xml中,设置了basedir="e:/antTemp",不然这个文件和build.xml是在同一个目录的
    <ivy-module version="2.0">
        <info rganisation="org.apache" module="hello-ivy"/>
        <dependencies>
            <dependency rg="commons-lang" name="commons-lang" rev="2.0"/>
            <dependency rg="commons-cli" name="commons-cli" rev="1.0"/>
        </dependencies>
    </ivy-module>


    在控制台执行ant 命令后,执行截图如下:

    查看 E:\antTemp\lib 目录,下面有根据ivy.xml下载的jar包文件,如图:

    更多的文章可以参考\apache-ivy-2.0.0\doc 下面的index.html的帮助文档,里面主要有下面的内容
    1 如何单独运行 ivy
    2 ant的任务中如何使用ivy。主要是如何在build.xml中编写ivy的一些属性,介绍各个属性的用法
    3 ivy.xml文件的配置说明
    4 设置文件ivysettings.xml的配置说明
  • Ivy与Ant的基本介绍(3)

    2010-11-18 12:37:02

    Ivy与Ant的基本介绍(3)
    2009-02-02 17:21
    4. 使用Ant的war任务打包J2EE Web项目
    建立一个J2EE Web工程,其目录结构如下图所示:
    其中src 为源代码目录,WebRoot为各jsp存放目录,lib为工程的包目录。在antwebproject工程目录下建立了build.xml文件,该文件 为该工程的Ant构件文件。读者可以src目录下放入在前续例子中开发的HelloWorld.java文件,并在WebRoot下建立 index.jsp文件,其内容很简单,就是输出Hello信息,代码如下所示:
    <%@ page language="java" contentType="text/html; charset="UTF-8" pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
        
    <head>
           
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
           
    <title>ant打包测试</title>
        
    </head>
        
    <body>
            Hello,Ant
        
    </body>
    </html>


    接下来编写build.xml文件,其内容如下:
    <?xml version="1.0"?>
    <project name="antwebproject"   default="war" basedir=".">
    <property name="classes" value="build/classes"/>
        
    <property name="build" value="build"/>
        
    <property name="lib" value="WebRoot/WEB-INF/lib"/>
        
    <!-- 删除build路径-->
        
    <target name="clean">
           
    <delete dir="build"/>
        
    </target>

        
    <!-- 建立build/classes路径,并编译class文件到build/classes路径下-->
        
    <target name="compile" depends="clean">
           
    <mkdir dir="${classes}"/>

           
    <javac srcdir="src" destdir="${classes}"/>
        
    </target>

        
    <!-- war-->
        
    <target name="war" depends="compile">
    <war destfile="${build}/antwebproject.war" webxml="WebRoot/WEB-INF/web.xml">
               
    <!-- 拷贝WebRoot下除了WEB-INFMETA-INF的两个文件夹-->
        
    <fileset dir="WebRoot" includes="**/*.jsp"/>

               
    <!-- 拷贝lib目录下的jar-->
               
    <lib dir="${lib}"/>
               
    <!-- 拷贝build/classes下的class文件-->
               
    <classes dir="${classes}"/>
           
    </war>
        
    </target>
    </project>

    各target的作用在内容中已经进行说明,在此不再赘述。运行该build文件,更新目录后,可看到在build目录下生成了antwebproject.war文件,如图:

    解开后可看到其目录结构如下:
    --META-INF
         --MANIFEST.MF
    --index.jsp
    --WEB-INF
         --lib
                --log4j-1.2.9.jar
         --classes
                --HelloWorld.class
         --web.xml
         读者可以将该war包拷贝到Tomcat的目录下看一下运行结果。

    五.总结
    在 本文中,笔者由浅至深详细描述了Ant的安装与配置、关键元素和常用任务。并通过实例讲述了Ant在我们Java项目中的应用,讲述了编译、运行java 程序,以及打jar包、war包等知识,引领读者进入Ant的奇妙世界。在本文中可以看到,Ant在自动构建和部署Java程序方面方便易用,而且非常灵 活,不失为我们Java开发者的绝佳帮手。

    原文地址:http://tech.it168.com/j/2007-11-09/200711091344781.shtml

    --------------------------- 其它Ant知识摘录(下面的文字没有亲自测试过) ----------------------------------
    ant中执行Junit测试
    首先要确保正确的ant和junit测试环境。
    下面看个简单的例子:
    <target name="compile">
                <mkdir dir="${basedir}/build/tool/classes" />
                <javac destdir="${basedir}/build/tool/classes" includes="**/*.java" debug="${compile.debug}"   encoding="UTF-8">
                    <src path="${basedir}/tool/performancetest/src" />
                    <classpath refid="test.classpath" />
                </javac>
                <copy todir="${basedir}/build/tool/classes" verwrite="yes">
                    <fileset dir="${basedir}/tool/performancetest/src">
                        <include name="**/*.xml" />
                    </fileset>
                </copy>
    </target>

        <target name="test" depends="compile">
            <junit printsummary="on" fork="yes" >
                <formatter type="brief" usefile="false"/>
                <test name="com.zozoc.AllPerformanceTests"/>
                <classpath>
                    <pathelement location="${basedir}/build/tool/classes"/>
                    <path refid="test.classpath" />
                </classpath>
            </junit>
        </target>

    用Ant完成生成javadoc的任务
    用ant生成javadoc相当简单,命令如下:
    <target name="create_doc">
    <!-- destdir是javadoc生成的目录位置 -->
    <javadoc destdir="${distDir}" encoding="UTF-8" docencoding="UTF-8">
       <!-- dir是你的代码位置,记住是java文件的位置而不是class文件的位置哦,第一次用这个命令容易忽略这点 -->
       <packageset dir="${srcDir}">
        <!-- exclude是不想生成哪些类的javadoc -->
        <exclude name="${excludeClasses}" />
       </packageset>
    </javadoc>
    </target>

    ant条件判断
    [ 2008/06/17 15:48 | by followme ]
    大 | 中 | 小 
    前段时间写Ant的时候用到了条件判读condition,找了一堆资料,现总结如下:
    1、istrue isfalse:断言真假
    <project name="testCondition">
        <target name="test">
            <condition property="scondition">
                <istrue value="true"/>                   
            </condition>
            <antcall target="isTrue"></antcall>
            <antcall target="isFalse"></antcall>       
        </target>
        <target name="isTrue" if="scondition">
            <echo>is ture</echo>
        </target>
        <target name="isFalse" unless="scondition">
            <echo>is false</echo>
        </target>
    </project>

    2、逻辑运算
    2.1、not 逻辑非 
    <project name="testCondition">
        <target name="test">
            <condition property="scondition">
                <not>
                    <istrue value="true"/>                   
                </not>
            </condition>
            <antcall target="isTrue"></antcall>
            <antcall target="isFalse"></antcall>       
        </target>
        <target name="isTrue" if="scondition">
            <echo>is ture</echo>
        </target>
        <target name="isFalse" unless="scondition">
            <echo>is false</echo>
        </target>
    </project>
    2.2、and 逻辑与
    <project name="testCondition">
        <target name="test">
            <condition property="scondition">
                <and>
                    <istrue value="true"/>
                    <istrue value="false"/>                   
                </and>
            </condition>
            <antcall target="isTrue"></antcall>
            <antcall target="isFalse"></antcall>       
        </target>
        <target name="isTrue" if="scondition">
            <echo>is ture</echo>
        </target>
        <target name="isFalse" unless="scondition">
            <echo>is false</echo>
        </target>
    </project>
    2.3、or 逻辑或 xor异或 (语法上与and类似)

    3、available 是否可用
    <project name="testCondition">
        <path id="all.test.classes">        
             <pathelement location="bin"/>
         </path>
        <target name="test">
            <condition property="scondition">
                <!--在指定的classpath路径下是否存在资源 TestTest.class-->
                <available resource="TestTest.class">
                    <classpath refid="all.test.classes" />       
                </available>
            </condition>
            <antcall target="isTrue"></antcall>
            <antcall target="isFalse"></antcall>       
        </target>
        <target name="isTrue" if="scondition">
            <echo>is ture</echo>
        </target>
        <target name="isFalse" unless="scondition">
            <echo>is false</echo>
        </target>
    </project>

    4、isset 指定属性是否存在
    <project name="testCondition">
        <!--属性也可以通过ant参数-D来设置-->
        <property name="name" value="this is name"/>   
        <target name="test">
            <condition property="scondition">
                <!--如果属性name不存在则返回false-->
                <isset property="name"/>
            </condition>
            <antcall target="isTrue"></antcall>
            <antcall target="isFalse"></antcall>       
        </target>
        <target name="isTrue" if="scondition">
            <echo>is ture</echo>
        </target>
        <target name="isFalse" unless="scondition">
            <echo>is false</echo>
        </target>
    </project>

    5、equals 是否相等
    <project name="testCondition">
        <!--属性也可以通过ant参数-D来设置-->
        <property name="name" value="this is name"/>   
        <target name="test">
            <condition property="scondition">
                <!--如果arg1的值与arg2的值相等返回true,否则为false-->
                <equals arg1="${name}" arg2="this is name"/>
            </condition>
            <antcall target="isTrue"></antcall>
            <antcall target="isFalse"></antcall>       
        </target>
        <target name="isTrue" if="scondition">
            <echo>is ture</echo>
        </target>
        <target name="isFalse" unless="scondition">
            <echo>is false</echo>
        </target>
    </project>   

    6、filesmatch 比较文件
    <project name="testCondition">       
        <target name="test">
            <condition property="scondition">
                <!--如果file1所代表的文件与file2所代表的文件相等返回true,否则为false-->
                <filesmatch file1="testfile1.txt" file2="testfile2.txt"/>
            </condition>
            <antcall target="isTrue"></antcall>
            <antcall target="isFalse"></antcall>       
        </target>
        <target name="isTrue" if="scondition">
            <echo>is ture</echo>
        </target>
        <target name="isFalse" unless="scondition">
            <echo>is false</echo>
        </target>
    </project>
  • Ivy与Ant的基本介绍(2)

    2010-11-18 12:36:13

    Ivy与Ant的基本介绍(2)
    2009-02-02 16:41
    四.利用Ant构建和部署Java工程
    Ant可以代替使用javac、java和jar等命令来执行java操作,从而达到轻松的构建和部署Java工程的目的。下面来看几个知识点。
    1. 利用Ant的javac任务来编译java程序
    Ant的javac任务用于实现编译Java程序的功能。下面来看一个简单的例子:
    首先我们建立名为antstudy的Java工程,建立src目录为源代码目录,在src目录下建立HelloWorld.java这个类文件。该类文件的内容如下:
    public class HelloWorld {
        
    public static void main(String[] args) {
            System.out.println("Hello,Amigo");
         }
    }

    同时在antstudy工程的根目录下建立build.xml文件,在该文件中编译src目录下的java文件,并将编译后的class文件放入build/classes目录中,在编译前,需清除classes目录,该文件的内容如下:
    <?xml version="1.0"?>
    <project name="javacTest"default="compile" basedir=".">
        
    <target name="clean">
           
    <delete dir="build"/>
        
    </target>

        
    <target name="compile" depends="clean">
           
    <mkdir dir="build/classes"/>
        
    <javac srcdir="src" destdir="build/classes"/>
        
    </target>
    </project>

    运行该build.xml文件,可在工程中看到新增了build/classes目录,并在该目录中生成了编译后的HelloWorld.class文件。如图

    2. 使用Ant的java任务运行Java程序
    Ant中可以使用java任务实现运行Java程序的功能。下面在1的例子中进行如下的修改,修改后的build.xml文件的内容如下:
    <?xml version="1.0"?>
    <project name="javaTest" default="run" basedir="e:/antTemp">
        
    <target name="clean">
           
    <delete dir="build"/>
        
    </target>

        
    <target name="compile" depends="clean">
           
    <mkdir dir="build/classes"/>
          
    <javac srcdir="src" destdir="build/classes"/>
        
    </target>

        
    <target name="run" depends="compile">
           
    <java classname="HelloWorld">
               
    <classpath>
                  
    <pathelement path="build/classes"/>
               
    </classpath>
           
    </java>
        
    </target>
    </project>

    运行该build.xml文件,可在控制台看到HelloWorld的main方法的输出。

    3. 使用Ant的jar任务生成jar文件
    读者可以在上例的基础上更进一步,来生成jar包,可在run这个target下再加上如下target:
    <target name="jar" depends="run">
    <jar destfile="helloworld.jar" basedir="build/classes">
               
    <manifest>
                  
    <attribute name="Main-class" value="HelloWorld"/>
               
    </manifest>
           
    </jar>
    </target>

    此时将ant的project的default属性设置为jar,同时运行该build.xml文件,运行完毕后,可看到在工程目录下生成了一个jar包HelloWorld.jar。
    运行helloworld.jar这个jar包,看看打包是否正确
    原文地址:http://tech.it168.com/j/2007-11-09/200711091344781.shtml
  • Ivy与Ant的基本介绍(1)

    2010-11-18 12:32:55

    Ivy与Ant的基本介绍(1)
    2009-02-02 15:53
    Ant是一个Apache基金会下的跨平台的构件工具,它可以实现项目的自动构建和部署等功能。在本文中,主要让读者熟悉怎样将Ant应用到Java项目中,让它简化构建和部署操作。

    一.安装与配置 

    下载地址:http://ant.apache.org/,在本文中下载的是1.7.1版本。解压到某个目录(例如C:\apache-ant-1.7.1),即可使用。 
    添加系统环境变量:ANT_HOME,该变量指向Ant解压后的根目录,在此为C:\apache-ant-1.7.1。 
    安装与配置完毕后,读者可以测试一下Ant是否可用,首先进入Ant的bin目录,运行命令ant –version,若安装和配置成功,则会显示Ant版本信息,如下图所示:
    由上可以看出,读者运行Ant的命令时,需要进入到Ant的bin目录,如何才能让系统自动找到Ant呢?这时需要读者在系统环境变量path中添加Ant的bin目录。设置完成后,我们就可以在任何目录(例如C:"Documents and Settings"AmigoXie目录)输入Ant的命令,来获得命令的运行结果。

    二.Ant的关键元素

    Ant的构件文件是基于XML编写的,默认名称为build.xml。为了更清楚的了解Ant,在这里编写一个简单的Ant程序,用来展现Ant的功能,让读者对Ant有一个初步的了解。首先在E盘下建立一个build.xml文件,内容如下:
    <?xml version="1.0"?>
    <project name="helloWorld">
           
    <target name="sayHelloWorld">
                  
    <echo message="Hello,Amigo"/>
           
    </target>
    </project>

    进入E盘,然后运行ant sayHelloWorld,可以看到如下的运行结果:

    其中sayHelloWorld为需要执行的任务的名称。如果文件名不为build.xml,而为hello.xml时,读者运行同样的命令时,命令窗口会出现如下错误:
    Buildfile: build.xml does not exist!
    Build failed
    由上面的命令的错误提示可以看出,ant命令默认寻找build.xml文件。若文件名为hello.xml时,读者还需要对命令做少许改变,改为:ant –f hello.xml sayHelloWorld、ant –buildfile hello.xml sayHelloWorld或ant –file hello.xml sayHelloWorld。
    接下来开始向读者讲解本节的重点:Ant的关键元素project、target、property和task。

    1.project元素
    project元素是Ant构件文件的根元素,Ant构件文件至少应该包含一个project元素,否则会发生错误。在每个project元素下,可包含多个target元素。接下来向读者展示一下project元素的各属性。

    1)name属性
    用于指定project元素的名称。
    2)default属性
    用于指定project默认执行时所执行的target的名称。
    3)basedir属性
    用于指定基路径的位置。该属性没有指定时,使用Ant的构件文件的附目录作为基准目录。
    下面给读者一个简单的例子来展示project的各元素的使用。修改E:"build.xml文件,修改后的内容如下:
    <?xml version="1.0"?>
    <project name="projectStudy" default="sayBaseDir" basedir="e:/antTemp">
           
    <target name="sayBaseDir">
                  
    <echo message="The base dir is: ${basedir}"/>
           
    </target>
    </project>

    从上面的内容我们可以看出,在这里定义了default属性的值为sayBaseDir,即当运行ant命令时,若未指明执行的target时,默认执行的target的sayBaseDir,同时还定义了basedir属性的值为E:"apache-ant-1.7.0,进入E盘后运行ant命令,可看到运行的结果,如下图所示:

    为设定了basedir的值,所以basedir属性的值变成了读者设置的值。读者可以自行将project元素的basedir属性去掉后运行ant看看运行结果,此时basedir的值变成了E:",即为Ant构件文件的父目录。

    有的时候,读者可能有这种需求,即想得到某个project下所有的target的名称,读者可以通过在ant命令里加上-proecthelp来达到该目的。例如针对上述的例子我们运行ant –projecthelp,输出结果如下:Buildfile: build.xml
    Main targets:

    Other targets:

    sayBaseDir

    Default target: sayBaseDir

    2. target元素
    它为Ant的基本执行单元,它可以包含一个或多个具体的任务。多个target可以存在相互依赖关系。它有如下属性:
    1)name属性
    指定target元素的名称,这个属性在一个project元素中是唯一的。我们可以通过指定target元素的名称来指定某个target。
    2)depends属性
    用于描述target之间的依赖关系,若与多个target存在依赖关系时,需要以“,”间隔。Ant会依照depends属性中target出现的顺序依次执行每个target。被依赖的target会先执行。
    3)if属性
    用于验证指定的属性是否存在,若不存在,所在target将不会被执行。
    4)unless属性
    该属性的功能与if属性的功能正好相反,它也用于验证指定的属性是否存在,若不存在,所在target将会被执行。
    5)description属性
    该属性是关于target功能的简短描述和说明。
    下面带领读者来看一个各属性综合使用的例子。修改E:"build.xml文件,修改后的内容如下:
    <?xml version="1.0"?>
    <project name="targetStudy">
           
    <target name="targetA" if="ant.java.version">
                  
    <echo message="Java Version: ${ant.java.version}"/>
           
    </target>
           
    <target name="targetB" depends="targetA" unless="amigo">
                  
    <description>
                                 a depend example!
                  
    </description>
                  
    <echo message="The base dir is: ${basedir}"/>
           
    </target>
    </project>

    进入E盘后运行ant targetB,可看到如下图所示的运行结果:
    读者分析结果后可以看到,我们运行的是名为targetB的target,因该target依赖于targetA,所以targetA将首先被执行,同时因为系统安装了java环境,所以ant.java.version属性存在,执行了targetA这个target,输出信息:[echo] Java Version: 1.5,targetA执行完毕后,接着执行targetB,因为amigo不存在,而unless属性是在不存在时进入所在的target的,由此可知targetB得以执行,输出信息:The base dir is: E:"。

    3. property元素
    该元素可看作参量或者参数的定义,project的属性可以通过property元素来设定,也可在Ant之外设定。若要在外部引入某文件,例如build.properties文件,可以通过如下内容将其引入:<property file=” build.properties”/>
    property元素可用作task的属性值。在task中是通过将属性名放在“${”和“}”之间,并放在task属性值的位置来实现的。
    Ant提供了一些内置的属性,它能得到的系统属性的列表与Java文档中System.getPropertis()方法得到的属性一致,这些系统属性可参考sun网站的说明。
    同时,Ant还提供了一些它自己的内置属性,如下:
    basedir:project基目录的绝对路径,该属性在讲解project元素时有详细说明,不再赘述;
    ant.file:buildfile的绝对路径,如上面的各例子中,ant.file的值为E:"build.xml;
    ant.version:Ant的版本,在本文中,值为1.7.0;
    ant.project.name:当前指定的project的名字,即前文说到的project的name属性的值;
    ant.java.version:Ant检测到的JDK的版本,在上例运行结果中可看到为1.5。
    下面让读者来看一个property元素使用的简单例子。修改E:"build.xml文件,内容如下:
    <?xml version="1.0"?>
    <project name="propertyStudy" default="example">
    <property name="name" value="amigo"/>
    <property name="age" value="25"/>
    <target name="example">
            
    <echo message="name: ${name}, age: ${age}"/>
    </target>
    </project>

    运行结果如图:
    由此读者可以看出,通过如下两个语句:
    <property name="name" value="amigo"/>
    <property name="age" value="25"/>
    我们设置了名为name和age的两个属性,这两个属性设置后,读者在下文中可以通过${name}和${age}分别取得这两个属性的值。

    三.Ant的常用任务
    在Ant工具中每一个任务封装了具体要执行的功能,是Ant工具的基本执行单位。在本小节中,主要引导读者来看下Ant的常用任务及其使用举例。
    1.copy任务
    该任务主要用来对文件和目录的复制功能。举例如下:
    Eg1.复制单个文件:<copy file="file.txt" tofile="copy.txt"/>
    如:
    <?xml version="1.0"?>
    <project name="propertyStudy" default="example" basedir="e:/antTemp">
        <target name="example">
                <copy file="file.txt" tofile="copy.txt"/>
        </target>
    </project>
    执行ant,结果如图:

    Eg2.对文件目录进行复制:
       <copy todir="../newdir/dest_dir">
                <fileset dir="src_dir"/>
    </copy>
    Eg3. 将文件复制到另外的目录:
    <copy file="file.txt" todir="../other/dir"/>
    2. delete任务
    对文件或目录进行删除,举例如下:
    Eg1. 删除某个文件:<delete file="photo/amigo.jpg"/>
    Eg2. 删除某个目录:<delete dir="photo"/>
    Eg3. 删除所有的备份目录或空目录:
            <delete includeEmptyDirs="true">
                   <fileset dir="." includes="**/*.bak"/>
            </delete>
    3.mkdir任务
    创建目录。eg:<mkdir dir="build"/>
    4. move任务
    移动文件或目录,举例如下:
    Eg1. 移动单个文件:<move file="fromfile" tofile=”tofile”/>
    Eg2. 移动单个文件到另一个目录:<move file="fromfile" todir=”movedir”/>
    Eg3. 移动某个目录到另一个目录:
            <move todir="newdir">
                   <fileset dir="olddir"/>
            </move>
    5.echo任务
    该任务的作用是根据日志或监控器的级别输出信息。它包括message、file、append和level四个属性,举例如下:
    <echo message="Hello,Amigo" file="logs/system.log" append="true">

    原文地址:http://tech.it168.com/j/2007-11-09/200711091344781.shtml
  • 浏览器对比

    2010-08-16 12:31:15

    鉴于IE7IE8是目前的主流,所以只分析这两个版本。IE7IE6的基础上作了较大的改进。在界面的美观和实用性上有了较大的提高。增加“选项卡”功能,方便网页的切换。并增强了安全性。但是占用资源较多。一般情况下占用30-60MB内存。要是网页比较大就会占用150-200MB内存。而未响应时占用内存更是高达220MBIE8在资源占用上做了优化,浏览网页的流畅性明显增加。除此之外IE8进一步增强安全性,加入了诸如“SmartScreen仿冒网站筛选器”等全新的安全工具。IE8还对选项卡进行了优化,并增加“兼容性视图”、“Inprivate模式”,更好地满足了用户的需求。不过IE8不拘小节,在细节方面做得欠佳。下载文件时窗口标题居然显示“已完成安装X%”,此外搜索框中的汉字时不时变成乱码。不过IE是集成在Windows中的,使用方便,就成了使用最普遍的浏览器之一。适合一般用户。

     

    腾讯TT浏览器

    这是以IE为内核的浏览器,并以IE为基础进行一些优化调整。换句话说就是IE坏了,TT也就不能用了。TT的一个最大的优点就是占用资源很小,只有几MB,开很多网页也只有20MB,是IE所无法比拟的。机器配置一般的用户推荐使用。还有什么抗假死技术、多线程技术、网络黑名单、换肤功能,就不一一介绍了。

     

    FireFox火狐浏览器

    拥有独立的内核。就算IE坏了,火狐也能照常使用。火狐浏览器体积小,才5MB,运行速度非常快。平均占内存50MB,比TT浏览器略逊一筹。火狐浏览器在一定程度上比IE安全,中毒的可能性更小。究竟是因为安全性确实高还是黑客不愿意在火狐上浪费时间就不得而知了。另外,你必须到火狐的官方网站上下载插件,因为没有安装插件的火狐还不如遨游。火狐的插件功能可谓强大,你可以从中挑选自己喜欢的安装。

     

    遨游浏览器

    也是一款基于IE内核的浏览器。最大的特点是占用内存极低。一般情况下只占4MB内存,比TT小一半,比IE浏览器更是不知道小多少倍。并且可以按自己的习惯排列按钮。特别适合配置差的机器。

     

    世界之窗浏览器

    如果说遨游1-2是功能强大的IE皮肤,那么世界之窗就是功能一般的IE皮肤。

     

    Opera浏览器

    来自挪威的顶尖浏览器。Opera安全性高,漏洞比IE和火狐要少得多。浏览快速,被称为“世界上最快的浏览器”。占用内存也可以。界面很好看(个人感觉)也很人性化。据说还能直接下载BT

     

    360安全浏览器基于IE内核,是一款专为安全上网而设计的浏览器。内置的沙箱技术将浏览器缓存和系统完全隔离开,是木马病毒无法侵入系统。

     

    Google Chrome中文名为谷歌浏览器。采用Webkit,据说是目前最好的内核。Google Chrome 2加快了Javascript的运行速度,采用了“内置高速缓存”的优化技术,使得Chrome相当高速。不过这样做也加快了恶意脚本的运行速度。不过它无法像FireFox那样添加插件,也没有广告拦截。没有扩展功能会让一些人放弃Chrome

     

    Safari是苹果开发的浏览器,借以和其他竞争对手抗衡。同样采用Webkit内核。速度很快,不过兼容性和插件就略逊色了。

  • 一个Bug 差点让服务器的文件系统崩溃(转贴)

    2010-07-16 09:34:43

    昨天,公司的美国客户发邮件给我,说我的软件出问题了,我查来查去,发现居然是服务器上一个目录无法删除,一删除就报 cannot read from the source file or disk. 如果用命令行方式删除,则报  cannot find the specified path。一开始以为是文件系统遭破坏了,用 chkdsk 命令检查,没有发现问题,后来仔细一看,那个不能删除的目录名居然以一个空格字符结尾,而我尝试在资源管理器中创建一个目录以空格结尾结果资源管理器会自 动将末尾的字符删除,用程序创建,结果也一样,这个美国佬是怎么创建这个古怪的目录的?出现这种情况后不但是无法删除这么简单,列目录什么的也会有问题, 这样一来,系统的运行都会有问题,我想到的最坏结果就是可能不得不格式化服务器的硬盘,想到这里我几乎不敢再想下去了!Research了一天,后来终于 找到了解决方案,并且由此还发现问题的起因是我程序上的一个Bug造成,可怕的Bug!

    Windows 的文件系统可以支持特殊字符的文件名,比如以空格结尾,以点号结尾等,有一篇英文的文章说NTFS 支持这些文件名,但FAT不支持,我试了一下,FAT也支持。但Windows API 却对这些特殊文件名进行了限制,也就是说,我们通过程序是无法创建一个以空格或点号结尾的文件名或路径名的。但Copy 和 Move的API 却不做这方面的限制,这导致我们可以从其他的文件系统拷贝或移动一个特殊文件名的文件到Windows 的文件系统,但一旦在Windows的文件系统上创建成功,就无法通过正常途径删除或改名。因为调用API 删除或改名时,API 会首先进行规则检查,如果发现不符合规则,则直接忽略。这两组API 在处理上的不一致,带来一个非常严重的安全问题,可惜微软到了Windows7 还没有去弥补这个问题。

    下面让我们用代码复现这个问题

                try
                {
                    string dir = @"C:\Temp\abc";
                    System.IO.Directory.CreateDirectory(dir); //在C:\Temp 目录下创建abc 这个目录
     
                    string dir1 = @"c:\Temp\Bcd \";
     
                    System.IO.Directory.Move(dir, dir1); //将ABC 移动到"Bcd "这个目录去,注意这里 Bcd后面有个空格
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

    在运行这段代码前,你一定要有一点思想准备,因为一旦运行成功,你的 C:\temp 目录下就有了一个 “Bcd ”这样的古怪的目录,而且你用正常的方法根本无法删除它。如果我在此打住,你一定会为之抓狂。不过没关系,我已经找到了删除它的方法,下面就和大家共享:

     

    Windows 的命令行工具 Del 和 Rd 支持一种方式可以不对输入文件名的合法性进行检查,这种方式是在完整目录名前加一个 \\?\

    比如

    del “\\?\C:\Temp\xxx.” 删除xxx. 这个文件

    删除目录的话

    rd /s “\\?\C:\Temp\xxx.” 删除 xxx. 这个目录

    执行这个命令后,就可以删除这些古怪的文件了。注意,这里一定要输入完整的目录才可以,相对路径不行。

     

    讲到这里,我们知道了原因和解决方案,那么在这里我需要提醒大家我们以后在程序中调用 System.IO.Directory.Move 或者 System.IO.File.Copy , System.IO.File.Move 这些函数前,一定要注意先判断一下输入的目标文件名或目录名的结尾是不是空格或点号,可能还要判断其他情况,但目前我只知道这两种情况,而且结尾是空格非 常有隐蔽性。

  • halt ,poweroff和shutdown 的区别

    2010-03-26 16:43:56

    在linux下一些常用的关机/重启命令有shutdown、halt、reboot、及init,它们都可以达到重启系统的目的,但每个命令的内部工作过程是不同的,通过本文的介绍,希望你可以更加灵活的运用各种关机命令.
    在linux下一些常用的关机/重启命令有shutdown、halt、reboot、及init,它们都可以达到重启系统的目的,但每个命令的内部工作过程是不同的,通过本文的介绍,希望你可以更加灵活的运用各种关机命令。

    1.shutdown

    shutdown命令安全地将系统关机。
    有些用户会使用直接断掉电源的方式来关闭linux,这是十分危险的。因为linux与windows不同,其后台运行着许多进程,所以强制关机可能会导
    致进程的数据丢失﹐使系统处于不稳定的状态﹐甚至在有的系统中会损坏硬件设备。

    而在系统关机前使用shutdown命令﹐系
    统管理员会通知所有登录的用户系统将要关闭。并且login指令会被冻结﹐即新的用户不能再登录。直接关机或者延迟一定的时间才关机都是可能的﹐还可能重
    启。这是由所有进程〔process〕都会收到系统所送达的信号〔signal〕决定的。这让像vi之类的程序有时间储存目前正在编辑的文档﹐而像处理邮
    件〔mail〕和新闻〔news〕的程序则可以正常地离开等等。

    shutdown执行它的工作是送信号〔signal〕给
    init程序﹐要求它改变runlevel。Runlevel 0被用来停机〔halt〕﹐runlevel
    6是用来重新激活〔reboot〕系统﹐而runlevel
    1则是被用来让系统进入管理工作可以进行的状态﹔这是预设的﹐假定没有-h也没有-r参数给shutdown。要想了解在停机〔halt〕或者重新开机
    〔reboot〕过程中做了哪些动作﹐你可以在这个文件/etc/inittab里看到这些runlevels相关的资料。

    shutdown 参数说明:

    [-t] 在改变到其它runlevel之前﹐告诉init多久以后关机。

    [-r] 重启计算器。

    [-k] 并不真正关机﹐只是送警告信号给每位登录者〔login〕。

    [-h] 关机后关闭电源〔halt〕。

    [-n] 不用init﹐而是自己来关机。不鼓励使用这个选项﹐而且该选项所产生的后果往往不总是你所预期得到的。

    [-c] cancel current process取消目前正在执行的关机程序。所以这个选项当然没有时间参数﹐但是可以输入一个用来解释的讯息﹐而这信息将会送到每位使用者。

    [-f] 在重启计算器〔reboot〕时忽略fsck。

    [-F] 在重启计算器〔reboot〕时强迫fsck。

    [-time] 设定关机〔shutdown〕前的时间。

    2.halt—-最简单的关机命令

    其实halt就是调用shutdown -h。halt执行时﹐杀死应用进程﹐执行sync系统调用﹐文件系统写操作完成后就会停止内核。

    参数说明:

    [-n] 防止sync系统调用﹐它用在用fsck修补根分区之后﹐以阻止内核用老版本的超级块〔superblock〕覆盖修补过的超级块。

    [-w] 并不是真正的重启或关机﹐只是写wtmp〔/var/log/wtmp〕纪录。

    [-d] 不写wtmp纪录〔已包含在选项[-n]中〕。

    [-f] 没有调用shutdown而强制关机或重启。

    [-i] 关机〔或重启〕前﹐关掉所有的网络接口。

    [-p] 该选项为缺省选项。就是关机时调用poweroff。

    3.reboot

    reboot的工作过程差不多跟halt一样﹐不过它是引发主机重启﹐而halt是关机。它的参数与halt相差不多。

    4.init

    init是所有进程的祖先﹐它的进程号始终为1﹐所以发送TERM信号给init会终止所有的用户进程﹑守护进程等。shutdown
    就是使用这种机制。init定义了8个运行级别(runlevel),init 0为关机﹐init
    1为重启。关于init可以长篇大论﹐这里就不再叙述。另外还有telinit命令可以改变init的运行级别﹐比如﹐telinit
    -iS可使系统进入单用户模式﹐并且得不到使用shutdown时的信息和等待时间。

  • 进程与线程的区别

    2010-03-17 14:06:24

    线程是一种操作系统对象,代表着一个进程中要被执行的代码的路径。每一个WIN32应用程序至少有一个线程--通常称为住线程或默认线程--但应用程序可以自由地创建其他线程来执行其他任务!

    进程是程序的一次动态执行过程,它对应了从代码加载、执行到执行完毕的一个完整过程,这个过程也是进程本身从产生、发展到消亡的过程。

    线程是比进程更小的执行单位。一个进程在其执行过程能够中,可以产生 多个线程,形成多条执行线索。每条线索,即每个线程也有它自身的产生、存在和消亡过程,也是一个动态的概念。

    一个程序应该只有一个进程吧,但是可以拥有多个线程。
    可以说,一个执文件被运行后,就可以称为是一个进程了。但是进程只是存在内存中,实际上他是不会做任何事情的。
    这个时候,起作用的就是线程了。线程是程序的执行者,一个程序至少有一个线程,但是在多线程的操作系统中,可以有一个以上的线程。

    其实我们可以把线程看成是我们排队买肯德鸡吃(循环的排队,一直排下去,直到我不想买了,退出)。每人都有机会到达队伍的最前端去买东西,这个就好比是线程,都有机会被程序执行。但是线程真正起作用的时候,就是我们在队伍的最前端买东西到东西买完后,这一段时间,这是线程真正执行的阶段。
  • 如何估算测试工作量(一)常规的估算测试工作量的方法

    2010-03-02 10:44:12

    如何估算测试工作量
    (一)常规的估算测试工作量的方法
    作为一个管理者,你是否被询问到某个项目要花多少时间,多少人力测试;或是作为一个普通的测试员,你是否被询问到要花多少时间来完成某个任务或是一次回归测试?我想大多数在软件行业的人或多或少都会碰到这样的关于工作量估计的询问。那么你是怎么回答的呢?你对你自己的回答有信心吗?你是否最终发现实际上花去的时间和原本估计的时间大相径庭呢?
    不同的人会使用许多不同的方法来估算及安排他们的测试工作量。不同的组织根据项目的类型,项目的内在风险,涉及的技术等而使用不同的方法。但是大多数时候测试工作量是和开发工作量合在一起的,没有一个单独的数字。
    首先让我们来看看一些常规的估算测试工作量的方法:
    1. Ad-hoc方法
    这种方法下的测试工作量不基于任何确定的期限。工作一直继续直到达到一些由管理或市场人员预先定下的时间表。或者,一直到用完了预算的经费。
    这种情况普遍存在于非常不成熟的组织,并且时常有100%的错误差数。
    2.开发时间的百分比法Percentage of development time
    .这个方法的基本前提是测试工作量依赖于开发时间/开发工作量。首先,开发工作量使用例如LOC或FP方法被估算出来,然后使用一些探索性的方法来限制测试的工作量。这种方法变化比较大而且通常基于以前的经验。
    通常预留项目的总花费时间的35%给测试。
    • 5-7%给组件和集成测试
    • 18-20%给系统测试
    • 10%给接收测试(或回归测试等)
    3.类比法(经验值法或历史数据法)
    根据以前或相似项目(主要在项目性质,领域,规模上有相似)所积累的经验或历史数据来估算工作量。类比法估计结果的精确度取决于历史项目数据的完整性和准确度,因此,用好类比法的前提条件之一是组织建立起较好的项目后评价与分析机制,对历史项目的数据分析是可信赖的。需要收集以下相关的历史数据:
    • 在设计和实现阶段花费的时间
    • 测试工作的规模,例如用户需求的数量,页面数,功能点
    • 数据样式,例如实体,字段的数量
    • 屏幕或字段数量
    • 测试对象的规模,例如KLOC
    4.WBS(work breakdown structure)估算法
    将项目或产品分解为具体的工作,然后分别对各个工作进行时间估算,最终求和得出项目或产品的测试工作量/时间。
    5.Delphi 法
    Delphi法是最流行的专家评估技术,在没有历史数据的情况下,这种方式可以减轻估算的偏差。Delphi法鼓励参加者就问题相互讨论。这个技术,要求有多种相关经验人的参与,互相说服对方。。
    Delphi法的步骤是:
    1、协调人向各专家提供项目规格和估计表格;
    2、协调人召集小组会各专家讨论与规模相关的因素;
    3、各专家匿名填写迭代表格;
    4、协调人整理出一个估计总结,以迭代表的形式返回专家;
    5、协调人召集小组会,讨论较大的估计差异;
    6、专家复查估计总结并在迭代表上提交另一个匿名估计;
    7、重复4-6, 直到达到一个最低和最高估计的一致。
    6.PERT估计法
    PERT对各个项目活动的完成时间按三种不同情况估计:一个产品的期望规模,一个最低可能估计,一个最高可能估计。用这三个估计用来得到一个产品期望规模和标准偏差的Pert 统计估计。Pert 估计可得到代码行的期望值E, 和标准偏差SD。

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/imlogic/archive/2007/11/16/1887723.aspx

  • QTP与QC的完美结合实现自动化测试框架-业务组件测试

    2010-03-01 17:58:23

    摘要:利用QTP和QC相结合搭建功能自动化测试框架

    关键词:自动化测试 测试框架 组件

    做功能自动化测试都会不约而同的遇到一个比较棘手的问题-测试框架的搭建。这也是直接影响功能自动化测试成功与否的关键。框架做的好可以使测试事半功倍,反之轻则很难看到工作的成果重则会使整个测试失败。目前网上有很多关于测试框架的讨论,其中也有成型的测试框架,其中有很多好的思想在里边,很值得借鉴。但今天要讨论的不是网上已有的,而是HP已经为我们设计好的一个测试体系,业务组件测试。他是利用QTP与QC的完美结合组成的一个体系架构。它可以轻易实现目前比较流行的三层测试架构:脚本层,业务层,数据层相分离,为开展功能自动化测试提供一个高效、稳定、容易的测试实现。

    一.概述

    1.1业务组件(Bussiness Process Testing)简介

    业务组件是组成流程测试的基本单元,组合不同的业务组件可以实现不同的业务流程测试。如将fligt系统的登录最为一个组件,选择航班最为一个组件等。这样可以实现组件的复用,提高开发效率。

    1.2 Bussiness Process Testing的优点

    1) 相关业务人员可以在没有脚本的环境下组合业务组件,实现业务流程。

    2) 对业务人员的编程能力没有要求,业务人员只需了解系统的业务流程,不用关心具体的脚本实现。这一点也实现了业务层和脚本层的分离。

    3) 一旦某个组件开发完毕,即可在不同的流程中使用该组件,实现高可复用性,从而加快业务流程测试的速度。

    4) 明确的角色分工,业务人员负责流程的开发、组织;QTP工程师负责脚本的开发、维护以及相应函数库的开发、维护。

    5) 因为实现了脚本的复用,提高了自动化开发的效率,无形中就降低了测试过程中维护的时间和成本。

    1.3 Bussiness Process Testing的简易流程

    如图所示,整个过程分为2条线:第一个是由业务测试人员划分组件并组合不同的组件实现不同的流程测试;其次QTP专家负责组件的脚本具体实现并负责调试成功,上传到QC供业务测试人员调用。

    注:测试数据的组织后边介绍,以便实现三层的测试架构;此过程需要QC有Bussiness Process Testing组件许可的支持,也就是需要单独向HP购买。

    下边以QTP自带的示例程序演示整个流程的开发过程

    2.1划分组件

    本次将系统划分为:登录;选择航班并插入;打开订单;更新订单;删除订单;注销。这样划分仅为演示之用,不用在实际的测试之中。

    2.2组织业务测试流程

    本次只是用于演示,所以流程不会100%覆盖,在实际的测试过程中要达到100%的流程覆盖。本次测试流程如下:

    流程1:登录-选择航班并插入-注销

    流程2:登录-选择航班并插入-更新订单-注销

    流程3:登录-选择航班并插入-更新订单-删除订单-注销

    流程4:登录-打开订单-更新订单-删除订单-注销

    下边需要根据划分的组件来实现组件脚本的实现。

    2.3创建应用程序区域

    在开发脚本之前首先要做的是要创建一个应用程序区域。应用程序区域提供创建业务组件所需的所有资源和设置,每个业务组建都居于一个应用程序区域,并从这些应用程序区域集成这些资源和设置。在此创建一个名为“订票系统流程测试”的区域,如图所示。

    创建过程:依次选择:file-New-Function library。保存后自动上传至QC默认目录。

    在此也可以加载自己的函数库,对象库,恢复场景等,这样以后创建的组建都可以共享该应用程序区域的资源。同时也方便维护,这也是一个优点所在,例如一旦函数库改变在此从新加载新的函数库即可,不用在脚本理修改。总之这个应用程序区域很重要,以后所有的脚本均是基于这个区域。应用程序路径一定要加载正确,否则录制时不能生成脚本。

    2.4创建脚本

    在创建脚本之前最好在QC中组织好目录树,方便保存及调用。关于脚本的开发过程,每个人、每个公司都有自己的方法。在此源代码也没法一一贴出。所以在此只列出输入参数和输出参数,方便后边的参数化以及数据组织。本次也采用最通用的方式即对象库解决对象识别问题。脚本的开发规范以及参数命名也以我自己惯用方式。

  • 如何进行报表测试?

    2010-02-08 16:21:19

    报表功能的基本要求,就是通过查询、统计、分析,为用户提供准确的数据,帮助用户做出决策。在此主要是与大家分享一下报表测试的经验。

    一、熟悉业务:
        对任何软件进行功能测试,都必须要熟悉业务,包括业务流程和业务规则。但是报表测试同一般的业务功能测试还是有些区别的,比如:报表的业务很难直接通过对界面的浏览和探索性操作去了解业务。对于报表业务的熟悉,主要是两个方面:数据项的算法和数据来源,也就是说要明白一个数据项同具体的业务有什么关系,单据的增、删、改或者状态的变化,对报表中各个数据项的计算会产生什么不同的影响。如果不知道到这些,那么就无法验证报表中的数据是否准确,也无法通过报表去检查业务系统的正确与否。


    二、准备完整、高效、专用的数据:
        1、从查询统计方法角度准备数据:尽可能覆盖到报表所提供的各查询统计方法的数据,至少保证每一种查询统计方法都应该有对应的数据,得到的结果不是0,否则等于没有覆盖到这个查询统计算法。

        2、从数据源的属性来准备数据:这里涉及到的方面比较多,都是跟数据来源有关,现举例说明:a.同样的业务数据来源于多个数据表,则需要准备多个数据表中的数据;b.与状态相关的数据,有些状态需要纳入统计,有些不需要,但这些数据都需要准备;c.数据来源与显示数据不同时,比如在 数据库中存储的是1,显示时则需要显示为“是”。等等。。。

        3、从数据项的算法来准备特殊数据:比如:除数为0,以及与0相加,是否可以得到正确的结果;

        4、数据的优化:按上述的方法基本上可以准备比较完整的数据了,但数据也不是越多越好,为了提高测试效率,需要对数据进行优化,尽量保证用最少的数据覆盖所有可能的情况。

        5、为报表准备专用的数据:即使个人精心准备了报表数据,如果多人同时测试,或者本人在测试业务时,录入了其他数据,都会对报表的数据产生影响;所以需要在开始测试时,团队内对数据的准备达成一致,使数据中的某一项具有特征性,例如分别使用不同的供应商,或者使用不同的商品。

        6、做好数据环境的备份和维护:
        数据文档的备份与维护:
        在测试过程中难免会因为误操作导致环境的变化,例如:不小心把一张单据变成了另外一种状态,或者某个类型的单据多做了一张。对于这种情况,一个简单的方法就是去维护数据文档。当然,前提就是需要对原始的数据文档进行备份。

        测试数据库的备份与恢复:
        如果想减少回归测试的工作量,那么应该考虑在一些关键的“点”上备份测试数据。例如所有的基础数据与单据已经输入完成,但是还都没有开始审核,那么可以备份一下,下次再测的时候可以直接在数据库中恢复这部分原始数据。

        另外:
        在准备报表数据的过程中,还需要多与开发人员进行沟通,一来可以了解开发人员采用的算法是否与需求符合;二来可以更加明确数据的来源。
        在进行业务功能的测试时,可以通过业务测试的过程,把报表测试所需要的数据输入到系统中。


    三、在业务功能测试通过之后才开始:
        业务功能测试是报表测试的基础。如果业务功能本身存在缺陷,导致的数据不准,那么进行报表测试也就没有什么意义了。所以,应该在保证各项同报表有关的业务的功能测试通过之后,才开始考虑对报表进行测试。


    四、尽可能覆盖报表所提供的各种查询统计方法:
        报表的使用者一般是企业的中层或高层领导,他们对于报表的要求可能会是多方面的,例如在进销存系统中,可能需要按不同商品进行分类统计,也可能是按供应商分类统计,这些都是由用户在实际工作中的需要来决定的,所以假如一个报表提供了多种查询统计的方法,那么在测试时,只要时间充分,就应该覆盖这些所有可能被用到的查询统计方法。


    五、对存在联系的多个报表进行相互对照:这需要非常了解各报表之间存在的联系。例如:库存报表中,可以看到商品的出入库情况,而在销售报表中,可以看到商品的销售金额和销售成本金额,对业务熟悉到一定程度就会知道实际上这两种报表之间就存在着某种联系。


    六、着重对那些算法复杂、与业务功能关联较多的报表的测试。


    七、留意数据的显示:小数位,千位符,四舍五入等是否与报表设置一致;单位转换是否正确;组合显示的数据是否合理 ;数据的排序。等等。。。


    八、保证测试人员可以通过软件功能界面找到自己所需的所有原始数据,而不是通过SQL语句来查找,因为实际用户在使用软件时,是不会到数据库中查找数据的。


    九、对有些报表需要考虑权限控制和访问安全性的测试。


    十、大数据量的测试。
  • 《零基础学习软件测试》系列视频之QTP使用指南(全)

    2010-02-08 16:20:22

    1 qtp目录分析
    http://www.boobooke.com/v/bbk1590
    2 qtp界面分析
    http://www.boobooke.com/v/bbk1594
    3 qtp示例程序分析
    http://www.boobooke.com/v/bbk1598
    4 qtp学习指南
    http://www.boobooke.com/v/bbk1515
    5 qtp基本操作录制与回放
    http://www.boobooke.com/v/bbk1591
    6 qtp的三种录制方式
    http://www.boobooke.com/v/bbk1516
    7 增强help步骤
    http://www.boobooke.com/v/bbk1592
    8 checkpoint
    http://www.boobooke.com/v/bbk1595
    9 参数化
    http://www.boobooke.com/v/bbk1599
    10 Tools下的工具介绍
    http://www.boobooke.com/v/bbk1589
    11 qtp插件分析
    http://www.boobooke.com/v/bbk1689
    12 qtp测试用例设计考题
    http://www.boobooke.com/v/bbk1575
    13 vbs
    http://www.boobooke.com/v/bbk1621
    14 recovery Scenarios
    http://www.boobooke.com/v/bbk1692
    15 虚拟对象
    http://www.boobooke.com/v/bbk1695
    16 专家视图测试脚本开发
    http://www.boobooke.com/v/bbk1690
    17 qtp描述性编程
    http://www.boobooke.com/v/bbk1691
    18 qtp测试脚本编写规范
    http://www.boobooke.com/v/bbk1693
    19 如何建立自动化测试框架
    http://www.boobooke.com/v/bbk2097
    20 QTP之焦点
    http://www.boobooke.com/v/bbk2146
    21 手工测试 PK 自动化测试
    http://www.boobooke.com/v/bbk2148
    22 QTP使用指南第一部分基础知识讲解完结篇
    http://www.boobooke.com/v/bbk2147
241/212>
Open Toolbar