发布新日志

  • Windows访问控制链表

    2009-02-25 10:12:29

    [From] http://www.cppblog.com/windcsn/archive/2006/10/06/13397.aspx

    访问控制链表(ACL)

    一个
    ACL 是一个 ACE 链表。每个 ACL 中的 ACE 标示一个托管以及指定允许的访问权限、否定或托管的设计。一个对象的安全描述符号包含两种类型的 ACL ,一个是 DACL ,一个是 SACL

    一个目录访问控制链表( DACL )标示允许或拒绝访问一个安全对象的托管。当一个进程常识访问一个安全对象的时候,系统检查对象的 DACL 中的 ACE 来决定是否赋予访问权限。如果对象没有 DACL ,系统赋予完全的访问权限,如果对象的 DACL 没有 ACE ,那么系统拒绝所有访问对象的尝试,因为 DACL 不允许任何访问权限。系统检查 ACE 序列直到找到一到多个 ACE ,或者直到任何请求的访问权限被否定。更多的信息参见: DACL 怎么样控制一个对象的。对于创建 DACL 的信息,见创建一个 DACL

    一个系统访问控制链表( SACL )是管理员登录尝试访问一个安全对象。每个 ACE 指定一个指定的托管尝试的访问类型,这个访问会导致系统产生一个安全事件日志。一个 SACL 中的 ACE 能够产生访问尝试失败或成功的时候产生评估记录,在将来的 release 中,一个 SACL 在一个未授权用户尝试访问一个对象的时候发出一个警告。更多 SACL 的信息参见 Audit Generation SACL 访问权限。

    不要尝试直接使用一个 ACL 来工作。为了确保 ACL 能够语义正确的,使用适当的函数来创建和操纵 ACL 。更多的信息参见:从 ACL 中取得信息和创建或修改一个 ACL

    ACL 也提供访问控制微软的 Active Directory 目录服务对象。活动目录服务接口( ADSI )包括创建和修改 ACL 内容的程序。更多信息参见:控制访问活动目录对象。

    ACE

    一个访问控制实体(ACE)是ACL中的一个元素。一个ACL可能包含0到多个ACE。每个ACE通过一个指定的托管来控制或监视一个对象。更多关于添加、删除、改变ACE,见修改ACL对象。

    Window Me/98/95:不支持访问控制

    6种类型的ACE,三种被所有的安全对象支持,其他类型是对象特定的ACE,由目录服务对象支持。

    所有ACE类型都包含下面访问控制信息:

    1.  一个安全标示符号(SID)来标示ACE应用的托管

    2.  一个访问掩码指定ACE控制的访问权限

    3.  一个指示ACE类型的标志位

    4.  一系列位标志决定是否子容器或对象可以继承ACE从基本对象到ACL附着的对象。

    下表列出了三个所有安全对象支持的ACE类型:

    Type

    Description

    访问拒绝ACE

    用在一个DACL中拒绝到一个托管的访问权限

    访问允许ACE

    用在一个DACL中允许到托管的访问权限

    系统评估ACE

    用在SACL中,当托管尝试检查指定访问权限时产生一个评估记录

    对于对象指定的ACE,参见对象指定ACE

    注意,系统警告ACE对象现在不支持。

    托管

    一个托管是一个用户帐户、组帐户或登录会话到一个ACE应用。每个ACL中的ACE都有一个SID来标示托管。用户帐户包含人使用的帐户或程序帐户(例如,Window服务用来登录到本地计算机的)。组帐户不能用来登录到计算机,但在ACE中非常有用,用来拒绝或允许一到多个用户帐户的访问权限。一个登录SID表示当前的登录会话用来允许和拒绝访问权限,直到用户登出。

    NT4.0和后来版本中访问控制函数使用TRUSTEE结构体来表示一个托管。这个结构体能使你用一个字符串或一个SID来表示一个托管。如果你使用一个名字,从TRUSTEE结构创建ACE的函数执行SID缓冲区分配工作并且查询SID对应的帐户名称。有两个助手函数,BuildTrusteeWithSidBuildTrusteeWithName,可以用SID或名字来初始化一个TRUSTEE结构。BuildTrusteeWithObjectsAndSidBuildTrusteeWithObjectsAndName允许你使用一个对象指定的ACE信息来初始化一个TRUSTEE结构体。其他3个助手函数,GetTrusteeFrormGetTrusteeNameGetTrusteeType,返回TRUSTEE结构各成员的值。
    Window XP/2000
    TRUSTEEptstrName成员可以是一个指向OBJECTS_AND_NAMEOBJECTS_AND_SID结构体的指针。这些结构体说明对象指定ACE的信息,除了托管的名字和SID之外。这可以象SetEntriesInAclGetExplicitEntriesFromAcl这样的函数存储对象指定ACE的信息到EXPLICIT_ACCESS结构体的Trustee成员中。

    TRUSTEE结构体:

    typedef struct _TRUSTEE {
      PTRUSTEE pMultipleTrustee;
      MULTIPLE_TRUSTEE_OPERATION MultipleTrusteeOperation;
      TRUSTEE_FORM. TrusteeForm;
      TRUSTEE_TYPE TrusteeType;
      LPTSTR ptstrName;

    } TRUSTEE, *PTRUSTEE;

    访问权限和访问掩码

     

    一个访问权限是一个标志位对应到一个特殊操作集合,这个集合表示线程可以在安全对象上执行的操作。例如:注册表键KEY_SET_VALUE访问权限,对应到线程在这个键下设置的值的能力。如果线程想在一个对象执行一个操作,但没有必要的访问权限,系统不执行操作。

    一个访问掩码是一个32位的值,它对应到对象支持的访问权限。所有的Windows NT/2000/XP 安全对象使用一个Windows访问掩码格式,这个格式包含下面的访问权限位:

    1.  通用访问权限

    2.  标准访问权限

    3.  SACL访问权限

    4.  目录服务访问权限

    当一个线程想打开一个对象的句柄,线程通常指定一个访问掩码来请求一系列的访问权限。例如,需要设置和查询注册表键的程序可以使用一个访问掩码来请求KEY_SET_VALUEKEY_QUERY_VALUE访问权限来打开该键。

    下面表显示了操作每种类型安全对象的信息:

    对象类型

    安全描述符号函数

    NTFS上的文件或目录系统

    GetNamedSecurityInfo, SetNamedSecurityInfo, GetSecurityInfo, SetSecurityInfo

    命名管道和匿名管道

    GetSecurityInfo, SetSecurityInfo

    控制台屏幕缓冲区

    Not supported.

    进程和线程

    GetSecurityInfo, SetSecurityInfo

    文件映射对象

    GetNamedSecurityInfo, SetNamedSecurityInfo, GetSecurityInfo, SetSecurityInfo

    Access tokens

    SetKernelObjectSecurity, GetKernelObjectSecurity

    Windows管理对象 (windows工作站和桌面)

    GetSecurityInfo, SetSecurityInfo

    注册表键

    GetNamedSecurityInfo, SetNamedSecurityInfo, GetSecurityInfo, SetSecurityInfo

    Windows服务

    GetNamedSecurityInfo, SetNamedSecurityInfo, GetSecurityInfo, SetSecurityInfo

    本地和远程打印机

    GetNamedSecurityInfo, SetNamedSecurityInfo, GetSecurityInfo, SetSecurityInfo

    网络共享

    GetNamedSecurityInfo, SetNamedSecurityInfo, GetSecurityInfo, SetSecurityInfo

    进程间同步对象 (事件, mutexes, semaphores, and waitable timers)

    GetNamedSecurityInfo, SetNamedSecurityInfo, GetSecurityInfo, SetSecurityInfo

    作业对象

    GetNamedSecurityInfo, SetNamedSecurityInfo, GetSecurityInfo, SetSecurityInfo

     

    通用访问权限


     

    安全对象使用Windows 访问掩码格式,四个高位说明通用访问权限。每个安全对象类型映射到这些位到一系列标准和对象特殊访问权限。例如:一个Window文件对象映射GENERIC_READ位到READ_CONTROLSYNCHRONIZE 标准访问权限和FILE_READ_DATAFILE_READ_EAFILE_READ_ATTRIBUTES对象指定访问权限。其他类型对象映射GENERIC_READ位到与类型对象适应的一些访问权限。

    你可以在你打开一个对象句柄的时候使用通用访问权限来指定需要的访问类型;这通常比指定所有对应标准和特指权限要简单。

    下表显示了通用访问权限定义的常量。

    常量

    解释

    GENERIC_ALL

    读、写和执行访问

    GENERIC_EXECUTE

    执行

    GENERIC_READ

    GENERIC_WRITE

    应用程序定义的私有安全访问对象能使用通用访问权限。

    查看(1389) 评论(0) 收藏 分享 管理

  • 何时使用委托而不使用接口(C# 编程指南)

    2008-12-22 00:13:07

    From: http://msdn.microsoft.com/zh-cn/library/ms173173(VS.80).aspx
     
     
    委托和接口都允许类设计器分离类型声明和实现。给定的接口可由任何类或结构继承和实现;可以为任何类中的方法创建委托,前提是该方法符合委托的方法签名。接口引用或委托可由不了解实现该接口或委托方法的类的对象使用。既然存在这些相似性,那么类设计器何时应使用委托,何时又该使用接口呢?

    在以下情况中使用委托:

        *      当使用事件设计模式时。

        *      当封装静态方法可取时。

        *      当调用方不需要访问实现该方法的对象中的其他属性、方法或接口时。

        *      需要方便的组合。

        *      当类可能需要该方法的多个实现时。

    在以下情况中使用接口:

        *      当存在一组可能被调用的相关方法时。

        *      当类只需要方法的单个实现时。

        *      当使用接口的类想要将该接口强制转换为其他接口或类类型时。

        *      当正在实现的方法链接到类的类型或标识时:例如比较方法。

    使用单一方法接口而不使用委托的一个很好的示例是 IComparable 或 IComparable。IComparable 声明 CompareTo 方法,该方法返回一个整数,以指定相同类型的两个对象之间的小于、等于或大于关系。IComparable 可用作排序算法的基础,虽然将委托比较方法用作排序算法的基础是有效的,但是并不理想。因为进行比较的能力属于类,而比较算法不会在运行时改变,所以单一方法接口是理想的。

  • .Net 中的序列化与反序列化

    2008-12-06 00:07:07

    一、概述
       
    当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。
        把对象转换为字节序列的过程称为
    对象的序列化。
        把字节序列恢复为对象的过程称为对象的反序列化。

        二、对象的序列化主要有两种用途:
      
      1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
       
    我们经常需要将对象的字段值保存到磁盘中,并在以后检索此数据。尽管不使用序列化也能完成这项工作,但这种方法通常很繁琐而且容易出错,并且在需要跟踪对象的层次结构时,会变得越来越复杂。可以想象一下编写包含大量对象的大型业务应用程序的情形,程序员不得不为每一个对象编写代码,以便将字段和属性保存至磁盘以及从磁 盘还原这些字段和属性。序列化提供了轻松实现这个目标的快捷方法。公共语言运行时 (CLR) 管理对象在内存中的分布,.NET 框架则通过使用反射提供自动的序列化机制。对象序列化后,类的名称、程序集以及类实例的所有数据成员均被写入存储媒体中。对象通常用成员变量来存储对其他实例的引用。类序列化后,序列化引擎将跟踪所有已序列化的引用对象,以确保同一对象不被序列化多次。.NET 框架所提供的序列化体系结构可以自动正确处理对象图表和循环引用。对对象图表的唯一要求是,由正在进行序列化的对象所引用的所有对象都必须标记为 Serializable(请参阅基 本序列化)。否则,当序列化程序试图序列化未标记的对象时将会出现异常。当反序列化已序列化的类时,将重新创建该类,并自动还原所有数据成员的值。
     
      2) 在网络上传送对象的字节序列。
       
    对象仅在创建对象的应用程序域中有效。除非对象是从MarshalByRefObject派生得到或标记为 Serializable,否则,任何将对象作为参数传递或将其作为结果返回的尝试都将失败。如果对象标记为 Serializable,则该对象将被自动序列化,并从一个应用程序域传输至另一个应用程序域,然后进行反序列化,从而在第二个应用程序域中产生出该对象的一个精确副本。此过程通常称为按值封送。如果对象是从MarshalByRefObject派生得到,则从一个应用程序域传递至另一个应用程序域的是对象引用,而不是对象本身。也可以将从MarshalByRefObject派生得到的对象标记为Serializable。远程使用此对象时,负责进行序列化并已预先配置为SurrogateSelector的格式化程序将控制序列化过程,并用一个代理替换所有从MarshalByRefObject派生得到的对象。如果没有预先配置为SurrogateSelector,序列化体系结构将遵从下面的标准序列化规则.

        三、.NET提供了三种序列化方式
        [1]、XML Serializer
        [2]、SOAP Serializer
        [3]、BinarySerializer

       
     四、基本序列化
       
    要使一个类可序列化,最简单的方法是使用 Serializable 属性对它进行标记,如下所示:
       
     [Serializable] 
        public class MyObject 
        { 
            public int n1 = 0; 
            public int n2 = 0; 
            public String str = null; 
        } 
      
     [BinarySerializer]
        将此类的一个实例序列化为一个文件:  

    MyObject obj = new MyObject(); 
    obj.n1 = 
    1
    obj.n2 = 
    24
    obj.str = 
    "一些字符串"
    IFormatter formatter = 
    new BinaryFormatter(); 
    Stream stream = 
    new FileStream("MyFile.bin", FileMode.Create, 
    FileAccess.Write, FileShare.None); 
    formatter.Serialize(stream, obj); 
    stream.Close(); 

        反序列化:

    IFormatter formatter = new BinaryFormatter(); 
    Stream stream = 
    new FileStream("MyFile.bin", FileMode.Open, 
    FileAccess.Read, FileShare.Read); 
    MyObject obj = (MyObject) formatter.Deserialize(fromStream); 
    stream.Close(); 

      [XMLSerializer]
        将此类的实例序列化成一个Xml文件.

    XmlSerializer ser = new XmlSerializer(obj.GetType());
    ser.Serialize(
    new FileStream(@"users.xml", FileMode.Create), obj);

        反序列化:

    XmlSerializer serializer = new XmlSerializer(Type.GetType("MyObject"));
    MyObject my=(MyObject)serializer.Deserialize(new FileStream(@
    "users.xml",FileMode.Open));

        说明:使用二进制格式化程序进行序列化。您只需创建一个要使用的流和格式化程序的实例,然后调用格式化程序的 Serialize 方法。流和要序列化的对象实例作为参数提供给此调用。类中的所有成员变量(甚至标记为 private 的变量)都将被序列化,但这一点在本例中未明确体现出来。在这一点上,二进制序列化不同于只序列化公共字段的 XML 序列化程序。将对象还原到它以前的状态也非常容易。首先,创建格式化程序和流以进行读取,然后让格式化程序对对象进行反序列化。    
        [SOAP Serializer]
        如果要求具有可移植性,请使用 SoapFormatter。所要做的更改只是将以上代码中的BinaryFormatter换 SoapFormatter,而 Serialize 和 Deserialize 调用不变。

  • 如何使用 Windows Installer XML 工具集

    2008-12-03 23:18:15

    From:http://msdn.microsoft.com/zh-cn/beginner/bb308771.aspx

    ------------------------------------------------------

    如何使用 Windows Installer XML 工具集
    创建应用程序安装程序


    在软件应用程序方面投入大量精力后,接下来还要花费大量时间来创建一个安装程序,才能与世界共享您的成果。创建可靠、功能强大且便于维护的安装程序包不仅令人生畏,而且相当耗时。因此,此项工作往往需要雇用许多软件开发人员来提供专业指导。幸运的是,非专业人员也拥有很多选择,不仅可以不费吹灰之力地创建简单的安装程序包,而且仍可充分利用 Microsoft Windows 提供的功能强大的安装服务。在本文中,我们将介绍 Windows Installer XML (WiX) 工具集,并尝试将其与其他可用安装程序技术配合使用。

    目录



    为工作选择合适的技术

    通常,可采用多种不同的安装方法在用户的计算机上安装软件。第一种方法只需将所需文件复制到计算机上,但这可能无法构成一个真正的安装程序。这种文件复制方法可以通过网络、CD 甚至是 Web 来执行。如果您拥有一个可以独立运行且不需要任何其他设置的应用程序,则可以使用这种方法 — 最简单的解决方案可能就是最佳的解决方法。

    另一种方法是使用 Microsoft 的 ClickOnce 技术,用户可以通过速成版中的发布向导访问该技术。ClickOnce 是用于托管应用程序的最佳选择,几乎无需自定义安装过程即可完成安装。但是,如果安装时需要执行任务(如创建虚拟 Web 目录、创建新用户帐户或添加注册表项),则需要考虑其他安装方法。

    您可以创建自己的自定义安装程序或为用户提供脚本和说明,但这种方法可能会由于种种原因导致其无法执行。创建自己的功能强大的安装程序非常困难并耗时,而且还会对那些已习惯使用更常见产品的用户造成困扰。从可用性和可维护性两方面来看,提供分布说明或脚本也不够理想。

    当前,Microsoft Windows Installer 技术的使用相当普遍。大多数 Windows 用户已非常熟悉通用界面,用户可在该界面上选择安装位置、选择功能、修复和卸载等。

    屏幕快照 1
    屏幕快照 1 — 安装过程中的通用用户界面屏幕

    Windows Installer 与操作系统紧密集成,因此可确保开发人员使用的通用平台能够在客户的计算机上使用。甚至某些最常用的第三方安装程序创建软件(如 InstallShield 和 Wise)在内部也使用 Windows Installer 技术。尽管许多简化 Windows Installer 使用的第三方工具都收取一定的费用,但有些社区项目成果仍值得看一下。在本文中,我们将介绍这样一个社区项目,名为 Windows Installer XML 工具集(简称 WiX)。

    Windows Installer 简介

    让我们简单介绍一下 Windows Installer,以便更好地了解用来构建 WiX 的平台。Windows Installer 随 Microsoft Windows 的各种版本一起分发,通常作为一种服务来实现高可用性。使用 MSI 扩展的安装文件包含 Windows Installer 安装软件应用程序必需的所有数据文件和结构。对于 Windows Installer,我们主要负责告诉安装程序服务需要安装“什么”,而不只是“如何安装”。

    使用 Windows Installer 的好处包括可以按需安装、失败时回滚、自我修复、修补和卸载等。有关 Windows Installer 的详细信息,请参阅本文最后的参考资料和资源部分。现在,我们来看一下 WiX 工具集能为我们提供哪些服务。预先掌握一些 XML 知识!

    WiX 工具集背景

    实际上,WiX 起初作为 Microsoft 的内部工具使用,至今仍在产品团队中广泛使用。Rob Mensching 的博客文章(发布于 2004 年 4 月 5 日)中将 WiX 工具集的发布称为一个开放源项目,而 Microsoft Office、SQL Server、BizTalk、Virtual PC 和 Instant Messenger 都属于使用 WiX 工具集进行打包的产品。这证明了非常重要的一点 — WiX 可帮助您完成安装要求所需的任何操作!

    WiX 工具集提供了可描述 Windows Installer 数据库文件(我们先前讨论的 MSI 文件)的架构,同时还提供了大量用于编译 WiX 源文件并将其链接到最终工作数据库的工具。从更高层次来看,确实也没有其他更重要的要求了。对于 WiX 和 Windows Installer 数据库,您需要了解大量相关详细信息,但对这些工具或提供的其他资源有一些基本了解后,则完全能够满足应用程序安装要求并将其转换为功能完备的安装程序。

    下载和安装 WiX 工具集

    目前,官方 WiX 项目由 SourceForge 托管,网址为 http://wix.sourceforge.net/。在此,您可以找到最新的新闻、文档和更新。出于本文的目的,请下载撰写本文时作为当前稳定版本列出的版本 2.0 二进制程序包。浏览 WiX 下载页面的版本 2.0 分支时,您会发现还提供了另外两个程序包,其中一个包含源代码,另一个包含名为 Votive 的项目,该项目可为 Visual Studio Standard 或更高版本增添集成的 WiX 支持功能。您只需下载二进制程序包,即可以使用 WiX 工具集。

    将 WiX 2.0 二进制程序包下载到开发系统,然后将二进制程序包的内容解压缩到所选位置。WiX 工具集的主要文件夹包括命令行工具,用来生成、编译 WiX 代码并将其链接到功能完备的 MSI 文件。此外,文档和示例均可从它们各自相应的目录中获得。WiX.chm 帮助文件包含所有可用的文档,是使用 WiX 工具集时可保持打开状态的重要参考工具。

    WiX 简介

    所有 WiX 源文件均以打开的根元素 < Wix/ > 开头,后面必须有一个 < Product/ > 或一个 < Module/ > 子元素,然后可有多个可选 < Fragment/ > 元素或根本不使用此元素。使用 < Product/ > 元素将生成一个 .msi(Windows Installer 数据库文件)。您还可以通过 < Module/ > 元素创建一个使用 .msm 扩展名的合并模块。合并模块是独立的程序包,可以合并到 .msi 产品中。最后,通过 < Fragment/ > 元素,您可以定义可从其他 WiX 代码中引用的 WiX 片段。安装规模扩大后,创建片段的功能就派上用场了。

    请看下面与 WiX 相关的结构都必须使用的代码:

    < ?xml version='1.0'? >
    < Wix xmlns='http://schemas.microsoft.com/wix/2003/01/wi' >
    < /Wix >

    创建 WiX 源文件框架后,安装程序的创建过程才真正开始。安装程序的典型任务包括部署文件、创建目录结构、向“添加/删除程序”注册、执行自定义操作以及添加用户帐户、SQL 数据库和 Web 应用程序。从 WiX 帮助文件的 WiX 架构中查看可用元素(位于 WiX 帮助 | 编写 | Wix 架构节点下)。您可以看到,共有 230 多个可用元素,因此创建安装程序可能有些复杂。不过,创建安装程序通常只需使用这些元素中的一小部分。

    以下 WiX 代码(可从 WiX 二进制程序包的“examples\first”目录中直接获取)显示了如何创建应用程序,该应用程序将在“Program Files”中创建一个目录、复制文本文件并向“添加/删除程序”注册。

    < Wix xmlns='http://schemas.microsoft.com/wix/2003/01/wi' >
      < Product Id='12345678-1234-1234-1234-123456789012' Name='Test Package'
        Language='1033' Version='1.0.0.0' Manufacturer='Microsoft Corporation' >
        < Package Id='12345678-1234-1234-1234-123456789012'
          Descrīption='My first Windows Installer package'
          Comments='This is my first attempt at creating a Windows Installer database'
          InstallerVersion='200' Compressed='yes' / >

        < Media Id='1' Cabinet='product.cab' EmbedCab='yes' / >

        < Directory Id='TARGETDIR' Name='SourceDir' >
          < Directory Id='ProgramFilesFolder' Name='PFiles' >
            < Directory Id='MyDir' Name='TestProg' LongName='Test Program' >
              < Component Id='MyComponent' Guid='12345678-1234-1234-1234-123456789012' >
                < File Id='readme' Name='readme.txt' DiskId='1' src='readme.txt' / >
              < /Component >
            < /Directory >
          < /Directory >
        < /Directory >

        < Feature Id='MyFeature' Title='My 1st Feature' Level='1' >
          < ComponentRef Id='MyComponent' / >
        < /Feature>
      < /Product >
    < /Wix >

    关于上述 WiX 示例,有必要说明一下其中显示的某些详细信息。您可以想到,< Wix\ > 元素仅包含一个子元素(< Product\ > 元素)。在 WiX 帮助文件的 WiX 架构部分中查看“Product 元素”页。如果向下滚动到“属性”部分,您可以看到为 Product 元素定义的属性,其中包括必需的属性。因此,可以证明 WiX 示例代码确实提供了 Product 元素需要的所有属性。

    表 1 — Product 元素属性(部分列表)

    名称

    类型

    说明

    必需

    Id

    Autogenuuid

    产品的产品代码 GUID。

    语言

    LocalizableInteger

    产品的十进制语言 ID (LCID)。

    制造商

    字符串

    产品制造商。

    名称

    字符串

    产品的描述性名称。

    版本

    字符串

    产品的版本字符串。

    < Package\ > 元素是 Product 元素和 Module 元素的必需子元素。该包介绍了作为部分 .msi 摘要流提供的属性,在资源管理器中将鼠标停留在 .msi 上方时就会看到这些属性。以下屏幕快照中显示了 Descrīption 和 Comments 属性。

    查看 WiX 帮助文件文档中 Package 元素的其他可用属性。请注意,我们可以指定安装程序版本、文件压缩,甚至安装权限(如果面向 Windows Vista)。

    表 2 — Package 元素属性(部分列表)

    名称

    类型

    说明

    必需

    Id

    Autogenuuid

    SKU 的程序包代码 GUID。

    AdminImage

    YesNoType

    如果源是管理映像,则设置为“是”。

     

    注释

    字符串

    可选注释(用于浏览)。

     

    压缩

    YesNoType

    如果设置为“是”,则源中可包含压缩文件。

     

    说明

    字符串

    产品的完整名称或说明。

     

    InstallerVersion

    整数

    最低安装程序版本(最大数*100 + 最小数)。

     

    InstallPrivileges

    枚举

    通过此属性指定在 Windows Vista 或更高版本上安装此程序包所需的权限。此属性的值应为下列值之一:

    受限

    设置为此值表明该程序包无需提升权限即可安装。

    提升

    设置为此值表明该程序包需要提升权限才能进行安装。此为默认值。

     

    制造商

    字符串

    发布此包的供应商。

     

    平台

    字符串

    此程序包支持的平台列表。

     

    对于许多安装程序(例如本示例),最好在 MSI 中将所有安装源文件打包在一起。通过 Media 元素,我们只需指定希望将文件存储到压缩和嵌入式 .cab 文件即可。但是,更大的安装程序可能需要跨多个磁盘。在这种情况下,您需要在 WiX 源文件中定义多个 Media 元素,并根据需要将资源分配到每个磁盘中。

    表 3 — Media 元素属性(部分列表)

    名称

    类型

    说明

    必需

    Id

    整数

    Media 表的磁盘标识符。此数值必须等于或大于 1。

    Cabinet

    字符串

    Cabinet 的名称(如果将存储在媒体上的部分文件或所有文件都压缩到了 Cabinet 文件中)。如果未使用任何 Cabinet,此属性必须为空。

     

    DiskPrompt

    字符串

    磁盘名称,通常是磁盘上印刷的可见文本。此文本可本地化,用于提示用户何时需要插入此磁盘。此值将用于 DiskPrompt 属性的“[1]”中。使用此属性需要定义 DiskPrompt 属性。

     

    EmbedCab

    YesNoType

    如果设置为“是”,则指示活页夹将 Cabinet 嵌入到产品中。此属性只能与 Cabinet 属性一起指定。

     

    VolumeLabel

    字符串

    该标签指示卷的属性。这是 GetVolumeInformation 函数返回的卷标。如果 SourceDir 属性指的是可移动(软盘或 CD-ROM)卷,则在尝试安装文件之前可通过此卷标验证驱动器中是否存在适当的磁盘。此列中的条目必须与物理媒体的卷标匹配。

     

    本示例的下一步介绍如何定义位置以及要安装的文件。即使以前没有用过 WiX 或 Windows Installer,您也可能猜到此步骤是要创建“\Program Files\Test Program”文件夹中 readme.txt 文件的副本。乍看起来,嵌套 Directory 元素系列可能有些混乱。因此,让我们更详细地介绍一下相关信息。

    < Directory Id='TARGETDIR' Name='SourceDir' >
      < Directory Id='ProgramFilesFolder' Name='PFiles' >
        < Directory Id='MyDir' Name='TestProg' LongName='Test Program' >

    MSI 数据库要求将单个根目标目录定义为 < Directory Id='TARGETDIR' Name='SourceDir' >。“TARGETDIR”和“SourceDir”属性都可被 Windows Installer 识别。如果“TARGETDIR”属性是通过命令行或用户界面定义的,则使用此属性解析目标路径。就我们的简单安装程序而言,不会对此进行定义,Windows Installer 将默认使用“ROOTDRIVE”属性,类似于“C:\”。“SourceDir”属性仅表示包含安装程序包的目录。

    下一个 Directory 元素是根目标目录的子目录,被定义为 < Directory Id='ProgramFilesFolder' Name='PFiles' >。“ProgramFilesFolder”是另一个 Windows Installer 属性,指示系统上预定义 Program Files 文件夹的完整路径。有关其他可用系统文件夹属性的示例,请参阅 MSDN 库中的系统文件夹属性。在此,我们可以查看“C:\Program Files\”的目标安装文件夹。

    最后,我们将最后一个 Directory 元素定义为 < Directory Id='MyDir' Name='TestProg' LongName='Test Program' >。这次,“MyDir”Id 属性并不是已定义的属性,因此将使用默认的 Name 属性或 LongName 属性。这就完成了本示例的目录结构,可能是“C:\Program Files\Test Program\”。

    表 4 — Directory 元素属性(部分列表)

    名称

    类型

    说明

    必需

    Id

    字符串

    此值是目录条目的唯一标识符。

    FileSource

    字符串

    用于为此目录的子元素设置文件系统源。

     

    LongName

    LongFileNameType

    将此值设置为该目录的非 8.3 名称。除非使用 Name 属性设置该目录的短名称,否则无法指定该属性。

     

    LongSource

    LongFileNameType

    在支持长名称的系统的源媒体上,将此值设置为该目录的非 8.3 名称。除非使用 SourceName 属性为此目录设置了源名称,否则无法指定该属性。

     

    名称

    字符串

    目录的 8.3 名称。如果此目录与父目录代表相同的目录,则不要指定此属性(或 LongName 属性)。有关“.”运算符的详细信息,请参阅 Windows Installer SDK 的 Directory 表主题。

     

    SourceName

    ShortFileNameType

    源媒体上目录的 8.3 名称。如果未指定此属性,则 Windows Installer 将使用默认的 Name 属性。

     

    设置好目录结构后,接下来我们便可以指定要安装的文件组件了。为方便起见,下面列出了示例中的相关代码段:

    < Component Id='MyComponent' Guid='12345678-1234-1234-1234-123456789012' >
      < File Id='readme' Name='readme.txt' DiskId='1' src='readme.txt' / >
    < /Component >

    由 GUID 唯一定义的组件可以表示资源,如文件、证书、环境变量、COM 注册、注册表项、服务、SQL 数据库和网站。在我们的示例中,我们只需安装文本文件,其中“src”属性指构建过程中 readme.txt 文件的位置。DiskId 属性指先前定义的媒体 Id 属性。

    表 5 — Component 元素属性(部分列表)

    名称

    类型

    说明

    必需

    Id

    字符串

    Component 标识符;这是标识组件的主键。

    Guid

    ComponentGuid

    此值应是一个 GUID,以便唯一标识此组件的内容、语言、平台和版本。此外,还可以将此值设置为空字符串以指定非托管组件。由于 Windows Installer 无法删除或修补非托管组件(实际上,它是不可修补的永久性组件),所以这些组件是一种安全漏洞。因此,对于包含将来可能需要修补的资源的任何组件,应始终为其指定 GUID。

    位置

    枚举

    此属性的值应为下列值之一:

    本地

    防止组件从源或网络运行(如果未设置此属性,则默认为此行为)。

    确保组件只能从源运行(无法从用户的计算机运行)。

    两者中的任意一个

    允许组件从源或从本地运行。

     

    永久

    YesNoType

    如果将此属性设置为“是”,则在卸载过程中安装程序不会删除该组件。安装程序将在 Windows Installer 注册表设置中为该组件注册额外的系统客户端(这一般意味着至少有一个产品经常引用此组件)。请注意,此选项与不设置 GUID 的行为不同,因为尽管该组件是永久性的,但仍可对其进行修补(因为 Windows Installer 仍然能够跟踪它),只是不可卸载。

     

    可传递

    YesNoType

    如果将此属性设置为“是”,安装程序将在重新安装时重新计算 Condition 语句中的值。如果此值先前为 False,但现已更改为 True,则安装程序将安装该组件。如果此值先前为 True,但现已更改为 False,则即使该组件拥有其他产品作为客户端,安装程序也会将其删除。

     

    请务必注意,Windows Installer 将添加到组件的所有资源视为原子单元,其中的所有内容都作为一个整体进行安装和卸载。因此,建议将各种资源置于其自己的组件中,有特殊需求则另当别论。例如,如果您希望添加指向桌面上文本文件的链接,则最好将其置于同一组件中。

    由于此安装程序中至少包括一个组件,因此,我们需要为它定义一个父 Feature 元素。此步骤目前看来可能是多余的,但这是因为我们的安装程序只有一个组件,并且没有 UI。当需要安装多个组件和逻辑应用程序段(其中一些是可选的)时,创建功能集就变得非常必要了。例如,通常安装程序会将应用程序的核心功能与可选帮助文件分开。

    提醒一下,我们的简单示例中的 Feature 元素类似以下内容:

    < Feature Id='MyFeature' Title='My 1st Feature' Level='1' >
      < ComponentRef Id='MyComponent' / >
    < /Feature >

    Feature 元素将“MyFeature”定义为包括先前定义的单个组件。同样,由于本示例中我们不为用户提供 UI,因此,此功能实际上是必需的。

    现在,让我们使用示例 WiX 源代码生成 Windows Installer 程序包,通过下列步骤应可将该程序包安装到几乎任何 Windows 计算机上:

    • 选择开始 | 所有程序 | 附件 | 命令提示符打开“命令提示符”窗口。
    • 在“命令提示符”窗口中导航到 WiX 二进制安装位置的“\examples\first”文件夹。
    • 通过发出命令,验证 product.wxs 包含我们先前讨论的示例代码
      >notepad product.wxs
    • 通过发出命令,将 WiX 工具集二进制文件夹添加到环境路径中(将 < WiXbinaries> 替换为您计算机上的安装位置):
      >path = %path%; < WiXbinaries>
    • 通过以下命令,使用 Candle.exe 编译器工具编译 product.wxs 源文件:
      >candle product.wxs
      编译步骤最后将生成名为 product.wixobj 的 WiX 对象文件。
    • 通过以下命令,使用 Light.exe 链接程序工具链接 product.wixobj 对象文件:
      >light product.wixobj
      链接步骤最后将生成名为 product.msi 的 Windows Installer 数据库文件。
    • 在“命令提示符”窗口中键入示例产品全名或通过资源管理器双击该产品来安装此产品。请注意,显示给我们的是部分进度 UI 信息,而整个过程完成时不会有进一步交互。
    • 通过导航到“Program Files”文件夹并查找包含 readme.txt 文件的“Test Program”文件夹,验证安装程序是否可正常运行。
    • 通过在添加/删除程序控制面板小程序中执行一些必要的步骤,验证卸载操作同样可正常运行。此外,您还可以在“命令提示符”窗口中发出以下命令:
      >msiexec /x product.msi

    在 Visual Studio Express IDE 中使用 WiX

    在结束 WiX 讨论之前,让我们花几分钟来自定义一下 Visual Studio 速成版环境,以便获得 WiX Intellisense 支持以及一些可用的 WiX 模板文件。Intellisense 是 Visual Studio 中的一项技术,使您能够通过键入某个词(如类名称或 XML 标记)的一部分,就可看到一列可能的匹配项和说明。稍后您将看到,此工具在手动编辑 WiX 代码时非常有用!

    为 WiX 添加 Intellisense 支持:

    • 导航到 WiX 安装的“Doc”文件夹
    • 将所有 XML 架构文件(XSD 扩展名)复制到 Visual Studio 安装位置中的“\XML\Schemas”文件夹(通常位于“\Program Files\Microsoft Visual Studio 8\”中)


    添加 WiX 模板文件:

    • 从 Word 文档所在的同一位置下载 WiX 模板 Zip 文件包 (WiXTemplates.zip)。
    • 将 WiX 模板 Zip 包的所有内容解压缩到“\My Documents\Visual Studio 2005\Templates\Item Templates”文件夹中。
    • 验证“WiX Merge Module.zip”“WiX Product.zip”均位于 ItemTemplates 文件夹中。

    如果使用 Windows Installer 数据库文件和扩展 WiX 源文件,则必须生成全局唯一标识符 (GUID)。GUID 可以使用多种格式表示,具体取决于它们的用途,但是我们将使用以下格式:

    “01234567-89AB-CDEF-0123-456789ABCDEF”

    或使用

    {“01234567-89AB-CDEF-0123-456789ABCDEF”}

    由于需要生成唯一的 GUID,因此,必须使用能够为我们完成此操作的工具。以下是一些建议:

    • 安装 Microsoft Visual C++ 2005 速成版,并使用 Guidgen.exe 实用程序(位于 \Program Files\Microsoft Visual Studio 8\Common7\Tools 中)。使用“注册表格式”选项以 WiX 兼容格式创建 GUID。
    • 创建自己的应用程序。可以使用 System.Guid 类及其静态的 NewGuid() 方法来生成新的 GUID。
    • 在线查找其他 GUID 生成工具。例如,尝试访问 http://www.guidgen.com


    配合使用

    在此部分中,我们将为一个简单的 Windows 应用程序创建安装程序,借此整理目前为止学到的所有内容。

    任务 1:创建 WiX 源。

    • 打开您所使用的 Visual Studio 速成版的一个实例。
    • 选择文件 | 新建项目创建一个新项目。同时,将加载“新建项目”窗口。
    • 选择Windows 应用程序项目模板,并添加一个便于以后记下的名称。
    • 确定按钮以生成新的 Windows 应用程序项目。
    • 在解决方案资源管理器中,右键单击该项目并从上下文菜单中选择添加 | 新项,将新的 WiX 源文件添加到该项目中。
    • 在“添加新项”窗口中,向下滚动我的模板部分。
    • 选择WiX 产品模板。
    • 添加按钮将新的 WiX 产品源文件添加到该项目中。
    • 选择文件 | 保存所有文件将该项目保存到磁盘。请记住该项目的名称,因为稍后该名称将非常重要。
    • 在“Program Files”文件夹中选择一个适当的安装位置,并将其分配到 Directory 元素的 LongName 属性,将其 ID 命名为“INSTALLATIONLOCATION”。
    • Component 元素 Id更改为更合适的名称,如“MyApp”。注意:此处不能使用空格。
    • 更改ComponentRef 元素 Id,使其与上一步骤中修改的 Component 元素 ID 匹配。
    • 使用以下代码为 Component 元素添加新的 File 子元素:
      < File Id="app" Name="MyApp.exe" DiskId="1" src="WiXInstallTest.exe" />
      请注意,File 元素的“src”属性应与生成的可执行文件的名称(默认为项目名称)匹配。
    • 使用以下代码为 File 元素添加新的 Shortcut 子元素:
      < Shortcut Id="desktopShortcut" 
         Name="WiXTest" LongName="WiX Test 1.0" 
         Directory="DesktopFolder" />

      请注意,务必确保 Shortcut 是 File 元素(而不是 Component 元素)的子元素。我们希望创建一个桌面快捷方式,直接指向该文件。“DesktopFolder”是 Windows Installer 可以识别的属性,用于表示用户桌面。
    • 在最后一个 Directory 元素结束标记前添加以下 Directory 元素:
      < Directory Id="DesktopFolder" Name="Desktop" />
      < /Directory>

      请注意,上文显示的 < /Directory> 结束标记并不是新的,它只是用来显示需要将新 Directory 元素置于何处的引用标记。
    • 生成新的 GUID,并将其分配到显示“PUT-GUID-HERE”Component Guid 属性中。
    • 生成新的 GUID,并将其分配到显示“PUT-GUID-HERE”ProductId 属性中。


    任务 2:修改该项目以执行生成后步骤。

    注意:该任务仅适用于 C#、J# 和 C++ 用户。如果您使用的是 VB,则需要自己编译和链接 WiX 代码。

    • 在解决方案资源管理器中,右键单击您的项目,然后从上下文菜单中选择属性
    • 选择生成事件选项卡(适用于 C# 和 J#)
      或者
      选择配置属性 | 生成事件 | 生成后事件节点(适用于 C++)。
    • “生成后事件命令行”文本框中,输入以下内容:
      "C:\wix 2.0.4820.0-binaries\candle.exe" "WiXProduct1.wxs"
      "C:\wix 2.0.4820.0-binaries\light.exe" "WiXProduct1.wixobj"
    • 在解决方案资源管理器中,选择WiX 源文件并查看属性窗口。
    • “复制到输出目录”属性更改“如果较新则复制”


    任务 3:生成和测试部署

    • 从主菜单中选择生成 | 生成解决方案
    • 导航\Build\Debug 文件夹,然后执行安装程序
    • 验证指向该应用程序的桌面链接可正常运行。
    • 通过控制面板中的添加/删除程序卸载该应用程序。


    概述

    在本文中,我们介绍了 Windows Installer XML 工具集,并简述了它可以执行哪些操作来满足您的安装要求。在开发计算机上安装 WiX 工具集并将其与生成环境集成后,创建新的安装程序就比较简单了,但在涉及的许多细节方面还是有点复杂。

    请务必注意,一定要根据安装要求权衡您的选择,从而确定是否真的有必要创建完整的 Windows Installer 数据库。例如,如果创建了独立的 Windows 窗体或 Windows Presentation Framework 应用程序,则使用 ClickOnce 技术可为开发人员和用户简化部署过程。

    请记住,我们仅泛泛地讨论了此主题,通过 WiX,您还可以执行自定义操作、定义用户界面、执行 COM 组件注册等。有关更多详细信息,请参阅 WiX 文档以及 WiX 官方站点(两者均可在下面的参考资料部分中找到)。

    参考资料和其他资源

    Windows Installer XML 工具集官方站点

    Rob Menching 博客文章(WiX 特约撰稿人)

    Justin Rockwood 博客(WiX 特约撰稿人)

    选择部署策略
    http://msdn2.microsoft.com/library/e2444w33(VS.80).aspx

    Windows Installer 部署

    Windows Installer 最佳实践

    Windows Installer Wikipedia 文章

  • MindManager

    2008-11-23 23:58:50

    From: http://bbs.21manager.com/dispbbs.asp?n=161,59892,0,0,0,0,0,0

    思维导图的"三招十八式"

    已下定决心把这些PPT做成系列了,目前出了四期,先用个贴子把这些全链接起来,以便大家查阅下载。说明一下,做成PPT格式主要是为了方便对导图还不熟悉的家人了解认识思维导图,目前暂列八题是因为我只考虑到这一步,全部做成系列大约是十八到二十个PPT,争取每星期能完成补充一个。

    第一招共十二式

    1.乾坤挪移 http://www.21manager.com/dispbbs.asp?n=161,57775,0,0,0,0,0,0

    2.蛱蝶穿花 http://www.21manager.com/dispbbs.asp?n=161,58289,0,0,0,,0,0

    3.朝云暮雨 http://www.21manager.com/dispbbs.asp?n=161,58828,0,0,0,,0,0

    4.移影幻画 http://www.21manager.com/dispbbs.asp?n=161,59785,0,0,0,,0,0

    5.一意孤行 http://www.21manager.com/dispbbs.asp?n=161,60221,0,0,0,,0,0
       一意孤行(续) http://www.21manager.com/dispbbs.asp?n=161,60668,0,0,0,,0,0
     
    6.多管齐下(上)  http://www.21manager.com/dispbbs.asp?n=161,61021,0,0,0,,0,0
       多管齐下(下)  http://www.21manager.com/dispbbs.asp?n=161,61364,0,0,0,,0,0
     
    7.水静潜龙 http://www.21manager.com/dispbbs.asp?n=161,62901,0,0,0,,0,0

    8.野旷骋马 http://www.21manager.com/dispbbs.asp?n=161,63340,0,0,0,,0,0

    9.桥多通路 http://www.21manager.com/dispbbs.asp?n=161,63701,0,0,0,,0,0

    10.刀快断麻(上)  http://www.21manager.com/dispbbs.asp?n=161,64660,0,0,0,,0,0 
         刀快断麻(下)  http://www.21manager.com/dispbbs.asp?n=161,65791,0,0,0,,0,0
      
    11.吐哺周公 http://www.21manager.com/dispbbs.asp?n=161,65902,0,0,0,,0,0

    12.垂钓子牙 http://www.21manager.com/dispbbs.asp?n=161,66307,0,0,0,,0,0
         垂钓子牙(续)  http://www.21manager.com/dispbbs.asp?n=161,67463,0,0,0,,0,0 

    第二招共三式

    13.信传烽火 http://www.21manager.com/dispbbs.asp?n=161,68169,0,0,0,,0,0

    14.蒂落熟瓜 http://www.21manager.com/dispbbs.asp?n=161,70530,0,0,0,,0,0

    15.昭君落雁 http://www.21manager.com/dispbbs.asp?n=161,72362,0,0,0,,0,0

    第三招共三式


    16.西施浣纱(上) http://www.21manager.com/dispbbs.asp?n=161,72859,0,0,0,,0,0
         西施浣纱(下) http://www.21manager.com/dispbbs.asp?n=161,74150,0,0,0,,0,0


    17.青梅煮酒(上) http://www.21manager.com/dispbbs.asp?n=161,78710,0,0,0,,0,0
         青梅煮酒(下) http://www.21manager.com/dispbbs.asp?n=161,79731,0,0,0,,0,0

    18.红叶煎茶(上) http://www.21manager.com/dispbbs.asp?n=161,84763,0,0,0,,0,0
       .红叶煎茶(下) http://www.21manager.com/dispbbs.asp?n=161,85966,0,0,0,,0,0

     

  • 软件测试自动化框架

    2008-11-23 23:40:42

    From:http://hi.baidu.com/%CA%D5%C1%B2%BA%AF%CA%FD/blog/item/04a9474330f8c8179313c6c6.html

      软件测试是在软件开发周期中必不可少的、耗时的一部分。为了保持与产品的开发和发布同步,我们需要实现一种有效的、可重用的软件测试自动化框架。

       本文详细阐述了当今存在的几种自动化测试框架,并进行了比较;然后介绍了一个关键字驱动的自动化测试模型.以说明框架的具体实现方法。
      自动化测试在过去的20年中已经有了很大的发展。最初的测试工具只提供了简单的捕捉/回放功能:记录并播放键盘按键,然后捕捉和比较屏幕。这些测试方法虽然最容易应用,但是几乎不可能维护。录制回放工具最终被功能和灵活性更强的测试脚本工具代替。
      但是,脚本工具也有自己的问题。他们实现起来需要很强的开发技术和经验,同时,不确定它们是一定可以维护的。更糟糕的是高度个性化的脚本工具技术.加上没有什么文档记录,最后的结果经常是重写包含成千上万行代码的脚本库,成本开销巨大。
      后来,一种新的自动化测试产品——自动化测试框架出现了,它可以减少实现和维护的成本,使测试人员可以把精力集中在应用程序的测试用例设计上,而不是开发测试。
      
      常用的自动化测试框架
      
      所谓自动化测试框架,是由一些假设,概念和为自动化测试提供支持的实践组成的集合。接下来将描述一下几种比较常用的自动化测试框架:
      
      1.录制/回放的神话
      每一家自动化测试工具厂商都会宣传,他们的工具非常容易使用,没有技术背景的测试人员只要简单录制测试的操作过程,然后播放录制好的测试脚本,就可以轻松自动化所有的测试。这样的说法是非常不负责的。
      现在我们来分析一下自动化测试不能单单只依靠录制/回放来完成的原因。
      通过录制建立的脚本,基本上都是用脚本语言以硬编码的方式编写的,当应用程序变动时,这些硬编码也随之需要更改。因此,维护这些录制好的脚本,成本是非常高的,高到几乎不能接受。
      所有的测试脚本都必须是在应用程序可以正确执行时才能录制,如果在录制过程中发现缺陷,测试人员必须向缺陷管理机制报告,等到该缺陷修正了,整个录制脚本的动作才能继续下去。在这样的情况下,如果仅仅依靠录制脚本来进行测试,效率是十分低下的。
      同时,这些录制好的脚本不是非常可靠,甚至在应用程序完全没有变动的情况下直接播放,也可能因为一些意外状况而无法执行。如果录制脚本时测试人员使用了错误的脚本语言,则脚本就必须重新录制。
      综上所述,通过录制的方式来建立自动化测试脚本的方式看似容易,但实际上会遇到下列问题:①测试人员大多不具备技术背景,难以完全掌握测试工具;②应用程序必须达到一定的稳定性,才能开始录制测试脚本;③录制的测试脚本与测试数据耦合得太紧密;④维护自动化测试脚本的成本非常高。
      因此,仅仅依靠录制/回放来完成自动化测试是远远不够的,我们应找到一种能解决上述问题并能很好地执行自动化测试的方法。
      
      2.数据驱动的自动化测试框架
      数据驱动的自动化测试是针对上述开发与测试之间紧密耦合问题提出的测试方法。通过建立测试与开发定义的软件元数据的关联——元数据映射表.在测试与开发之间建立松耦合关系。不论测试人员修改测试脚本,还是开发人员修改软件,只需要修改元数据映射表,既可以满足测试与开发同步进行。这样,可以减少测试脚本调试的工作量,更好的实现自动化测试。
      什么是数据驱动的自动化测试框架
      数据驱动的自动化测试框架是这样的一个框架,从某个数据文件(例如ODBC源文件、Excel文件、Csv文件、ADO对象文件等)中读取输入,输出的测试数据,然后通过变量传入事先录制好的或手工编写的测试脚本中。其中,这些变量被用作传递(输入/输出)用来验证应用程序的测试数据。在这个过程中,数据文件的读取、测试状态和所有测试信息都被编写进测试脚本里;测试数据只包含在数据文件中,而不是脚本里,测试脚本只是一个“驱动”,或者说是一个传送数据的机制。
      数据驱动脚本
      数据驱动脚本就是那些和应用程序相关联的脚本。这些脚本通过录制或手工编写写进自动化工具私有的语言.然后对其中的变量赋予合适的数值,作为测试数据的输入。这些变量作为一些关键应用程序输入的媒介.使脚本能通过外部的数据来驱动应用程序。
      1)可变数据,硬编码组件标志
      这些数据驱动的脚本经常包含硬编码的数据.有时是一些窗口组件中非常脆弱的识别字符串。出现这种情况时,脚本很容易由于程序的更改而失去作用。
      2)高度技术化的、重复的测试设计
      数据驱动脚本的另一个共同特点就是,所有在测试设计上所作的努力最终都体现在自动化工具的脚本语言中,或者复制到手工和自动化测试脚本中。这意味着每个和自动化测试开发或执行有关的人必须对测试环境和自动化工具的编程语言非常精通。
      优点与缺点
      1)优点:①在应用程序开发的同时就可以同步建立测试脚本,而且当应用功能变动时,只需要修改业务功能部分的脚本;②利用模型化的设计,避免重复的脚本,减少建立或维护脚本的成本;③测试输入数据,验证数据和预期的测试结果与脚本分开.存放在另外的数据文件里.利于测试人员修改和维护;④透过判断功能回传值是“True”或“Fslse”,可作错误处理,增加了测试脚本的健壮性;⑤自动化测试开发人员创建数据驱动的测试过程.测试员创建测试数据;⑥在测试的过程中收集测试结果,并在输入数据的语境中表示测试结果,这样可以简化手工结果分析。
      2)缺点:①对自动化测试工具里的脚本语言必须非常精通;②每个脚本都会对应多个数据文件,这些数据文件需要根据脚本的功能类别存放在各自的目录中,增加了使用的复杂性;③测试人员除了需要根据具体测试数据维护相应的测试计划,还要将这些数据写入各个需求不同的数据文件中;④在编辑数据文件时,必须注意测试脚本所要求的传输格式,否则会在处理脚本时产生错误。如由专门的技术人员对其进行维护,依赖于数据驱动脚本的自动化测试框架实现起来更简单、快捷。但是,维护工作困难,而且还需要保持这种数据驱动的模式,这样,即便长时间的维持也会导致失败。
      
      3.关键字驱动的自动化测试
      关键字驱动的自动化测试(也称为表驱动测试自动化),是数据驱动自动化测试的变种,可支持由不同序列或多个不同路径组成的测试。它是一种独立于应用程序的自动化框架,在处理自动化测试的同时也要适合手工测试。关键字驱动的自动化测试框架建立在数据驱动手段之上,表中包含指令(关键词),而不只是数据。这些测试被开发成使用关键宇的数据表,它们独立于执行测试的自动化工具。关键字驱动的自动化测试是对数据驱动的自动化测试的有效改进和补充。

  • EMOS Framework

    2008-11-23 23:10:16

    From: http://emos-framework.sourceforge.net/

      EMOS框架是一个简单而且强大的环境,专门用来为WinRunner开发自动的测试用例。像大多数测试框架一样,EMOS框架把测试数据从测试代码中分离,目的是简化和加速测试用例的开发,增加生产方案的健壮性,授权非开发人员专注测试的自动化等。然而,我个人观点:EMOS框架采用了区别其他框架的独一无二的方法来实现这些。

      EMOS框架是为WinRunner专门设计的,WinRunner是由Mercury Inc.开发的一个GUI测试工具。EMOS几乎完全使用WinRunner自己的脚本语言TSL实现。因为这个原因我们需要的唯一的工具就是WinRunner。然而,Excel被强烈的推荐,因为它比WinRunner自带的数据表更适合管理复杂的测试数据。

    安装

  • 走近李小龙

    2008-11-05 00:34:53

    央视正在热播《李小龙传奇》,那个主角长得挺像,但演得就不那么像了。

    看他们拍《猛龙过江》,我就温习了一下,简单的英雄救美故事,却让人看了喜欢。

    喜欢唐龙木纳的幽默,喜欢女主角刻意的诱惑。

    欣赏罗马美丽的风光,观赏角斗场终极的对决。

    自编自导自演,530万的票房,李小龙不愧为一位全才巨星。

    感悟,我一直误解李小龙是一介武夫,其实我错了!

    他是一位全才,一位令人尊敬的武术大家。

    切忌不要太过主观,要客观的看待任何人和事!

  • strstr

    2008-11-04 23:45:58

    /* Check if string B includes string A */

    bool strstr(char* A, char*  B)
    {
     char* p1 = A;
     char* p2 = B;

     if(*p1 == '/0' || *p2 == '/0')
     return false;
     
     
     while(*p2 != '/0' && *p2 != *p1)
     {
      p2++;
     }
     
     if(*p2 == '/0')
     return false;
     
     while(*p1 == *p2)
     {
      p1++;
      p2++;
     }
     
     if(*p1 == '/0')
     {
      return true;
     }
     else
     {
      return strstr(A, p2)
     }
    }

  • Writing Effective Defect Reports

    2008-11-02 22:50:23

    Author

    Kelly Whitmill

    Kelly Whitmill has over 18 years experience in software testing. Most of that time his role has been that of a team lead with responsibility for finding and implementing effective methods and tools to accomplish the required tests. He is particularly interested in practical approaches that can be effective in environments with limited resources. He has a strong interest in test automation. He has worked in both small and large company environments. He has worked on PC-based, Unix-based, and Mainframe-based projects. He currently works for the IBM Printing Systems Division in Boulder, Colorado.

    Introduction

    Effective defect reports will:

    • Reduce the number of defects returned from development
    • Improve the speed of getting defect fixes
    • Improve the credibility of test
    • Enhance teamwork between test and development

    Defect Remarks

    Here are some key points to make sure the next defect report you write is an effective one.
    1. Condense - Say it clearly but briefly
    2. Accurate - Is it a defect or could it be user error, misunderstanding, etc.?
    3. Neutralize - Just the facts. No zingers. No humor. No emotion.
    4. Precise - Explicitly, what is the problem?
    5. Isolate - What has been done to isolate the problem?
    6. Generalize - What has been done to understand how general the problem is?
    7. Re-create - What are the essentials in triggering/re-creating this problem? (environment, steps,
    conditions)
    8. Impact - What is the impact to the customer? What is the impact to test? Sell the defect.
    9. Debug - What does development need to make it easier to debug? (traces, dumps, logs,
    immediate access, etc.)
    10. Evidence - What documentation will prove the existence of the error?

    Condense:

    Say it clearly but briefly. First, eliminate unnecessary wordiness. Second, don’t add in extraneous information.

     Condense Example

    Defect Remark 

    Don’t:
    Suffers from TMI (Too Much Information), most
    of which is not helpful.

    I was setting up a test whose real intent was to
    detect memory errors. In the process I noticed a
    new GUI field that I was not familiar with. I
    decided to exercise the new field. I tried many
    boundary and error conditions that worked just
    fine. Finally, I cleared the field of any data and attempted to advance to the next screen, then the
    program abended. Several retries revealed that
    anytime there is not any data for the "product
    descrīption" field you cannot advance to the next
    screen or even exit or cancel without abending.
     Do: The "exit", "next", and "cancel" functions for the
    "Product Information" screen abends when the
    "product descrīption" field is empty or blank.

    Accurate

    Make sure that what you are reporting is really a bug.Before
    writing up the problem consider:

    • Is there something in the setup that could have caused this? For example, are the correct versions installed and all dependencies met? Did you use the correct login, security, command/task sequence and so fourth?
    • Could an incomplete cleanup, incomplete results, or manual interventions from a previous test cause this?
    • Could this be the result of a network or some other environmental problem?
    • Do you really understand how this is supposed to work?

    “it is a sin to over report, but it is a crime to under report.”

     

    If you want to know more detailed, please download it from my files.

  • 什么才是一个好的测试用例?

    2008-11-02 22:31:41

    原文:What Is a Good Test Case

    原文作者:Cem Kaner

    查看原文:http://bbs.51testing.com/thread-89151-1-1.html

    摘要

    设计好的测试用例是一门复杂的艺术。这种复杂性来自三方面:

    1. 测试用例帮助我们发现信息,不同类型的测试用例对不同种类的信息产生更好的效果。
    2. 好的测试用例可能好在很多方面,但不是在所有方面都是一个好的用例。
    3. 人们趋向于根据一定的测试风格创建测试用例,例如域测试或者基于风险的测试,好的域测试是不同于好的风险测试的。

    什么是测试用例?

    让我们从基础开始,什么才是一个测试用例呢?

    IEEE标准610(1990)这样定义:

    1)测试用例是为某个特殊对象开发的一套输入数据,执行条件和期望结果集合,例如为了使用一个特殊的程序路径或者为了验证符合一个特定的需求。

    2)(IEEE Std 829-1983)为了测试一个目标,指定输入,预期结果和一组执行条件的文档。

    Ron Patton(2001,p65)

    测试用例是你在测试软件时要尝试的特定输入和要遵循的方法。

    Boris Beizer(1995,p3)

    一个或多个子用例作为一个序列顺序执行,因为一个子用例结果和/或状态是另一个的输入和/或初始状态。单词"测试"包含子测试,专用测试和组测试。

    Bob Binder(1999,p47)

    一个测试用例说明IUT和环境在测试之前的状态,测试输入数据或者条件,并且给出期望结果。期望结果说明在输入特定测试数据时IUT产生什么结果。这个说明包括由IUT产生的消息,异常,返回值和IUT和环境最终状态。测试用例也说明其他构成IUT和环境的那些对象的初始和结果条件。

    在实践中,许多事情被称作测试用例,尽管他们没有完整的纪录。

    Brian Marick使用了一个相关的短语来描述轻量级的测试用例,测试点子;

    一个测试点子是对被测试事情的概要描述。例如,假如你在测试一个平方根的功能,一个好的点子就是“测试一个小于零的数字”。这个点子是要检查代码是否处理了一个错误情况。

    我个人认为,一个测试用例是你对程序提出的一个问题。执行这个测试是为了获得信息,例如会知道在这个测试中程序是通过还是失败。

    无论这个测试用例说明是否详细,只要它清楚测试点是什么,并且知道如何应用那个测试点在产品的某个特定方面(feature,例如)。因此当一个测试用例的说明是一个最基本的描述时,在你的词汇表里,请用“测试点子”替换“测试用例”。

    定义一个测试用例为一个提问的隐身含义是一个测试用例必须是能合理的暴露信息。

    • 基于这个定义,
  • 测试种类和测试阶段

    2008-11-02 00:11:00

    一、测试种类

    功能测试:针对产品需求说明书的测试,主要是验证功能是否符合需求,包括原定功能的检测、是否有冗余功能、遗漏功能。这类测试应该有测试人员完成,这并不意味着程序员在发布前不检查他们的代码能否工作。

    健壮性测试(容错能力/恢复能力测试):侧重于程序容错能力测试。本测试在单元测试阶段和系统测试阶段都要进行。如数据边界测试、非法数据测试、异常中断测试等等,主要是验证程序对各种异常情况是否进行正确的处理。为了执行方便,建议健壮性的大部分测试用例尽量编写在功能测试用例中。

    接口测试:程序员对各个模块进行系统联调的测试,包含程序内接口和程序外接口测试。这个测试,在单元测试阶段进行了一部分工作,而大部分都是在集成测试阶段完成的。由开发人员进行。

    强度测试:检查程序对异常情况的抵抗能力。强度测试总是迫使系统在异常的资源配置下运行。例如,1 当中断的正常频率为每秒一至两个时,运行每秒产生十个中断的测试用例;2定量地测试数据输入率,检查输入子功能的反映能力;3 运行需要最大存储空间的测试用例;4 运行可能导致虚存操作系统崩溃或磁盘数据剧烈抖动的测试用例。

    压力测试:对系统不断施加压力的测试,是通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大服务级别的测试。例如测试一个Web站点在大量的负荷下,何时系统的响应会退化或失败。

    性能测试:在交替进行负荷和强迫测试时常用的术语。性能测试关注的是系统的整体。它和通常说的强度、压力/负荷测试有密切关系。所以压力和强度应该与性能测试一同进行。举例说明,针对一个网站进行测试,模拟10到50个用户就是在进行常规性能测试,用户增加到1000乃至上万就变成了压力/负载测试。如果同时对系统进行大量的数据查询操作,就包含了强度测试。压力测试注重的是外界不断施压,强度测试注重的是极限或者异常情况下系统的测试。

    用户界面测试:对系统的界面进行测试,测试用户界面是否友好、是否方便易用、设计是否合理、位置是否正确等一系列界面问题。

    安全测试:主要是测试系统在没有授权的内部或者外部用户对系统进行攻击或者恶意破坏时如何进行处理,是否仍能保证数据的安全。测试人员可以学习一些黑客技术,来对系统攻击。

    可靠性测试:这里是比较狭义的可靠性测试,它主要是对系统能否稳定运行进行一个统计,在实际工作中如果没有条件可以不必特意去做。重点做好与之相关的功能测试、健壮性测试就可以了。

    安装/反安装测试:安装测试主要检验软件是否可以正确安装,安装文件的各项设置是否有效,安装后能否影响原系统;反安装是逆过程,测试是否删除干净,是否影响原系统等。

    文档测试:主要测试开发过程中针对用户的文档,以需求、用户手册、安装手册等为主。检验文档是否和实际应用存在差别。文档测试不需要编写测试用例。

    二、测试阶段

    单元测试:单元测试是针对软件设计的最小单位——程序模块进行正确性检验的测试工作,由开发人员进行,其目的在于发现每个程序模块内部可能存在的缺陷,实际程序员编码过程中已经进行了。单元测试基本不需要编写测试用例,开发人员自己调试通过、符合设计要求就可以了。

    集成测试:集成测试是将模块按照设计要求组装起来进行测试,主要目标是发现与接口有关的问题,由于在产品提交到测试部门前,产品开发小组都要进行联合调试,所以大部分企业是由开发人员来完成集成测试的,但也可以到了测试部门后再次进行集成测试。主要测试模块之间数据传输是否正确、模块集成后的功能是否实现、模块接口功能与设计需求是否一致。集成测试紧接在单元测试之后,当单元测试通过后,便可开始配置集成测试环境。集成测试是最关键的一步,如果问题较多就把产品送到测试部,会造成反复测试,从而浪费人力、物力资源,延误了工期。

    系统测试:系统测试是在集成测试通过后进行,目的是充分运行系统,验证各子系统是否都能正常工作并完成设计的要求。主要由测试部门进行,是测试部门最大最重要的一个测试,对产品的质量有重大的影响。系统测试的主要内容有:功能测试、健壮性测试、性能-效率测试、用户界面测试、安全性测试、压力测试、可靠性测试、安装/反安装测试等。这个测试需要编写大量的测试用例,投入大量的资源来完成。

    验收测试:根据需求阶段的《需求规格说明书》为验收标准,测试时要求模拟实际运行环境。对于实际项目可以和客户共同进行,对于产品实际就是最后一次的系统测试。测试内容为对功能模块的全面测试, 尤其要进行文档测试。

    三、测试种类、阶段和用例关系

    功能测试用例:包含功能测试、健壮性测试、可靠性测试,
    性能测试用例:包含性能测试、压力测试、强度测试
    集成测试用例:包含接口测试、健壮性测试、可靠性测试
    安全测试用例:安全测试用例
    用户界面测试用例:用户界面测试用例、少量功能测试用例。
    安装/反安装测试用例:安装/反安装测试用例

                                           

    测试阶段

     测试类型

     执行人员

    单元测试 模块功能测试,包含部分接口测试、路径测试 开发人员
    集成测试
    接口测试、路径测试,含部分功能测试 开发人员,如果测试人员水平较高可以由测试人员执行
    系统测试 功能测试、健壮性测试、性能测试、用户界面测试、安全性测试、压力测试、可靠性测试、安装/反安装测试 测试人员
    验收测试 对于实际项目基本同上,并包含文档测试;对于软件产品主要测试相关技术文档 测试人员,可能包含用户



    四、以测试一部电梯为例

    功能测试:开门,关门,铃声提示,报警电话,上楼,下楼,不同楼层同时呼叫,选择多个楼层停留。

    健壮性测试:同时按上下,不按关门键直接选择楼层,不选择楼层,选择全部楼层,准载人数测试,超载人数测试,突然停电,运行中开门,用物体挡住门,本楼层选择(如5楼选5)。

  • 玉米糊

    2008-11-01 21:26:21

    今天看了《咏乐汇》,采访的是俞敏洪。

    他很喜欢喝玉米糊,韭菜炒鸡蛋,阳春面。

    他是全村的插秧冠军,拖拉机能手。

    他高考三次,终进北大。

    他苦背词典,号称活字典。

    他放弃铁饭碗,成立新东方。

    他是平凡而伟大的,却是一个令人敬仰的人!

    成功秘诀:不进则退,持之以恒!

     

数据统计

  • 访问量: 21363
  • 日志数: 14
  • 文件数: 1
  • 书签数: 8
  • 建立时间: 2008-11-01
  • 更新时间: 2009-02-25

RSS订阅

Open Toolbar