Nothing is good or bad but our thinking make it so!

发布新日志

  • 为bug预防奠定基础

    2007-11-20 17:04:51

    好东西总有收藏的欲望,当然也要标明付出辛勤劳动的原作者:文章出处:blog 作者:朱少民翻译 发布时间:2006-11-24



    1.引言:

    生产软件的企业安排很多人来测试它们的软件产品。测试的目的就是发现bug(缺陷,defect)以便修正它们。正常情况是尽快处理可能的bug,从而减少修正bug的成本。因为,众所周知,bug越早被发现并修正,所消耗的资源越少。

    问题是在很多情况下,由于修正已发现的bug,测试过程不得不停顿下来。

    那么,以目前正忙于软件产品测试的同样资源来促进组织长期的质量目标不是更好?为了做到这一点,我们应该尽快地提前发现可能的bug。就像克劳士比(Philip Crosby)几年前所说的那样,我们应该努力预防bug,而不仅仅是修正它们。这就是真正的质量。 

    2.目标:预防bug

    预防的重要性

    正如我们所知,bug应该尽早地在开发过程中被发现。修正处于开发阶段的产品的bug的成本远远低于修正处于QCQuality Control,质量控制)阶段的产品的bug,而相对与修正已经发布给客户的产品的bug的成本更是可以忽略不计。原因就是当你修正一个bug的时候,相当于把你之前做的事情重做一次。因此,越晚修正bug,你所重做的事情就越多。如果bug修正是在产品测试之前,那么重做的工作只有代码实现。如果bug修是在测试阶段,那么重做的工作就包括代码实现和测试。另一个导致成本增加的因素是依赖的组件和流程(process),随着项目的进行,产品依赖的组件和流程也会随之增加。

    接下来,从另一个层面来讨论这个问题。如果bug发现和修正越早,开发成本越少,那么在第一时间就避免bug引入是不是成本消耗得更少?如果bug可以被完全预防,那么在开发过程中就不会出现重复工作的情况。这个被克劳士比极力推荐的观点非常有意义,而且在很多情况下已得到严密的证实。然而,并不是所有的生产软件产品的组织都试着去避免bug。它们花费了大部分的精力在产品发布给客户之前发现和修正其中的bug。在某些情况下,软件企业并不试着去达到这样的目标。在产品发布之后,企业通过迅速修正产品中的bug来处理客户的抱怨。这是因为,这样的企业始终处于“问题解决模式”,它们并不试图发现问题的根本原因,而只是把局部的大火扑灭。

    这种模式并不仅仅导致重复工作直接带来成本的增加,而且会带来一个长期效应,而这将影响企业的业务。首先,发布带有bug的产品将给企业的声誉造成影响,并可能造成对潜在客户的影响——他们在是否建立合作关系上拿不定主意。另外,由于企业需要资源来不断解决现有产品中的问题,那么开发新产品的资源势必减少。

    对很多人来说,零缺陷的软件产品似乎是不切实际的。我们总是听到软件开发者说:“软件永远有bug”。产品进入QC阶段时含有bug并不奇怪,因为我们“期望”开发人员制造bug。不幸的是,发布一个包含很多bug的产品给客户仍然不令人感到惊讶。甚至连客户本身也不再感到惊讶。

    事实上,每个软件企业都可以通过一些简单的方法,在不增加任何额外资源的情况下预防bugbug预防在于一个简单的道理:最好的方法是适当借鉴我们自己的经验。 

    今天的发现就是明天的预防

    为了能够预防bug,我们必须首先了解bug的来源。软件bug可以分为几个类别(可能相互之间有所重叠)。第一类bug可能是随机的,它们通常是因为一时的疏忽造成的。尽管这些bug可能由于其随机性很难预防,但是,适当的分析将有助于避免这些bug

    另一类的bug来自于需求的误解、开发环境的错误或者纯粹由于缺乏解决问题的相关技术。这类bug共同的特点是都来自于开发人员。除非被发现,否则这些bug将一直存在。例如,一个还不完全理解需求的开发工程师在单元测试阶段可能无法发现这些问题,只有当产品被其他组织(如QC组)测试时才会发现产品实现与需求不一致。这使得在前期避免类似问题的出现更加重要。

    一个好消息是,软件中的bug往往倾向于重复出现,即使是一个随机出现的bug。软件bug的不断出现不仅表现在同一个开发人员的工作上,而且表现在一个项目甚至是企业的层面上。这当然不是说公司中的每一个开发人员都会犯同样的错误。但是,至少其中一些的错误足以成为经常性出现的问题。所以,为什么我们认为重复的错误是一个好消息?因为可以预见的bug更容易预防。事实是我们可以找到一些常见的问题,并采取相应的措施去预防它(或至少减少类似错误出现的次数)。

    人为bug的子集?那么这些bug被预防的可能性更大。域bug?域bug和产品的问题域或解决方案域紧密相关。这样的bug有更大的机会重现,因为开发人员、项目组甚至企业不断地在这个域上工作。

    现在的问题是如何预防各种bug的产生。基于这次讨论的目的,我建议我们设定一个更加实际的目标。让我不要考虑完全预防某个bug,而是将目标设为——预防我们已经知道有一定可能性产生的Bug。这意味着我们可以通过我们各种发现bug的活动来促进将来的bug预防。当某个bug被发现时,我们就有了一个很好的机会来阻止类似问题的发生。 

    前提:记录bug

    前提条件是持续跟踪发现的bug并正确地记录它们,离开了这个前提条件将不能将bug发现作为一个工具来预防bug。不论你使用bug跟踪系统,还是只手写了一个报告总结测试的结果,重要的是保存这些数据以便用于后来的分析。

    在分析bug时,bug记录的问题值得注意。bug的定义越广泛,bug分析的数据越有用。报告bug的测试人员应该明白这一点,并不限于狭义上的bug。可能的话,测试人员应该运用他们的经验对bug产生的原因做最初的假设。我们将稍后在阐述分析过程时讨论这个问题。

    和记录bug同样重要的是bug分析的第一步。仅仅跟踪过去的bug不能预防bug的发生,因为许多不同的bug可能来源于同一个核心问题。不同于信息收集,适当地分析bug的原因对bug预防非常有用。 

    3.缺陷分析

    目标

    在上一节,我们说明了bug分析的理由。如上所述,最终目标是预防bug

    而不是修正它们。然而,我们可以定义一个重要的子目标,这就使不断提高整个开发团队(包括QC组)的技能和实践经验。当然,这两个目标是息息相关的。离开了不断的知识累积,也不能实现bug预防。不过,我觉得有必要提及这个子目标以强调持续性的过程。bug预防并不是一个不切实际的目标。但是,你不能期望它在一夜之间发生。你应该为开发小组提供教育和知识,以使他们逐渐改善他们的工作。

    策略

    本次讨论的焦点——bug预防策略非常简单和容易实现。秘诀就是使用在大多数开发环境中已经存在的过程元素。我们不会介绍任何新的花费昂贵的活动,也不会引入一些新的角色到开发过程中。

    我们的策略是发现bug,找出bug的根源,然后寻找一个方法来预防类似的bug在将来出现。因为QC过程已经用于在目前的产品中发现bug,因此该策略的大部分工作实际上已经执行,大多数开发过程缺少的正是分析在QC过程中发现的bug。正如你将看到,尽管策略的这一部分并不需要昂贵的花费,但是却带来了极大的额外价值。

    分析过程

    (1) Bug发现和初步分析

    如前所述,bug分析的第一步是发现bug。然而,发现bugQC工程师(注:测试工程师)不应该满足于记录bug的表面症状。QC工程师的一个重要职责就是试图发现bug的根本原因。QC小组在检验产品质量时,不应该将产品看作一个黑盒,而应该像开发人员那样了解产品的内在,包括深入源代码,理解产品的设计和实现。这些能力都是QC小组开始bug分析的基本要求。熟悉了产品的代码,QC工程师就可能推测出bug的根本原因。

    我要强调是下面这个短语的本质:bug的根本原因?bug的根本原因并不是产生这bug的源代码所在,尽管这些信息可能和分析过程关系密切。但是,发现bug的根本原因意味着找到造成这些错误的原因。通过一些实例来说明这个问题可能更清楚一些。

    让我们看一个普遍存在的关于线程同步的问题。假设一个多线程的应用程序需要同步地访问某个数据结构。被指派测试这个产品的QC工程师发现在某种情景下,应用程序尽管没有Crash,但是会停止响应。正常的QC过程是,这个bug被记录在bug跟踪系统中,并描述了测试情景和停止响应的实际结果。然而,如果这个QA工程师熟悉源代码,就可以进行bug产生原因的初步分析。例如,这个QC工程师可能断定这个bug产生的原因是之前的线程没有释放mutex,从而造成了冲突。这些分析可以记录在bug的详细说明中,作为bug分析的一个基础。

    (2) Bug修订和进一步分析

    一如既往,发现一个bug之后,开发人员应该负责处理它。但是,如果bug的发现过程包含了bug根本原因的初步分析,那么关于如何解决这个bug,开发人员可能拥有了更多的信息。虽然这不是QC工程师bug初步分析的目的,但是它可能为开发人员提供了更多的观点。

    除了修正缺陷以及记录实现的具体步骤,开发人员还应该对bug进行进一步的分析。这次分析应该着眼于导致bug产生的开发情景。

    在线程同步的例子中,开发人员不应该仅仅记录增加了一个调用来释放mutex(注:Mutal Exclusion = 互斥锁,保证了共享数据不会同时被多个线程访问,只向一个线程授予对共享资源的独占访问权)。反之,开发人员应该找出没有释放mutex的原因。假设分析的原因是:因为需要同步的方法超过一个的返回点,因此开发人员在某些控制路径上忘记清理代码。

    这一类简单的分析实际带来了非常大的价值。不同于记录具体问题的具体解决办法,我们现在有了可以解决许多情况的经验,有些情况甚至并不涉及到线程同步和释放mutex。但是,分析过程并没有结束,我们需要进一步的分析来将收集的所有数据转换为实践,从而帮助在将来避免类似bug的发生。

    (3) bug预防分析

    分析的最后一步就是寻找一个预防类似错误的方法。这一方法不仅涉及到开发、QC工程师,还涉及到不直接负责代码编写的资深开发人员。

    这一阶段的成果是一些有用的实践经验,开发人员可以通过这些实践预防bug而不是修正bug。这些实践不应该是某个具体问题的解决方案。在我们线程同步的例子中,可能得到这样一个实践:是否有审计范围机制来获取和释放资源?这种实践 (不一定适合所有编程语言)可以指导开发人员用一个类(class)封装资源, 这样构造(constructor)函数容易分配和而与析构(destructor) 函数释放资源。如果遵守这样的约定, 当程序结束这方法时,不管控制路径是怎样的,资源(上述例子中获得的mutex)总能被释放。

    Bug预防分析是整个bug分析过程的核心。这一阶段总结出的实践可以在更广泛的范围内预防潜在的缺陷。由于分析结果的广泛应用性,分析某个具体问题的投入将很容易被收回。

    非常重要的是我们前面所举的例子是一个随机性的bug。开发人员由于疏忽而忘记了释放资源。在代码实现时,这样的bug是随机产生的,但是类似bug产生的几率却非常高。所以,尽管这一类bug是随机的,但仍然可以被预见并防止发生。

    (4) 发布经验

    分析得出的实践经验应该被记录并发布,这样其他的开发人员就可以通过学习这些经验避免类似的错误。一个发布经验最好的办法就是知识库。这将使得新的知识在组织内流动并被相关的开发人员所学习。

    如果不将分析结果传达给组织内相关的其他人员,那么分析的目的就没有达到。避免下一个bug出现的唯一办法就是让开发人员知道如何避免它,并鼓励他们这么做。

    Bug分析实例

    让我们研究另外一个例子,以便更好地理解bug分析的益处。在这个事例中,QC工程师进行了如下的操作:当输入一个长字符串到应用程序时造成其崩溃(crash)。这一结论本身就需要一定程度的分析,但这个QC工程师并不满足于这样的分析,进一步研究了相关的代码,发现crash的原因是输入字符串时的处理有问题。其中一个步骤是将输入的字符缓存在一个固定大小的数组中,而这个数组有时候显得太小了。

    和线程同步的例子一样,QC工程师的初步分析带来了很大的价值,开发可以更容易的发现和修正这个bug。此外,记录缺陷的真正原因而不是表象,将帮助其他人避免类似的bug

    接着,开发人员开始修正这个bug。当修正的时候,她不仅记录了解决措施,并说明了导致缺陷产生的原因。在这个例子中,造成bug的原因是在操作未经处理的C/C++缓冲区时,没有经常检验缓冲区的大小是否不够。然而,这个结论甚至可以被进一步总结为更广泛应用的经验以便帮助开发人员在以后避免类似的缺陷发生。所以,在分析的最后阶段,开发人员在组内更资深的开发人员的帮助下,得到了下面的实践经验:避免使用未经处理的C/C++缓冲区,尽量使用安全的collectionsstrings,如标准模版数据库中提供的可用collectionsstrings。这样就完全可以避免前面发现的这个bug

    益处

    Bug分析带来了很多的好处。第一个好处就是帮助产生错误的开发人员总结经验,并使他在将来避免类似的错误。有时,只修正一个具体的bug而不去分析它产生的原因并不会帮助在日后得到提高。在这种情况下,只有深入分析和资深开发人员的指导才能使开发人员成长和提高能力。

    更广泛的好处是使得其他开发人员从同事的错误中吸取教训。分析总结的实践经验可以预防bug的产生,这样的知识在组织内的成员间共享。某个开发人员产生的bug可以帮助组织内的其他人避免类似的bug出现。

    从更一般的角度来看,发布最佳实践(如bug分析总结的实践)促进了组织内成员的学习和自我提高。这样看来,Bug分析的价值还不仅仅是缺陷的预防。

    另一个好处是通过从更广的角度上记录bug,组织内的其他QC工程师将知道如何发现类似的错误。除了分享组织内的测试知识和经验,bug分析过程可以促进开发更好的测试技术和工具,从而帮助发现类似的bug。所以,就算缺陷没有被完全预防,也能更容易被发现。

    作为上面所有好处的结果,QC在一轮测试中将有更多的时间来测试更复杂的情景并发现更“狡猾的”bug。如果类似的bug都已经被预防而不容易产生,而且QC都有更好的技术来发现类似的bug,就有了更充裕的时间来进行更高级的测试。当然,组织所生产的产品的质量也将得到提高。

    最后,我想强调的是bug分析不仅收集了执行中的问题,而且从这些问题中总结了实践经验。举例来说,导致一个bug产生的原因可能是需求不够清楚。这样,通过bug分析得到的经验提供了一种方法来预防需求不清楚。这个经验可能不会对组织中的开发人员产生效果。所以尽管QC工程师开始验证开发人员的实现结果,但是还需要改善开发流程,如需求收集、设计流程等。 

    4.总结

    真正的质量是生产没有bug的产品。任何其他目标都使组织内的成员从思想上接受软件缺陷是正常工作流的一部分。所以,第一步就是防止相同的bug再次发生。我们可以很轻易地执行这个目标。我们可以通过某个开发人员产生的一个bug提高整个组织的实践经验。

    通过深入产品分析一个bug,我们可以明白这个bug的机制:为什么会产生?如何去预防它?下一次我们如何更容易地发现它?只要花一点时间去理解我们的bug,而不是仅仅是尽快修正它,我们就可以从中得到经验。这样,因为一个缺陷所浪费的时间也可以转化为投入:确保类似的错误永远不会再发生。


  • TD安装时的的问题汇总

    2007-11-20 11:09:18

    安装前

    在添加删除程序中Windows组件中安装相关服务:

    1.       安装“消息队列”,"消息队列"组件又对服务中的"Distributed Transaction Coordinator"(即msdtc服务)有依存关系,这个服务必须启用,才可以安装消息队列组件!启动方法运行 msdtc –resetlog,安装消息队列时可能发生以下错误时:

    无法启动MSMQ服务

    错误代码0x420c

    错误描述依存服务或组无法启动。

         可以在CMD中解决:

    net stop msdtc  

    msdtc -uninstall

    msdtc -install  

    net start msdtc 

    2.         安装IIS服务,在安装完消息队列的前提下安装此服务

    3.         TD前需要完成配置数据库,Oracle9i具体配置如下(举例,具体名称可自定义):

    1)        创建数据库TD212创建一个用户TDADMIN并授予DBA权限。

    2)        创建一个表空间TD212,空间大小修改为1G,其他设置默认即可。

    3)        编辑刚才创建的用户TDADMIN,将其默认表空间设置成刚创建的TD212

    4)        Oracle--Configration and Migration Tools--Net Configuration Assistant删除当前监听程序,在oracle中为TD创建新的监听程序:TD,新的监听程序全部使用默认值。

    5)        安装TD7.6成功后, 进入TD > Site Administrator > DB Servers 中,new新建一个DB Server,类型选择Oracle,注意这里有个容易出错的地方,Server Alias一定要填写Oracle中全局数据库名称,也就是安装过程中让填写的SIDDB Admin User要填写当初我们在 Oracle中建立的那个帐号TDADMIN/ADMIN。全填写好后,可以点‘Ping’试试,如果前面步骤都正确,这里就能ping成功。

    4.         安装TD7.6

    按照安装手册步骤即可,我们来到Projects中,Create一个projectProject name 可以随便写,Database Type 选择OracleServer Name 就是我们上一步在DB Server中新建的那个,DB Admin UserDB AdminPassword是我们在Oracle中建立的那个帐号。Create in TableSpace这里要选择我们当初在Oracle中建立的表空间,Temporary TableSpace选择默认的TEMP就行,然后进行创建,如果前面都正确,那么就会创建成功了。

    备注:tnsping '别名',我理解别名就是Service_Name

     

    安装调试时遇到问题

    1.           TDTestDirector Checker检查了一下,提示报错如下:

    Web directory IDBIN|Report does not exist. TestDirector was installed incorrectly,pls reinstall it.

    解决方法:进入“Internet信息服务对话框,在默认网站下选择“TDBIN”,再TDBIN下把reports目录的执行权限设置为纯脚本,再次执行checker,全部通过。

    2.           TDTestDirector Checker检查了一下,报错如下:
      
    The TestDirector installation process creates a virtual directorywhich it attempts to places in High (Isolated)Application Protection,If,after the installationprocess,the virtual directory is otherwise protected,TestDirector cannot word properly,To rectify thissituation,you must resynchronize the IWAM_XXXX accountpassword,or place the virtual directory in Low(IIS process)
    Application Protection,For instructions onsynchronizing IWAM_XXXX account passwords,refer toArticle#324 on the following Web site:www.IISFAQ.com

       
    根据报错的提示,到IIS里面的TDBIN目录里修改了属性应用程序保护,选择高(独立)

    3.           设置时出现com+无法与Mircrosoft分布式事务协调程序交谈,步骤如下:

    1  重新设置IISIWAM账号密码。右键单击 我的电脑->管理,打开计算机管理界面打开 本地用户和组->用户 右键单击 启动IIS进程帐号 IWAM_****(注:****一般是计算机名)点击设置密码,设置为一个你想要的密码。
    2
    同步IIS metabaseIWAM_MYSERVER的密码,在CMD中:c:\inetpub\adminscrīpts>adsutil set w3svc/wamuserpass "yourpassword"也可:选择

    站点属性"->目录安全性标签->编辑"匿名访问和验证控制"->在弹出的框中选中匿名访问,单击编辑按钮->用户名浏览,选择IWAM_MACHINE,密码框中输入同一的密码,选中"允许IIS控制密码"->确定。
    注意:在WIN2000中,查看到的密码为星号,若要不为星号,必须要先修改adsutil.vbs文件。
    a.
    c inetpub\adminscrīpts 找到adsutil.vbs  (根据装系统时设定的不同,有的路径可能不一样)。
    b.
    右键单击,用记事本打开。
    c.
    查找 IsSecureProperty = True,注意” =”前后各有一个空格。
    d.
    IsSecureProperty = True 改为 IsSecureProperty = False
    获取 IWAM 帐户密码命令: cscrīpt.exe adsutil.vbs get w3svc/wamuserpass
    获取 IUSR 帐户密码命令: cscrīpt.exe adsutil.vbs get w3svc/anonymoususerpass
    输入以上命令,按回车可分别查看IWAMIUSR的密码。
    修改密码命令:
    修改 IWAM 帐户密码 cscrīpt.exe adsutil.vbs set w3svc/wamuserpass "password" 
    修改 IUSR 帐户密码 cscrīpt.exe adsutil.vbs set w3svc/anonymoususerpass "password" password 设置为你想修改的密码,即与第一步中你设置的用户IWAM_****的相同,按回车即可修改完成。
    修改密码前请一定停止所有的Internet信息服务,否则后面可能会出错,并且IWAM帐户可能会被锁定。

    3同步COM+应用程序所用的IWAM_MYSERVER密码,在CMD中:c:\inetpub\adminscrīpts>cscrīpt synciwam.vbs –v 不成功也可如下操作:
    1)启动组件服务管理单元:运行”->“mmc”,启动管理控制台,打开添加/删除管理单元对话框,组件服务管理单元添加上。
    2)找到组件服务”->“计算机”->“我的电脑”->“com+应用程序”->“out-of-process pooled applications”,右击“out-of-process pooled applications”->“属性
    3)切换到“out-of-process pooled applications”属性对话框的标识选项卡。选择此用户,浏览,选择用户名“IWAM_MACHINE”。这些都是缺省的。在下面的密码确认密码文本框内输入正确的密码,确定退出。
    4)系统如果提示应用程序被一个以上的外部产品创建。你确定要被这些产品支持吗?时确定即可。
    5)如果在iis中将其它一些web应用程序保护设置为高(独立的)”,那么这个web所使用的com+应用程序的iwam账号密码也需要同步。
       
    但是在进行第三步操作时总是报8004e00f错误。进入组件服务,查看组件服务/计算机/我的电脑/COM+应用程序,结果报错"COM+ 无法与 Microsoft 分布式事务协调程序交谈",无法查看里面的对象。在事件查看器中msdtc服务没有正常启动。解决方法:运行 msdtc –resetlog
       
    最后解决:"COM+ 无法与 Microsoft 分布式事务协调程序交谈"在安装了Windows组件中的消息队列后,就不会出现这个错误了,同时"消息队列"组件又对服务中的"Distributed Transaction Coordinator"(即msdtc服务)有依存关系,这个服务必须启用,才可以安装消息队列组件!消息队列装好后,COM+应用程序菜单就可以打开了,表示其已正常工作!如果在这个时候再装IIS或者把IIS卸载重装,就正常了!

    4.           报错The RPC server is unavailable解决方法:

    1. RPC服务未启动。解决:控制面板-管理工具-服务-“Remote Procedure Call(RPC)”,启动一下(自动),服务状态启动
    2.
    服务器端IIS没装。解决:安装IIS。以2000系统为例,控制面板-添加删除程序-添加删除windows组件-“Internet 信息服务(IIS)”打一下勾,下一步……
    3.
    你的系统没有打过补丁。如果你的系统是win2000,那么最好是打上sp3或者sp4补丁。根据个人猜测:如果你的TD的补丁是sp4,那么最好你的2000系统也打上sp4补丁(注意:别搞错了!一个是操作系统的补丁,一个是TD的补丁)。

    TD服务未启动。此种情况比较复杂,需要尝试不同的解决方案,先到TD所在的那台机器上,点右键的testdirector checker,看看出错提示,对症下药。
    以下几种可以结合起来尝试:
    清空IEcookiesHistory、缓存;删掉TD_76目录,重新下载一次插件;
    进入TD后,点add-ins page;进入后点TestDirector Connectivity ;然后点download add-in;手动下载插件安装;
    启动一下TD。到TD所在的那台电脑上,在系统栏右边有个小图标,鼠标移上去,点右键“Start TestDirector”
    TD补丁没打,可以试安装TD sp4
    密码被改了,请询问管理员;
    TD服务器装了多个版本的TD,兼容性问题;请卸载其中一个版本,重装TD
    http://IP/tdbin/start_a.htm 改为 http://计算机名/tdbin/start_a.htm 试试;
    如果TD被移植过,到TD所在的那台机器上,点右键的CHANGE RUNAS,更改一下账号;
    TD数据库文件毁坏,和管理员沟通一下吧;
    TD服务器的那台机器有问题。或许是中毒了,或许是操作系统问题(可能系统内存泄露导致服务器崩溃,可能是注册表问题,可能是其它问题……),或许是硬盘坏道问题--这几种情况的共性是有时有问题,有时又没问题,莫名其妙的。
    在尝试了上述几种方案恢复均告失败后,这个情况的可能性大之又大,千万别忽略了。
    重装TD的那台机子的系统或者把TD转移到另一台机器上试试。

    5.           完全卸载TD的问题,注意如果你的机器上装了一系列MI的工具,那卸载TD的时候要小心了。

    卸载TD的步骤见下:
    选择开始菜单的“TestDirector7.6”-“Uninstall TestDirector7.6”,点击;
    卸载后,系统会提示你重启;
    重启后删除TD安装目录,如 C:\Program Files\Common Files\Mercury Interactive 下的全部文件,注意:你如果有需要备份某些文件比如 doms.mdb的话,请自行备份好。

    删除TD_Dir目录,比如 C:\TD_Dir同样注意先备份好里面的库文件,如果你需要的话。
    搜索C:\winnt目录下的所有mercury开头的文件如mercury.ini文件。
    查找注册表所有键值包含“td_dir”的键值,删除之。(建议不要搜索mercury关键字来删除,其实很多冗余信息根本不必删除,完全没有影响)
    在『计算机管理』里,把TD_user的相关用户删掉。

    6.           解决IE7.0TD7.6部兼容的问题:Microsoft Internet Explorer : 4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727) is not supported!

    在安装目录一般为C:\Inetpub\TDBIN下找到Start_a.htmSiteAdmin.htm文件,用记事本打开,即看到了文件源代码,找到fMSIE3456参数,修改在|| (ua.lastIndexOf('MSIE 6.0') != -1)后黏贴|| (ua.lastIndexOf('MSIE 7.0') != -1),保存即可。打开IE7.0再次访问,下载插件,安装插件,没有问题了。

    目前遇到的问题就是上边的,不同的机子会出现不同的问题,有什么问题可以提出来大家一起解决 。

    遗留问题:

    windows 2003 server 的IIS设置!无法设置其IIS为应用程序保护设置为高(独立的)”,因为2003 server的IIS以安全为主,不让用户自行修改,我也不知道在那里进行解决,知道的朋友告诉我一下啊!

222/2<12
Open Toolbar