2006年6月29日

使用IBM Rational的测试理念成功打造测试团队zt

使用IBM Rational的测试理念成功打造测试团队

归类: 软件测试 — gotoSQA admin @ 3:19 pm

文本讲述了 IBM Rational 在软件测试方面的理念以及 Ratioanl 的测试产品方案,你可以了解到如何 使用 IBM Rational 的测试理念成功打造测试团队 。
1. 传统软件测试过程中的问题

测试在所有的软件开发过程中都是最重要的部分。在软件开发过程中,一方面要求我们通过测试活动验证所开发的软件在功能上满足软件需求中描述的每一条特性,性能上满足客户要求的负载压力和相应的响应时间、吞吐量要求;另一方面,面向市场和客户,开发团队还要满足在预算范围内尽快发布软件的要求。

传统的软件测试流程一般是先在软件开发过程中进行少量的单元测试,然后在整个软件开发结束阶段,集中进行大量的测试,包括功能和性能的集成测试和系统测试。随着开发的软件项目越来越复杂,传统的软件测试流程不可避免地给我们的工作带来以下问题:

问题一:项目进度难于控制,项目管理难度加大
如图一所示,大量的软件错误往往只有到了项目后期系统测试时才能够被发现,解决问题所花的时间很难预料,经常导致项目进度无法控制,同时在整个软件开发过程中,项目管理人员缺乏对软件质量状况的了解和控制,加大了项目管理难度。

figure1
图一、传统测试流程中存在的问题

问题二:对于项目风险的控制能力较弱
项目风险在项目开发较晚的时候才能够真正降低。往往是经过系统测试之后,才真正确定该设计是否能够满足系统功能、性能和可靠性方面的需求。

问题三:软件项目开发费用超出预算

在整个软件开发周期中,错误发现的越晚,单位错误修复成本越高,如图二所示,错误的延迟解决必然导致整个项目成本的急剧增加。

figure2

图二、传统测试流程中存在的问题


2. 采用IBM Rational软件自动化测试最佳成功经验解决传统测试问题

IBM Rational软件自动化测试技术核心的三个最佳成功经验是:尽早测试、连续测试、自动化测试,并在此基础上提供了完整的软件测试流程和一整套的软件自动化测试工具,使我们最终能够做到:一个测试团队,基于一套完整的软件测试流程,使用一套完整的自动化软件测试工具,完成全方位的软件质量验证。

2.1 成功经验一:尽早测试

所谓尽早测试是指在整个软件开发生命周期中通过各种软件工程技术尽量早的完成各种软件测试任务的一种思想。IBM Rational主要在以下三个方面为我们提供的尽早测试的软件工程技术:

首先,软件的整个测试生命周期是与软件的开发生命周期基本平齐的过程,如图三所示,即当需求分析基本明确后我们就应该基于需求分析的结果和整个项目计划来进行软件的测试计划;伴随着分析设计过程同时应该完成测试用例的设计;当软件的第一个发布出来后,测试人员要马上基于它进行测试脚本的实现,并基于测试计划中的测试目的执行测试用例,对测试结果进行评估报告。这样,我们可以通过各种测试指标实时监控项目质量状况,提高对整个项目的控制和管理能力。

figure3

图三、软件测试生命周期

其次,通过迭代是软件开发把原来的整个软件开发生命周期分成多个迭代周期,在每个迭代周期都进行测试,这样在很大程度上提前了软件系统测试发生的时间,这可以在很大程度上降低项目风险和项目开发成本。

最后,IBM Rational的尽早测试成功经验还体现在它扩展了传统软件测试阶段从单元测试、集成测试到系统测试、验收测试的划分,将整个软件的测试按阶段划分成开发员测试和系统测试两个阶段,如图四所示,它把软件的测试责无旁贷地扩展到整个开发人员的工作过程。通过提前测试发生的时间来尽早地提高软件质量、降低软件测试成本。

figure4

图四、IBM Rational测试方法对测试阶段的划分

2.2 成功经验二:连续测试

测试成功经验连续测试是从迭代式软件开发模式得来。在迭代化的方法中,我们将整个项目的开发目标划分成为一些更易于完成和达到的阶段性小目标,这些小目标都有一个定义明确的阶段性评估标准。迭代就是为了完成一定的阶段性目标而从事的一系列开发活动,在每个迭代开始前都要根据项目当前的状态和所要达到的阶段性目标制定迭代计划,而且每个迭代中都包括需求、设计、编码、集成、测试等一系列的开发活动,都会增量式集成一些新的系统功能。通过每次迭代,我们都产生一个可运行的系统,通过对于这个可运行系统的测试来评估该次迭代有没有达到预定的迭代目标,并以此为依据来制定下一次迭代的目标。由此可见,在迭代式软件开发的每个迭代周期我们都会进行软件测试活动,整个软件测试的完成是通过每个迭代周期不断增量测试和回归测试实现的。

如图五所示,采用连续测试的软件成功测试经验,不但能够持续的提高软件质量、监控质量状态,同时也使系统测试的尽早实现成为可能。从而有效的控制开发风险、减低测试成本和保证项目进度。

figure5

图五、IBM Rational测试成功经验:连续测试

2.3 成功经验三:自动化测试

在整个软件的测试过程中要想实现尽早测试、连续测试,可以说完善的测试流程是前提,自动化测试工具是保证。IBM Rational的自动化测试成功经验主要是指利用软件测试工具提供完整的软件测试流程的支持和各种测试的自动化实现。

为了使各种软件测试团队更好地进行测试,IBM Rational在提供了测试成功经验之外,还为我们提供了一整套的软件测试流程和自动化测试工具,使软件测试团队能够从容不迫地完成整个测试任务。

3. IBM Rational软件自动化测试工具

在IBM Rational的软件自动化测试解决方案中,我们一直致力追求的一点就是测试工具和测试成功经验、测试流程的统一,上面阐述的每个测试成功经验和测试流程环节,我们都可以通过Rational的测试工具以及工具间的完美集成辅助完成。

IBM Rational的软件自动化测试工具如图七所示,其最大特点是通过一套完整的软件测试工具在实现测试管理流程的基础上,同时涵盖了功能测试、性能测试和可靠性测试的自动化测试需求,通过工具之间的集成完成测试资源的整合,帮助测试团队实现IBM Rational的测试成功经验。

figure6

图七、IBM Rational自动化测试工具


4. IBM Rational软件测试流程

IBM Rational的软件测试流程,不仅仅包含完整的软件测试流程框架,同时还提供了内嵌软件测试流程的测试管理工具的支持。

4.1 IBM Rational软件测试流程框架

IBM Rational Unified Process(以下简称RUP)提供了一套完整的测试流程框架,软件测试团队可以以它为基础,根据业务发展的实际要求,定制符合团队使用的软件测试流程。RUP中的软件测试流程如图六所示:

figure7

图六、IBM Rational 软件测试流程

每个测试环节的具体阐述如下:

制定测试计划的目的是确定和描述要实施和执行的测试。这是通过生成包含测试需求和测试策略的测试计划来完成的。可以制定一个单独的测试计划,用于描述所有要实施和执行的不同测试类型,也可以为每种测试类型制定一个测试计划。
设计测试的目的是确定、描述和生成测试过程和测试用例。
实施测试的目的是实施(记录、生成或编写)设计测试中定义的测试过程。输出工件是测试过程的计算机可读版本,称为测试脚本。
执行测试的目的是确保整个系统按既定意图运行。系统集成员在各迭代中编译并链接系统。每一迭代都需要测试增加的功能,并重复执行以前版本测试过的所有测试用例(回归测试)。
评估测试的目的是生成并交付测试评估摘要。这是通过复审并评估测试结果、确定并记录变更请求,以及计算主要测试评测方法来完成的。测试评估摘要以组织有序的格式提供测试结果和主要测试评测方法,用于评估测试对象和测试流程的质量。

4.2 利用IBM Rational软件测试管理平台实现软件自动化测试流程

IBM Rational在RUP测试方法论的基础上构建了软件自动化测试管理平台工具TestManager,通过和测试需求管理工具RequisitePro、缺陷追踪工具ClearQuest的完美集成,实现了对整个软件测试生命周期的管理,可以帮助软件测试团队快速建立软件测试平台和测试管理流程,使软件测试团队快速拥有以下能力:

TestManager提供测试管理的核心平台,整合了从测试需求、测试计划、测试设计、测试实施、测试执行到测试结果分析、测试报告的自动生成等整个测试生命周期的管理活动。同时,统一组织各种Test Suite,Test Case,Test Script,方便地进行回归测试
TestManager遵循RUP标准测试流程,使测试人员能够在统一的测试管理平台上、遵循统一的测试管理流程,完成对包括产品的功能性、可靠性和性能等全方位的质量测试。
作为一种集成解决方案,Rational TestManager与Rational 其他工具一起,提供从测试需求、到整个软件测试流程管理、缺陷追踪、测试结果评测的可追踪性,方便测试管理人员进行软件测试过程监控和有关软件质量的各种量化指标的采集、分析。

4.3 利用IBM Rational软件测试工具实现软件自动化的功能和性能测试

IBM Rational的自动化软件测试工具的另一个特点就是:通过TestManager + Robot,在实现测试管理流程的同时,能够完成功能测试和性能测试,这会大大缩短测试团队对工具的学习过程,提高工具的易用性。

4.3.1 软件的自动化功能测试

功能测试主要围绕Windows图形界面、字符终端和Browser界面进行测试。客户端可以是VC、VB、PB、Delphi等编制的软件、各种字符终端软件或者运行浏览器Microsoft Explorer和Netscape,通过自动录制形成测试脚本实现自动化的功能/回归测试。

IBM Rational的功能测试解决方案的目标,是使功能性测试变得更简单、有效并可重复执行,从而快速提升软件测试团队的功能测试能力。它主要具有以下特点:

能够方便的对各种环境(IDE)中开发的应用程序、字符终端软件,完成包括测试计划、测试设计、测试实施、测试执行和测试结果分析等全部测试流程。
能够方便的录制或编写各种功能测试脚本,实现自动化的功能/回归测试。
利用数据池方便地解决大批量数据驱动的功能测试;
能够方便地完成分布式功能测试,可以一次测试多种测试平台;
能够自动完成功能测试需求覆盖,确保应用程序满足产品规格说明和测试计划的每一条业务需求;
为了提高对Java和Web开发的应用软件功能测试的支持,IBM Rational的功能测试的解决方案还提供了IBM Rational XDE Tester,它主要用于在Windows和Linux平台上基于Java和Web开发的应用软件的功能测试,尤其适用于使用IBM WebSphere Studio、Eclipse和 Rational XDE Developer等开发平台进行软件开发的团队。它的三个最重要的自动化测试的特性是:

专业的自动化测试脚本创建环境:测试平台扩展嵌入到IBM WebSphere Studio、Eclipse和 Rational XDE Developer开发平台,统一了测试和开发环境;
测试脚本在回归测试方面具有很强的灵活性和可维护性:ScriptAssure是 IBM提供的针对 Java 和Web应用程序测试时的一组高级能力, 它能够帮助创建灵活、可重用的测试脚本,大大提高了脚本的可维护性。对象地图(Object mapping)提供了核心对象库,测试人员可以基于它进行被测程序中被测对象的修改和验证,并根据修改自动更新所有相关的测试脚本。可以自己设置被测程序中用来表示被测对象的对象属性集,这使得少量对象属性的变化不会影响测试脚本的正常回放。同时,可以创建针对动态数据的验证点,通过正则表达式更容易对动态的数据进行验证;
强大的测试脚本语言:使用标准的测试脚本语言Java,可以充分利用工业标准语言的优点进行测试。

4.3.2 软件的自动化压力测试

IBM Rational压力测试工具主要目标是快速提升软件测试团队的性能测试能力,包括负载测试,压力测试等等。Rational性能测试解决方案可以方便灵活地模拟各种负载模型,完成以查找响应时间瓶颈、系统吞吐量、最大并发虚拟用户等为目地的各种要求的性能测试。包括:

利用TestStudio可以完成对压力测试的测试需求、测试计划、测试设计、测试实施、测试执行和测试结果分析等整个测试生命周期的管理;
利用TestStudio中的Test Suite,能够方便的完成压力测试对负载模型的各种要求,包括:

建立复杂的Scenario模型;
准确模拟复杂负载的时序控制;
基于Transaction的负载分析;
建立面向目标的事务负载模型,例如:100事务/秒
响应时间精确到1/100秒;
支持不同虚拟用户的不同IP地址模拟;
准确的波特率模拟;
利用TestStudio,能够方便地完成压力测试过程中各种指标的观测;
利用TestStudio,能够方便地完成压力测试结果分析和各种结果报告的生成;
4.4 利用IBM Rational软件测试工具实现软件自动化的可靠性测试和单元测试

IBM Rational软件测试工具PurifyPlus主要用于帮助软件测试团队在短期内快速提升单元测试能力和可靠性测试能力的团队,其主要特点是:见效快、使用方便、门槛低、培训时间短,开发人员2小时内即可完全掌握该软件进行测试。PurifyPlus包含Rational Purify、Quantify和PureCoverage三个产品,主要功能如下:

Rational Purify主要针对软件开发过程中难于发现的内存错误、运行时错误。在软件开发过程中:

自动地发现错误;
准确地定位错误;
提供完备的错误信息;

从而减少了调试时间, 帮助开发团队找出缺陷并最终形成高质量的产品,使您能真正做到更快地发布更好的软件。
Rational Quantify主要解决软件开发过程中的性能问题。在软件开发过程中:

方便地查明并显示应用程序的性能瓶颈,从而确保整个应用程序的质量和性能。
Rational Quantify 给开发团队提供了一个性能数据的全局图形化视图,使您从开发流程的开头起就注重性能问题,真正做到更快地发布更好的软件。
Rational PureCoverage提供应用程序的测试覆盖率信息。在软件开发过程中:

能自动找出代码中未经测试的代码,保证代码测试覆盖率;
帮助开发人员确保开发质量,并使质量保证人员能够评价测试工作的效果。
可针对每次测试生成全面的覆盖率报告,可以归并程序多次运行所生成的覆盖数据,并自动比较测试结果,以评估测试进度。

4.5 利用IBM Rational软件测试工具实现实时系统软件的自动化测试

IBM Rational Test Realtime主要适合于开发实时系统和具有较高要求的非实时系统的软件开发,可以帮助测试团队快速建立起单元测试、集成测试、系统测试等测试能力。它提供的自动测试(包括单元测试、集成测试、系统测试)、代码覆盖、内存泄漏检查、性能分析以及UML跟踪等重要特性,帮助软件测试团队在系统崩溃前发现并修复软件缺陷。其主要功能特性如下:

自动生成测试脚本模板和测试程序(包括驱动模块和桩模块):通过源代码分析,自动生成在目标上运行所需的测试脚本和测试程序。除了利用测试脚本指定测试数据外,不需要手工编码。而且在测试报告中,测试结果和源代码相联,简化代码修改;
通过代码自动插针进行代码覆盖率、内存泄漏以及性能瓶颈进行分析,并和测试用例建立关联;
通过把测试结果和观察结果和被测代码关联,把测试作为开发的一个重要部分,真正实现边开发边测试,边测试边观察,边观察边评估这一集成的开发测试过程;
通用的、低开销而且易于移植的目标适配技术(Target Deployment Port,TDP):利用TDP技术,使得测试与编译器、连接器、调试器以及目标结构无关,实现了跨多开发环境、多目标结构;
模型观察和代码覆盖相集成:利用UML Trace功能观察应用运行状态,并通过状态机模型覆盖实现测试用例和模型的关联,充分利用了模型和代码级测试的长处;
与ClearCase、ClearQuest和RUP集成:在同一集成环境中完成对测试文件进行版本控制,提交和修改变更请求;

5. 小结

图八、IBM Rational的软件自动化测试解决方案

IBM Rational主要为软件测试团队提供测试成功经验、自动化测试工具和全方位的咨询服务三方面的支持,如图八所示,最终实现:一个测试团队,基于一套完整的软件测试流程,使用一套完整的自动化软件测试工具,完成全方位的软件质量验证,这正是IBM Rational测试解决方案的精髓和终极目标

posted @ 2006-06-29 23:58 路人甲2 阅读(314) 评论(0) 编辑

2006年6月24日

半个蛋挞



被某人啃去一角...
事情总是这样
到了一半就结束

posted @ 2006-06-24 14:56 路人甲2 阅读(103) 评论(0) 编辑

2006年5月23日

zt : java编程思想读书笔记:二万物皆对象

       摘要:java编程思想读书笔记:二万物皆对象
1、java将一切都作为对象来处理,通过对象的reference操控对象,reference可以单独存在,在没有给它分配对象的时候,它就象c++里定义的没有赋值的指针一样没有意义。定义一个对象只是定义了它的reference,定义string型对象可以直接用引号括起来的文字进行初试化。
2、创建完对象的reference后,就可以往上面连接对象了,new关键字用来创建一个新的某种类型的对象。java中自动对象的reference存储在栈中,static对象的reference存储在静态存储区,所有对象本身存储在堆内存中,而常量则存储在程序区内。
3、persistent对象:能够把对象保存在磁盘上,需要的时候又能从内存中重建。
4、primitive类型:primitive类型包括boolean、char、byte、short、int、long、double、void等数据类型,它是java继承了c/c++的自动变量方式,将对象直接存储在栈中。与c/c++不同的是,它所有的数字类型都是带符号的,而且每种类型长度不因机器改变。同时,primitive类型的wrapper类允许你在堆里创建一个表示该primitive类型数据的对象,这个对象就不是primitive类型的了,调用它要用它的reference。
5、高精度数值:java的wrapper类中提供了两个类:BigInteger和BigDecimal,它们提供了能够模拟primitive(原始)类型操作的方法,并且支持更高的精度。
6、java数组:java中数组肯定会被初始化,而且限定了其访问范围。当你创建对象数组时,实际上创建的是对象的reference数组,这些reference会被自动初始化为NULL;创建primitive数组时编译器会将其内存清零。
7、java中对象:c/c++中变量和java中primitive变量及对象的reference的作用域都是由{}决定的,但是java不支持c/c++中的同名变量作用域屏蔽功能。对象的reference会在作用域结束之后消失,但堆中对象仍然占着内存,java的垃圾回收器会自动清理用new创建的堆对象。
8、java中的类:java的类包含数据和方法两种元素,数据可以是reference类型也可以是primitive类型。primitive类型作为类的数据成员总是被初始化,它有一组默认的初始化值。java中方法用方法名和其参数列表来唯一标识,参数列表标明了传给方法的对象类型和名字,实际上传的是对象的reference。调用对象的方法就是向对象发送消息,如果方法无返回值需要标明方法的返回类型为void。
9、java程序:名字的可见性:c++通过名字空间管理名字的可见性,java通过倒序的域名方式实现名字空间的管理。组件使用:java中通过使用import来指定使用的类库中的组件,并且支持通配符*,其中对标准java类库的引用可以省略域名。static成员:类static成员没有被连到类的任何一个实例上,因此即使没有创建任何一个对象也可以访问其static数据或调用static方法,访问类的static成员可以通过对象名,也可以通过类名访问。static数据对每个类只有一份,类的所有对象共用;static方法能够在不创建对象的情况下调用,常用来实现类的管理,它的参数常为static数据或该类的对象。
10、第一个java程序java标准类库中java.lang类库会被自动引入所有java文件,其它类库得用import语句引入,类库结构见jdk文档(Date方法属于java.util.Date类,out是System类的static数据成员,其类型为PrintStream类对象,PrintStream类中方法println用来将其参数String类型内容加换行符后打印到控制台上)。创建独立程序的时候,文件名必须与方法main所在的类名相同,main方法的格式为:public static void main ( Strint[] args)。
11、编译运行:安装jdk并在环境变量中设置JAVA_HOME变量,编译:javac 程序名,运行:java 文件名。使用ant命令可以自动编译运行java程序
12、注释和嵌入式文档:java中注释和c++相同。嵌入式文档是指在java程序注释中加入特殊的标记,以便于javadoc从中提取文档,javadoc可以生成html格式的文档,doclets可以对一些信息进行特殊处理。
13、javadoc语法:所有javadoc命令都是由/**注释符开始,*/结束,注释和定义之间不能有任何东西。javadoc有两种主要用法:嵌入式HTML和文档标记。默认情况下javadoc只处理类的public和protected注释文档。嵌入式HTML:在注释文档里包含HTML命令,主要用于排版功能,javadoc会对一切进行重排版。标记文档:独立式文档标记:以@开头且被放在注释行开头;内嵌式文档标记:括在{}内并以@开头,可放在注释的任何地方。
14、文档标记举例:内嵌式:{@link package.class#member label}以label作为超级链接引用文档中其它类、{@docRoot}返回以文档目录为根的相对路径、{@inheritDoc}把与这个类最近的那个基类的文档继承到当前文档中。独立式:@see 以See Also的超级链接引用文档中其它类、@version version-information 标识版本信息、@author author-information 标识作者信息、@since 标明某种特性开始的版本、@param parametername description 标记方法的参数和其信息、@return description 标记返回值信息、@throws fully-qualified-class-name description 其中第一个为方法声明的异常名 description为产生异常的原因 。
15、编程风格:类名:首字母大写,多单词应该连在一起且每个单词第一个字母大写;方法、数据、reference等首字母小写,多单词应该连在一起且每个单词第一个字母大写。

posted @ 2006-05-23 10:03 路人甲2 阅读(255) 评论(0) 编辑

2005年12月12日

客户资产管理(Custom Asset Management)

        好几天前,南园的宣传栏前就摆出来一张大大的海报,一个关于客户资产管理
的讲座,授讲人是蒋炯文。当时没有太在意这事,以为又是商学院的关于什么资产
评估之类的讲座,就跟上次麦肯锡的一个家伙到院里来做讲座一样,竟是讲了些如
何对公司价值进行评估的方法,对于我这个门外汉来说,听得云里雾里的。不过这
次的讲座好象影响还挺大,班级的里几个学金融的早就哭喊着要去接受人家的教诲
了,而另我唯一感兴趣的,是去看看这个跟我一个姓的人。
        18:20到了科技馆报告厅,尽管来的人没有像先前名企宣讲会般几乎要挤报那
可怜的门,但也差不多坐满了,我很同学只好在最后一排觅得一处坐下。讲座还没
开始,听报告的人还在陆续进来,终于也有了不得不站的同学的身影,可见这人的
影响力还是挺大的,抑或是他的演讲题目吸引了人,也抑或是长江商学院副院长的
名头吸引了人,不管是何种假设,归根到底是来听的人不少。
       主持人上去做了一翻介绍,原来有是一个在美国念书生活过的台湾人,总是感
觉好多公司头头或者学者都是台湾人。蒋教授站上演讲台,先把晚上要讲的东西做
了个大体的介绍,好象很多人都是这么干的。然后又自己大概介绍了一下自己的经
历,说是来分享一下他的经历和他做的一些工作的。正题开始,另所有搞金融的同
学大跌眼睛,不是说人家讲得差,而是人家讲的东西是CRM而不是他们所谓的个人
资产管理。
        虽然他讲得比较笼统,但举了几个例子,使这个概念一下就明了了,客户资产
管理或者客户关系管理就是要把那些好客户(能从他身上赚到钱)留住而赶走那些
坏客户(即赔钱的客户),还要拉来新的潜在客户或从竞争对手那里抢来好客户。
留住一个客户比去新开发一个客户的成本要来的低很多,因此我想这也是移动为什
么要来一个冲100送100(分10个月)的活动原因。他举了几个例子,在美国,银行
为了赶走那些为了取5刀10刀也要去柜台和出纳扯上半天的老头子们,最绝也是最
安全的做法就是把那些老头子比较集中的地区的分行给直接关闭了,这个,老头子
门为了取钱就必须去到更远的分行或者开始使用ATM机,久而久之,不是这些使银
行赔钱的老头子们就自动转到别的银行去存取钱了,银行也就达到了把他们赶走的
目的了。且不说这种做法是人道不人道,但是这的确是一个好方法,起到了杀人于
无形之中。又讲到电信移动的问题,说如果你专门打电话去服务台,那么也就增加
了服务成本,你的每次通话都会被记录,通过CRM可以来判断你是一个好客户还是
一个坏客户,如果你是一个好客户,那么接待你的将是一个硬邦邦的语音系统,让
你不断的按键做选择,知道你自己都觉得烦了挂电话为止;如果你是一个好客户,
那么很快就会有一个声音甜美的小姐给你接电话,然后回答你的各种问题。也就是
说,客户资产管理是要根据每个客户的demand来量身定做supply给客户,给你你所
要的,不给你你所不想要的。根据历史数据,信息系统可以判定你是一个好客户还
是一个坏客户,然后制定对待你的各种策略和方法。当然也不尽是好客户就受到好
的待遇,其中提到FedEx(联邦快递),如果你是一个好客户,就是说你使用FedEx
很频繁,那么你的待遇是最差的,如果你是一个一般的客户,就是说不经常使用,
那么你会收到很好的待遇。为什么?一个使用FedEx很频繁的客户,他选择换一家
快递公司的几率很小,因为人都有一个习惯性的问题,这个东西用习惯了,就不怎
么想换了,而对于一般的客户,他也许也在使用别的快递公司为他服务,在这几家
快递公司当中,他没有习惯哪个哪个,因此,对他更好的服务就能够把他从别的公
司那抢过来。所以他说,如果你想让你的供应商对你好的,你就要对供应商不断地
挑剔,哈哈,虽然是玩笑性质的,但事实上,的确存在着in somewhere。用到我们生
活上,待人接物,何尝不能用CRM来思考问题呢?下面是自己的一点收获,
        收获:
                1.如何评价一个客户的好坏,一个是他是否Active,是否在当前还alive;还有
一个就是从他身上能赚到多少钱;最后当然是他的忠诚度,也就是说是否会一直使用
这个公司的服务或者产品。
                2.使我了解了CRM到底真正是在做什么事情的,以前对这个概念一直很模糊。
                3.了解到了CRM信息系统的发展趋势,要通过数据分析,对每一个要求服务
的客户都可以准确的了解到他的基本信息和品质信息(我自己瞎说的,指他的消费行
为是好的还是坏的,是赚钱还是不赚钱,老客户还是新客户,大客户还是小客户忠诚
度如何等等),从而在众多的服务选项中选择一个适合于他的来对他进行服务,或者
可以立刻产生针对他的服务方式。比如,在咨讯服务台,我打电话进去咨询,系统可
以做到立刻判断我是一个“恶人”还是一个“善人”,然后显示出我的名字,地址等
等等等,然后在电脑屏幕上立刻打出针对与我的字幕来说“某某先生您好,什么什么
什么”等等,然后是选择一个声音甜美的小姐来给我对话还是一个木讷的机器声音来
给我对话,如果我是一个大恶人,他甚至可以拒听从而来达到把我赶走的目的,诸如
此类。这的确是一种更好的方式,可以节省资源并且使公司的利润扩大。

posted @ 2005-12-12 11:06 路人甲2 阅读(237) 评论(0) 编辑

2005年10月19日

打包,并自动安装SQL数据库

打包,并自动安装SQL数据库

一).创建部署项目
1. 在“文件”菜单上指向“添加项目”,然后选择“新建项目”。
2. 在“添加新项目”对话框中,选择“项目类型”窗格中的“安装和部署项目”,然后选择“模板”窗格中的“安装项目”。在“名称”框中键入 setup1。
3. 单击“确定”关闭对话框。
4. 项目被添加到解决方案资源管理器中,并且文件系统编辑器打开。
5. 在“属性”窗口中,选择 ProductName 属性,并键入 信息管理系统 。
 
二).将 主程序 项目的输出添加到部署项目中
1. 在“文件系统编辑器”中,选择“应用程序文件夹”。在“操作”菜单上,指向“添加”,然后选择“项目输出”。
2. 在“添加项目输出组”对话框中,选择“项目”下拉列表中的“你的程序”。
3. 单击“确定”关闭对话框。
4. 从列表中选择“主输出”和“内容文件”组,然后单击“确定”。
 
三).创建安装程序类
1. 在“文件”菜单上指向“新建”,然后选择“项目”。
2. 在“新建项目”对话框中,选择“项目类型”窗格中的“Visual Basic 项目”,然后选择“模板”窗格中的“类库”。在“名称”框中键入 installDB。
3. 单击“打开”关闭对话框。
4. 从“项目”菜单中选择“添加新项”。
5. 在“添加新项”对话框中选择“安装程序类”。在“名称”框中键入 installDB。
6. 单击“确定”关闭对话框。
7. 详细代码附后。
 
四).创建自定义安装对话框
1. 在解决方案资源管理器中选择“setup1”项目。在“视图”菜单上指向“编辑器”,然后选择“用户界面”。
2. 在用户界面编辑器中,选择“安装”下的“启动”节点。在“操作”菜单上,选择“添加对话框”。
3. 在“添加对话框”对话框中,选择“许可协议”对话框,然后单击“确定”关闭对话框。
4. 在“添加对话框”对话框中,选择“文本框 (A)”对话框,然后单击“确定”关闭对话框。
5. 在“操作”菜单上,选择“上移”。重复此步骤,直到“文本框 (A)”对话框位于“安装文件夹”节点之上。
6. 在“属性”窗口中,选择 BannerText 属性并键入:安装数据库.
7. 选择 BodyText 属性并键入:安装程序将在目标机器上安装数据库
8. 选择 Edit1Label 属性并键入:数据库名称:
9. 选择 Edit1Property 属性并键入 CUSTOMTEXTA1
10. 选择 Edit1Value 属性并键入:dbservers
11. 选择 Edit2Label 属性并键入:服务器名:
12. 选择 Edit2Property 属性并键入 CUSTOMTEXTA2
13. 选择 Edit2Value 属性并键入:(local)
14. 选择 Edit3Label 属性并键入:用户名:
15. 选择 Edit3Value 属性并键入:sa
16. 选择 Edit3Property 属性并键入 CUSTOMTEXTA3
17. 选择 Edit4Label 属性并键入:密码:
18. 选择 Edit4Property 属性并键入 CUSTOMTEXTA4
19. 选择 Edit2Visible、Edit3Visible 和 Edit4Visible 属性,并将它们设置为 true
 
五).创建自定义操作
1. 在解决方案资源管理器中选择“setup1”项目。在“视图”菜单上指向“编辑器”,然后选择“自定义操作”。
2. 在自定义操作编辑器中选择“安装”节点。在“操作”菜单上,选择“添加自定义操作”。
3. 在“选择项目中的项”对话框中,双击“应用程序文件夹”。
4. 选择“主输出来自 installDB(活动)”项,然后单击“确定”关闭对话框。
5. 在“属性”窗口中,选择 CustomActionData 属性并键入“/dbname=[CUSTOMTEXTA1] /server=[CUSTOMTEXTA2] /user=[CUSTOMTEXTA3] /pwd=[CUSTOMTEXTA4] /targetdir="[TARGETDIR]\"”。
 
附:/targetdir="[TARGETDIR]\"是安装后的目标路径,为了在installDB类中获得安装后的路径,我们设置此参数。
 
六).添加文件
1. 将SQL Server备份成文件DB.dat添加到“setup1”项目(在企业管理器中右击数据库->所有工作->备份数据库,备份成一个文件,取名为DB.dat)
2. 将安装文件LisenceFile.rtf添加到“setup1”项目
3. 在用户界面编辑器中,选择许可协议,设置LisenceFile属性为LisenceFile.rtf文件
4.一般会自动将依赖项添加到“检测到的依赖项”,如果没有,那么我们要手动将其加入步骤5)
         Crystal_Managed2003.msm     (如果有水晶报表)
         dotnetfxredist_x86.msm      (.net一定是必须的)
          ...                         (如果有引用其他的dll)
5.如果使用了水晶报表,手动加入要包含的文件:项目-->添加-->合并模块(添加你的程序文件) (包括dotNetFramework和MDAC27),位于:C:\Program Files\Common Files\Merge Modules\ 下,*为必要的
具体功能如下:
       (托管组件 MSM 处理所有托管组件的分发,其中包括 Windows 窗体查看器、Web 窗体查看器和所有 Crystal Decisions 命名空间)
       * Crystal_Managed2003.msm
          Crystal_Managed2003_chs.msm
       (对于使报表运行所需的所有其他文件,由数据库访问 MSM 处理其分发。其中包括数据库、导出和图表驱动程序。)
        * Crystal_Database_access2003.msm
           Crystal_Database_access2003_chs.msm
        (KeyCode MSM 处理 Crystal Decisions 密钥号码的安装,注意是添加合并模块,否则没有“MergeMouduleProperties”属性)
        * Crystal_regwiz2003.msm
        (如果报表文件使用了 ADO.NET 的 dataset 数据集对象,那么 VC_User_CRT71_RTL_X86_---.msm 和 VC_User_STL71_RTL_X86_---.msm 模块也必须包含在安装工程中。而且这两个模块的文件安装属性的"Module Retargetable Folder"项必须修改成为系统目录)
           VC_User_CRT71_RTL_X86_---.msm
           VC_User_STL71_RTL_X86_---.msm
        (很多人经常出现查询错误,不妨加上这个)
6.打开解决方案-->右键点击Crystal_regwiz2003.msm的属性,在“MergeMouduleProperties”里的“License Key”填入:AAP5GKS0000GDE100DS(这个是你生成Crystal Report是用到的注册号的密码!)

 七).打包時加入卸载功能:
方法一:
1.在打包項目中添加文件msiexec.exe(一般可在c:\windows\system32\下找到)
2.在文件系統視圖中選擇應用程序文件夾,在msiexec.exe上按右鍵,選擇創建快捷方式,重命名快捷方式為"卸载".
3.更改此快捷方式的Arguments 为"/x {產品id}",產品id的值為打包項目的ProductCode屬性值.
方法二:(推荐)
1.先生成安装包,记下ProductCode(选择解决方案资源管理器根目录如setup1,再查看属性标签,不是右键中的属性),下面要用到
2.用VS.net建立一个新的控制台程序uninst.exe文件
'power by: landlordh
'for 2000,xp,2003
Module uninstall
    Sub Main()
        Dim myProcess As Process = New Process
        If System.Environment.OSVersion.ToString.IndexOf("NT 5") Then
            myProcess.Start("msiexec", "/X{2B65D4A9-C146-4808-AB4B-321FB0779559}")  '改为自己的ProductCode
        End If
        myProcess.Close()
    End Sub
End Module
3.将控制台程序BIN目录的exe文件加入到打包程序文件中,在程序组创建uninst.exe的快捷方式
 
 八).打包時加入.net环境和MDAC功能:
把MS的PluginInstaller.msi插件装上后,用vb.net的自带的打包工具打包,就会自动把
.net framework环境打进去,再下面的步骤进行设置,就可以把MDAC也打包.
使用 Setup 项目安装 MDAC
1.确保 Visual Studio .NET 框架引导程序插件已安装。
2.在 Solution Explorer 中选择 Setup 项目。
  从 View 菜单指向 Editor,并选择 Launch Conditions(启动条件)。
3.选择 Requirements on Target Machine(搜索目标计算机) 节点。
  从 Action 菜单,选择 Add Registry Launch Condition(添加注册表搜索)。
4.选择 Search for RegistryEntry1 节点。在 Properties 窗口中,
  选择 RegKey 属性,并键入 Software\Microsoft\DataAccess。
5.选择 Root 属性,并选择 vsdrrHKLM。
6.选择 Value 属性,并键入 FullInstallVer。
7.选择 Property 属性,并键入 MDACSEARCH。
8.在 Launch Conditions Editor(启动条件) 中,添加Condition1 节点。
  选择 Condition1 节点,在 Properties 窗口中,选择 Condition 属性,并选择 MDACSEARCH>="2.6"。
9.在 Solution Explorer 中选择 Setup 项目。在 Project 菜单上,选择 Properties。
10.将 Bootstrapper 属性设置为 Windows Installer Bootstrapper(Windows 安装引导程序)。

附:
installdb.vb类,要添加引用 system.configuration.install.dll :

Imports System.ComponentModel
Imports System.Configuration.Install

<RunInstaller(True)> Public Class Installer1
    Inherits System.Configuration.Install.Installer

#Region " 组件设计器生成的代码 "

    Public Sub New()
        MyBase.New()

        '该调用是组件设计器所必需的。
        InitializeComponent()

        '在 InitializeComponent() 调用之后添加任何初始化

    End Sub

    'Installer 重写 dispose 以清理组件列表。
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    '组件设计器所必需的
    Private components As System.ComponentModel.IContainer

    '注意: 以下过程是组件设计器所必需的
    '可以使用组件设计器来修改此过程。
    '不要使用代码编辑器来修改它。
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        components = New System.ComponentModel.Container
    End Sub

#End Region


    Public Overrides Sub Install(ByVal stateSaver As System.Collections.IDictionary)
        MyBase.Install(stateSaver)
        If Not InstallDB() Then
            '失败,反安装
            Me.Uninstall(stateSaver)
            Exit Sub
        End If
        DeleteFile(String.Format("{0}DB.dat", Me.Context.Parameters.Item("targetdir")))
    End Sub

    Public Overrides Sub Uninstall(ByVal stateSaver As System.Collections.IDictionary)
        '执行反安装
        MyBase.Uninstall(stateSaver)
        DeleteFile(String.Format("{0}DB.dat", Me.Context.Parameters.Item("targetdir")))
    End Sub

    Private Sub DeleteFile(ByVal paths As String)
        '删除指定的文件
        Try
            Dim delFile As New System.IO.FileInfo(paths)
            If delFile.Exists Then
                delFile.Delete()
            End If
        Catch ex As Exception
        End Try
    End Sub

    Private Sub CreateSql(ByVal paths As String)
        Dim File As System.IO.StreamWriter
        Dim db As String = String.Format("{0}", Me.Context.Parameters.Item("dbname"))
        Dim path As String = String.Format("{0}", Me.Context.Parameters.Item("targetdir"))
        Try
            Dim s As New System.Text.StringBuilder
            s.Append("use master" & vbCrLf)
            s.Append("" & vbCrLf)
            s.Append("if not exists (select * from sysdatabases where name='" & db & "')" & vbCrLf)
            s.Append(" BEGIN" & vbCrLf)
            s.Append("         create database " & db & vbCrLf)
            s.Append(" END" & vbCrLf)
            s.Append("" & vbCrLf)
            s.Append("if exists (select * from sysdevices where name='DBdisk')" & vbCrLf)
            s.Append(" BEGIN" & vbCrLf)
            s.Append("       EXEC sp_dropdevice 'DBdisk'" & vbCrLf)
            s.Append(" END" & vbCrLf)
            s.Append("Else" & vbCrLf)
            s.Append(" BEGIN" & vbCrLf)
            s.Append("       EXEC sp_addumpdevice 'disk','DBdisk', '" & path & "DB.dat'" & vbCrLf)
            s.Append(" END" & vbCrLf)
            s.Append("" & vbCrLf)
            s.Append("restore database " & db & vbCrLf)
            s.Append("from disk='" & path & "DB.dat'" & vbCrLf)
            s.Append("with replace")
            File = New System.IO.StreamWriter(paths)
            File.Write(s.ToString)
        Catch ex As Exception
        Finally
            File.Close()
        End Try
    End Sub

    Private Function InstallDB() As Boolean
        '安装数据库,调用自动批处理。
        Try
            '创建临时脚本
            CreateSql(String.Format("{0}Mydb2000tp.sql", Me.Context.Parameters.Item("targetdir")))
            '调用osql执行脚本
            Dim sqlProcess As New System.Diagnostics.Process
            sqlProcess.StartInfo.FileName = "osql.exe"
            sqlProcess.StartInfo.Arguments = String.Format(" -U {0} -P {1} -S {2} -i {3}Mydb2000tp.sql", Me.Context.Parameters.Item("user"), Me.Context.Parameters.Item("pwd"), Me.Context.Parameters.Item("server"), Me.Context.Parameters.Item("targetdir"))
            sqlProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
            sqlProcess.Start()
            sqlProcess.WaitForExit()  '等待执行
            sqlProcess.Close()
            '删除脚本文件
            DeleteFile(String.Format("{0}Mydb2000tp.sql", Me.Context.Parameters.Item("targetdir")))
            Return True
        Catch ex As Exception
            Return False
        End Try
    End Function

End Class

posted @ 2005-10-19 21:22 路人甲2 阅读(409) 评论(0) 编辑

Microsoft Visual Studio .NET 2003制作安装程序

 

        做B/S项目已经很久了,总是羡慕应用软件漂亮的安装程序,也见到有一些使用InstallShield来做B/S系统安装程序,听说设置有点繁复,一直没有去研究它。最近新做了一个ASP.NET的查询项目,需要做一个安装程序,恰好发现Microsoft Visual Studio.net 2003可以完全胜任,那我又怎么会舍近求远呢!呵呵,闲话少说,来看看我如何制作吧!

       首先,运行Microsoft Visual Studio .NET 2003,点“文件”→“新建” →“项目”,会出现”项目设置对话框”,如图(1)。
选择 ”安装和部署项目“,在右面”模板”中选择”web安装项目”。在下面的“名称”填写框中填写项目名称。“位置”选择框中选择安装程序生成在那个目录,也可以点“浏览”来选择其它的目录,以上选择完成以后,点“确定”按钮,第一步就算完成了。
      在“WEB应用程序文件夹”上点右键,在右键菜单中选择”添加” →”文件”,如图(2)

出现一个文件选择对话框,可以选择多个文件,然后点打开,这时将会把选中的文件显示在”WEB应用程序文件夹目录中。用同样的方法,在左面“WEB应用程序文件夹”的“BIN”目录点右键添加“文件“出现文件选择对话框,同样可以选择多个文件,选中我们ASP.NET项目中的BIN目录下的文件,点“打开”文件出现在项目设置目录的中了。

  特别注意的是” WEB应用程序文件夹在右下角的属性菜单中的两个选项:(如图3

virtualDirectory :设置应用程序目录的名称
DefaultDocument:默认的文档

设置完以后。点“生成”菜单下的“生成解决方案”可以在最初定义的工作目录下生成解决方案了。 最后打开定义的项目工作目录,打开“debug”目录,运行setup.exe,呵呵,看到了吧,Web安装程序生成了!

    安装程序倒是生成了,不过只是最简单的生成安装程序的方法,其它还有一些功能、属性需要大家去仔细研究一下,也希望会InstallShield制作web安装程序的朋友一起交流一下:QQ:171476439 email:soho_suport@163.com

posted @ 2005-10-19 21:19 路人甲2 阅读(390) 评论(0) 编辑

2005年6月9日

blog背景~

posted @ 2005-06-09 21:59 路人甲2 阅读(1756) 评论(4) 编辑

2005年6月5日

嘿嘿,我的驾照~

摘要: 本年度考核已过~阅读全文

posted @ 2005-06-05 21:46 路人甲2 阅读(343) 评论(1) 编辑

2005年5月9日

Agent学习(移动代理研究现状)

摘要: 移动代理研究现状目前,移动代理在网络管理中的应用还处于研究阶段,离大规模的商业应用还有一定的距离。国内外的许多大学、研究机构和企业纷纷投入大量的人力、财力在研究基于移动Agent的网络管理系统。从已有研究的成果来,总体上可分为两大类:移动Agent理论的研究和移动Agent在网络管理中的应用研究。其中,移动Agent理论方面的研究比较成熟,且以移动Agent平台的研究颇多。目前市场已有的移动Age...阅读全文

posted @ 2005-05-09 21:37 路人甲2 阅读(1571) 评论(3) 编辑

移动agent学习 zt

摘要:                                  &#...阅读全文

posted @ 2005-05-09 20:56 路人甲2 阅读(710) 评论(0) 编辑