日历

« 2008-10-08  
   1234
567891011
12131415161718
19202122232425
262728293031 

最新来客

统计信息

  • 访问量: 1865
  • 日志数: 10
  • 建立时间: 2007-07-24
  • 更新时间: 2007-08-21

RSS订阅

我的最新日志

  • [转]HTTP Error Codes

    2007-8-21

    找了好久的文章!今天终于找到了!谢谢作者歸陽。普遍的www服务器的网络连接,都用的是http协议,在这里我们如果对http状态字(http status)进行适当的了解有一定的帮助.

    http error codes

    400 invalid syntax. 语法问题
    401 access denied. 访问拒绝
    402 payment required. 必须完整
    403 request forbidden. 请求被禁止
    404 object not found. 对象没有找到
    405 method is not allowed. 方法不允许
    406 no resp acceptable to client found. 客户端没有响应
    407 proxy authentication required. 代理需要验证
    408 server timed out waiting for request. 等等请求时服务器断开连接
    409 user should resubmit with more info. 有冲突用户应该进行检查
    410 resource is no l available. 资源不可用
    411 server refused to accept request without a length. 服务器拒绝接受没有长度的请求
    412 prec given in request failed. 放弃请求失败的条件
    413 request entity was too large. 请求太大
    414 request uniform resource identifier (uri) too long. 请求的uri 太长
    415 unsupported media type. 不支持media类型
    449 retry after doing the appropriate action. 在作了适当动作后重试
    500 internal server error. 服务器内部错误
    501 server does not support the functi required to fulfill the request. 服务器不支持请求的功能
    502 error resp received from gateway. 从网关收到错误应答
    503 temporarily overloaded. 过载
    504 timed out waiting for gateway. 等待网关时请求断开
    505 http version not supported. 不支持http的版本


    http status codes returned by servers on the internet.
    从internet返回的http status代码(http 状态字)
    http_status_continue (100)
    the request can be continued.
    请求不能被继续
    http_status_switch_protocols (101)
    the server has switched protocols in an upgrade header.
    通过新的header服务器的协议被转换了
    http_status_ok (200)
    the request completed successfully.
    请求成功的完成
    http_status_created (201)
    the request has been fulfilled and resulted in the creation of a new resource.
    通过新的资源请求已经被完成
    http_status_accepted (202)
    the request has been accepted for processing, but the processing has not been completed.
    请求已经被接受处理,但是处理还没有完成
    http_status_partial (203)
    the returned meta information in the entity-header is not the definitive set available from the origin server.
    从服务器返回的在entity-header中的meta信息是无效的
    http_status_no_content (204)
    the server has fulfilled the request, but there is no new information to send back.
    服务器实现了请求,但是没有返回信息
    http_status_reset_content (205)
    the request has been completed, and the client program should reset the document view that caused the request to be sent to allow the user to easily initiate another input action.
    请求已经被完成,并且web程序(客户端程序浏览器程序)已经重置了文档视图目录(c
    http_status_partial_content (206)
    the server has fulfilled the partial get request for the resource.
    服务器已经为资源完成了部分get请求
    http_status_ambiguous (300)
    the server couldn't decide what to return.
    服务器不能判定返回什么
    http_status_moved (301)
    the requested resource has been assigned to a new permanent uri (uniform resource identifier), and any future references to this resource should be d using of the returned uris.
    被请求的资源已经被分配给新的uri,并且以后引用时都使用这个uris资源。
    http_status_redirect (302)
    the requested resource resides temporarily under a different uri (uniform resource identifier).
    请求的资源临时在不同的uri下
    http_status_redirect_method (303)
    the resp to the request can be found under a different uri (uniform resource identifier) and should be retrieved using a get http verb on that resource.
    请求的资源不能在不同的uri下找到,并且从新使用get http在服务器上从新检索
    http_status_not_modified (304)
    the requested resource has not been modified.
    请求的资源没有被改变
    http_status_use_proxy (305)
    the requested resource must be accessed through the proxy given by the location field.
    请求的资源必须通过特定的代理获得
    http_status_redirect_keep_verb (307)
    the redirected request keeps the same http verb. http/1.1 behavīor.
    从定位请求,
    http_status_bad_request (400)
    the request could not be processed by the server due to invalid syntax.
    因为语法不能被服务器处理
    http_status_denied (401)
    the requested resource requires user authentication.
    请求资源命令必须被验证(拒绝访问)
    http_status_payment_req (402)
    not currently implemented in the http protocol.
    没有完全实现http协议
    http_status_forbidden (403)
    the server understood the request, but is refusing to fulfill it.
    服务器理解了请求,但是拒绝完成他
    http_status_not_found (404)
    the server has not found anything matching the requested uri (uniform resource identifier).
    没有找到任何被指定的uri

    http_status_bad_method (405)
    the http verb used is not allowed.
    http动作不被允许
    http_status_none_acceptable (406)
    no resp acceptable to the client were found.
    应答没有被客户接受
    http_status_proxy_auth_req (407)
    proxy authentication required.
    代理必须被验证
    http_status_request_timeout (408)
    the server timed out waiting for the request.
    服务器在等待请求时中止了
    http_status_conflict (409)
    the request could not be completed due to a c with the current state of the resource. the user should resubmit with more information.
    请求不能被完成,问题是资源冲突。用户应该进行调整
    http_status_gone (410)
    the requested resource is no l available at the server, and no forwarding address is known.
    请求的资源在服务器上不再可用,而且没有转发地址
    http_status_length_required (411)
    the server refuses to accept the request without a defined c length.
    服务器拒绝接受没有定义目录大小的请求
    http_status_precond_failed (412)
    the prec given in or more of the request header fields evaluated to false when it was tested on the server.
    当在服务器上测试请求头文件放弃一个或者多个请求的条件
    http_status_request_too_large (413)
    the server is refusing to process a request because the request entity is larger than the server is willing or able to process.
    服务器拒绝处理请求,原因是请求的大小超过服务器能够处理的大小
    http_status_uri_too_long (414)
    the server is refusing to service the request because the request uri (uniform resource identifier) is l than the server is willing to interpret.
    服务器拒绝服务,原因是请求的uri超过了服务器能够揭示的长度
    http_status_unsupported_media (415)
    the server is refusing to service the request because the entity of the request is in a format not supported by the requested resource for the requested method.
    服务器拒绝服务,原因是请求格式不被支持
    http_status_retry_with (449)
    the request should be retried after doing the appropriate action.
    在作了适当的动作后请求被重试
    http_status_server_error (500)
    the server encountered an unexpected c that prevented it from fulfilling the request.
    服务器遇到请求失败意外
    http_status_not_supported (501)
    the server does not support the functi required to fulfill the request.
    服务器不支持必须完成请求的功能
    http_status_bad_gateway (502)
    the server, while acting as a gateway or proxy, received an invalid resp from the upstream server it accessed in attempting to fulfill the request.
    服务器当作为网关或代理时,从上行服务器接受的响应请求失败
    http_status_service_unavail (503)
    the service is temporarily overloaded.
    服务器负载
    http_status_gateway_timeout (504)
    the request was timed out waiting for a gateway.
    等待网关时请求断开,没有响应
    http_status_version_not_sup (505)
    the server does not support, or refuses to support, the http protocol version that was used in the request message.
    服务器不支持或者拒绝支持正在使用请求的http协议的版本

  • 防火墙的原理简介绍

    2007-8-15


    防火墙的五大功能

      一般来说,防火墙具有以下几种功能:

      1.允许网络管理员定义一个中心点来防止非法用户进入内部网络。

      2.可以很方便地监视网络的安全性,并报警。

      3.可以作为部署NAT(Network Address Translation,网络地址变换)的地点,利用NAT技术,将有限的IP地址动态或静态地与内部的IP地址对应起来,用来缓解地址空间短缺的问题。

      4.是审计和记录Internet使用费用的一个最佳地点。网络管理员可以在此向管理部门提供Internet连接的费用情况,查出潜在的带宽瓶颈位置,并能够依据本机构的核算模式提供部门级的计费。

      两种防火墙技术的对比

      包过滤防火墙

      优点

      价格较低

      性能开销小,处理速度较快
        缺点

      定义复杂,容易出现因配置不当带来问题

      允许数据包直接通过,容易造成数据驱动式攻击的潜在危险
      代理防火墙

      内置了专门为了提高安全性而编制的Proxy应用程序,能够透彻地理解相关服务的命令,对来往的数据包进行安全化处理

      速度较慢,不太适用于高速网(ATM或千兆位以太网等)之间的应用

      5.可以连接到一个单独的网段上,从物理上和内部网段隔开,并在此部署WWW服务器和FTP服务器,将其作为向外部发布内部信息的地点。从技术角度来讲,就是所谓的停火区(DMZ)。

      防火墙的两大分类

      尽管防火墙的发展经过了上述的几代,但是按照防火墙对内外来往数据的处理方法,大致可以将防火墙分为两大体系:包过滤防火墙和代理防火墙(应用层网关防火墙)。前者以以色列的Checkpoint防火墙和Cisco公司的PIX防火墙为代表,后者以美国NAI公司的Gauntlet防火墙为代表。

      1.包过滤防?

      第一代:静态包过滤

      这种类型的防火墙根据定义好的过滤规则审查每个数据包,以便确定其是否与某一条包过滤规则匹配。过滤规则基于数据包的报头信息进行制订。报头信息中包括IP源地址、IP目标地址、传输协议(TCP、UDP、ICMP等等)、TCP/UDP目标端口、ICMP消息类型等。包过滤类型的防火墙要遵循的一条基本原则是“最小特权原则”,即明确允许那些管理员希望通过的数据包,禁止其他的数据包。

        第二代:动态包过滤

      这种类型的防火墙采用动态设置包过滤规则的方法,避免了静态包过滤所具有的问题。这种技术后来发展成为所谓包状态监测(Stateful Inspection)技术。采用这种技术的防火墙对通过其建立的每一个连接都进行跟踪,并且根据需要可动态地在过滤规则中增加或更绿跄俊?

      图2 动态包过滤防火墙
      2. 代理防火墙

      第一代:代理防火墙

      代理防火墙也叫应用层网关(Application Gateway)防火墙。这种防火墙通过一种代理(Proxy)技术参与到一个TCP连接的全过程。从内部发出的数据包经过这样的防火墙处理后,就好像是源于防火墙外部网卡一样,从而可以达到隐藏内部网结构的作用。这种类型的防火墙被网络安全专家和媒体公认为是最安全的防火墙。它的核心技术就是代理服务器技术。

      所谓代理服务器,是指代表客户处理在服务器连接请求的程序。当代理服务器得到一个客户的连接意图时,它们将核实客户请求,并经过特定的安全化的Proxy应用程序处理连接请求,将处理后的请求传递到真实的服务器上,然后接受服务器应答,并做进一步处理后,将答复交给发出请求的最终客户。代理服务器在外部网络向内部网络申请服务时发挥了中间转接的作用。
        代理类型防火墙的最突出的优点就是安全。由于每一个内外网络之间的连接都要通过Proxy的介入和转换,通过专门为特定的服务如Http编写的安全化的应用程序进行处理,然后由防火墙本身提交请求和应答,没有给内外网络的计算机以任何直接会话的机会,从而避免了入侵者使用数据驱动类型的攻击方式入侵内部网。包过滤类型的防火墙是很难彻底避免这一漏洞的。就像你要向一个陌生的重要人物递交一份声明一样,如果你先将这份声明交给你的律师,然后律师就会审查你的声明,确认没有什么负面的影响后才由他交给那个陌生人。在此期间,陌生人对你的存在一无所知,如果要对你进行侵犯,他面对的将是你的律师,而你的律师当然比你更加清楚该如何对付这种人。

     图3 传统代理型防火墙
      代理防火墙的最大缺点就是速度相对比较慢,当用户对内外网络网关的吞吐量要求比较高时,(比如要求达到75-100Mbps时)代理防火墙就会成为内外网络之间的瓶颈。所幸的是,目前用户接入Internet的速度一般都远低于这个数字。在现实环境中,要考虑使用包过滤类型防火墙来满足速度要求的情况,大部分是高速网(ATM或千兆位以太网等)之间的防火墙。

      第二代:自适应代理防火墙

      自适应代理技术(Adaptive proxy)是最近在商业应用防火墙中实现的一种革命性的技术。它可以结合代理类型防火墙的安全性和包过滤防火墙的高速度等优点,在毫不损失安全性的基础之上将代理型防火墙的性能提高10倍以上。组成这种类型防火墙的基本要素有两个:自适应代理服务器(Adaptive Proxy Server)与动态包过滤器(Dynamic Packet filter)。

      图4 自适应代理防火墙
        在自适应代理与动态包过滤器之间存在一个控制通道。在对防火墙进行配置时,用户仅仅将所需要的服务类型、安全级别等信息通过相应Proxy的管理界面进行设置就可以了。然后,自适应代理就可以根据用户的配置信息,决定是使用代理服务从应用层代理请求还是从网络层转发包。如果是后者,它将动态地通知包过滤器增减过滤规则,满足用户对速度和安全性的双重要求。

        小资料

      防火墙的发展史

      第一代防火墙

      第一代防火墙技术几乎与路由器同时出现,采用了包过滤(Packet filter)技术。下图表示了防火墙技术的简单发展历史。

      第二、三代防火墙

      1989年,贝尔实验室的Dave Presotto和Howard Trickey推出了第二代防火墙,即电路层防火墙,同时提出了第三代防火墙——应用层防火墙(代理防火墙)的初步结构。

      第四代防火墙

      1992年,USC信息科学院的BobBraden开发出了基于动态包过滤(Dynamic packet filter)技术的第四代防火墙,后来演变为目前所说的状态监视(Stateful inspection)技术。1994年,以色列的CheckPoint公司开发出了第一个采用这种技术的商业化的产品。

      第五代防火墙

      1998年,NAI公司推出了一种自适应代理(Adaptive proxy)技术,并在其产品Gauntlet Firewall for NT中得以实现,给代理类型的防火墙赋予了全新的意义,可以称之为第五代防火墙。
  • Linux中的目录结构

    2007-8-14


    二、目 录

    1、什么是文件系统

    2、文件系统的类型

    3、目录结构的详细解读

    4、一些重要子目录的解读

    5、附录:目录结构的简明查阅手册

    三、正 文

    我想,不光是我,对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步。下面大家跟飘扬一起来学习吧………….

    1、什么是文件系统

    当您使用Linux的时候,如果您通过ls –l / 就会发现,在/下包涵很多的目录,比如etc、usr、var、bin ... ... 等目录,而在这些目录中,我们进去看看,发现也有很多的目录或文件。文件系统在Linux下看上去就象树形结构,所以我们可以把文件系统的结构形象的称为树形结构。

    linux文件系统的最顶端是/,我们称/为Linux的root,也就是 Linux操作系统的文件系统。Linux的文件系统的入口就是/,所有的目录、文件、设备都在/之下,/就是Linux文件系统的组织者,也是最上级的领导者。

    2、文件系统的类型

    LINUX有四种基本文件系统类型:普通文件、目录文件、连接文件和特殊文件,可用file命令来识别。

    普通文件:如文本文件、C语言元代码、SHELL脚本、二进制的可执行文件等,可用cat、less、more、vi、emacs来察看内容,用mv来改名。

    目录文件:包括文件名、子目录名及其指针。它是LINUX储存文件名的唯一地方,可用ls列出目录文件。

    连接文件:是指向同一索引节点的那些目录条目。用ls来查看是,连接文件的标志用l开头,而文件面后以"->"指向所连接的文件。

    特殊文件:LINUX的一些设备如磁盘、终端、打印机等都在文件系统中表示出来,则一类文件就是特殊文件,常放在/dev目录内。例如,软驱A称为/dev/fd0。LINUX无C:的概念,而是用/dev/had来自第一硬盘。

    3、目录结构的详细解说

    文件系统的组织结构分析,我们能分析什么呢?也就是当我们列/目录时,所看到的 /usr、/etc ... ... /var 等目录是做什么用的,这些目录是不是有些特定的用途。无论哪个哪个版本的Linux系统,都有这些目录,这些目录应该是标准的。当然各个Linux发行版本也会存在一些小小的差异,但总体来说,大体还是差不多。

    言归正传,下面飘扬将讲到本文最核心的部分:linux文件系统的目录结构。

    / bLinux文件系统的入口,也是处于最高一级的目录;

    /bin 系统所需要的那些命令位于此目录,比如 ls、cp、mkdir等命令;功能和/usr/bin类似,这个目录中的文件都是可执行的、普通用户都可以使用的命令。作为基础系统所需要的最基础的命令就是放在这里。

    /boot Linux的内核及引导系统程序所需要的文件目录,比如 vmlinuz initrd.img 文件都位于这个目录中。在一般情况下,GRUB或LILO系统引导管理器也位于这个目录;

    /dev 设备文件存储目录,比如声卡、磁盘... ...

    /etc 系统配置文件的所在地,一些服务器的配置文件也在这里;比如用户帐号及密码配置文件;

    /home 普通用户家目录默认存放目录;

    /lib 库文件存放目录

    /lost+found 在ext2或ext3文件系统中,当系统意外崩溃或机器意外关机,而产生一些文件碎片放在这里。当系统启动的过程中fsck工具会检查这里,并修复已经损坏的文件系统。 有时系统发生问题,有很多的文件被移到这个目录中,可能会用手工的方式来修复,或移到文件到原来的位置上。

    /mnt 这个目录一般是用于存放挂载储存设备的挂载目录的,比如有cdrom 等目录。可以参看/etc/fstab的定义。有时我们可以把让系统开机自动挂载文件系统,把挂载点放在这里也是可以的。主要看/etc/fstab中怎么定义了;比如光驱可以挂载到/mnt/cdrom 。

    /opt 表示的是可选择的意思,有些软件包也会被安装在这里,也就是自定义软件包,比如在Fedora Core 5.0中,OpenOffice就是安装在这里。有些我们自己编译的软件包,就可以安装在这个目录中;通过源码包安装的软件,可以通过 ./configure --prefix=/opt/目录 。

    /proc 操作系统运行时,进程信息及内核信息(比如cpu、硬盘分区、内存信息等)存放在这里。/proc目录伪装的文件系统proc的挂载目录,proc并不是真正的文件系统,它的定义可以参见 /etc/fstab 。

    /root Linux超级权限用户root的家目录;

    /sbin 大多是涉及系统管理的命令的存放,是超级权限用户root的可执行命令存放地,普通用户无权限执行这个目录下的命令,这个目录和/usr/sbin; /usr/X11R6/sbin或/usr/local/sbin目录是相似的;我们记住就行了,凡是目录sbin中包含的都是root权限才能执行的。

    /tmp 临时文件目录,有时用户运行程序的时候,会产生临时文件。/tmp就用来存放临时文件的。/var/tmp目录和这个目录相似。

    /usr 这个是系统存放程序的目录,比如命令、帮助文件等。这个目录下有很多的文件和目录。当我们安装一个Linux发行版官方提供的软件包时,大多安装在这里。如果有涉及服务器配置文件的,会把配置文件安装在/etc目录中。/usr目录下包括涉及字体目录/usr/share/fonts ,帮助目录 /usr/share/man或/usr/share/doc,普通用户可执行文件目录/usr/bin 或/usr/local/bin 或/usr/X11R6/bin ,超级权限用户root的可执行命令存放目录,比如 /usr/sbin 或/usr/X11R6/sbin 或/usr/local/sbin 等;还有程序的头文件存放目录/usr/include。

    /var 这个目录的内容是经常变动的,看名字就知道,我们可以理解为vary的缩写,/var下有/var/log 这是用来存放系统日志的目录。/var/www目录是定义Apache服务器站点存放目录;/var/lib 用来存放一些库文件,比如MySQL的,以及MySQL数据库的的存放地;

    4、一些重要子目录的解说

    下面飘扬再补充几个比较常见且很重要的目录。

    /etc/init.d 这个目录是用来存放系统或服务器以System V模式启动的脚本,这在以System V模式启动或初始化的系统中常见。比如Fedora/RedHat;

    /etc/xinit.d 如果服务器是通过xinetd模式运行的,它的脚本要放在这个目录下。有些系统没有这个目录, 比如Slackware,有些老的版本也没有。在Rehat/Fedora中比较新的版本中存在。

    /etc/rc.d 这是Slackware发行版有的一个目录,是BSD方式启动脚本的存放地;比如定义网卡,服务器开启脚本等。

    /etc/X11 这是X-Windows相关的配置文件存放地。

    /usr/bin 这个目录是可执行程序的目录,普通用户就有权限执行;当我们从系统自带的软件包安装一个程序时,他的可执行文件大多会放在这个目录。比如安装gaim软件包时。相似的目录是/usr/local/bin;有时/usr/bin中的文件是/usr/local/bin的链接文件;

    /usr/sbin 这个目录也是可执行程序的目录,但大多存放涉及系统管理的命令。只有root权限才能执行;相似目录是/sbin 或/usr/local/sbin或/usr/X11R6/sbin等;

    /usr/local 这个目录一般是用来存放用户自编译安装软件的存放目录;一般是通过源码包安装的软件,如果没有特别指定安装目录的话,一般是安装在这个目录中。这个目录下面有子目录。自己看看吧。

    /usr/share 系统共用的东西存放地,比如 /usr/share/fonts 是字体目录,/usr/share/doc和/usr/share/man帮助文件。

    /usr/src 是内核源码存放的目录,比如下面有内核源码目录,比如 linux 、linux-2.xxx.xx 目录等。有的系统也会把源码软件包安装在这里。比如Fedora/Redhat,当我们安装file.src.rpm的时候,这些软件包会安装在 /usr/src/redhat相应的目录中。

    /var/adm 比如软件包安装信息、日志、管理信息等,在Slackware操作系统中是有这个目录的。在Fedora中好象没有;自己看看吧。

    /var/log 系统日志存放,分析日志要看这个目录的东西;

    /var/spool 打印机、邮件、代理服务器等假脱机目录;

    5、附录:目录结构的简明查阅手册

    (1)“/”根目录部分有以下子目录:

    /usr 目录包含所有的命令、程序库、文档和其它文件。这些文件在正常操作中不会被改变的。这个目录也包含你的Linux发行版本的主要的应用程序,譬如,Netscape。

    /var 目录包含在正常操作中被改变的文件:假脱机文件、记录文件、加锁文件、临时文件和页格式化文件等

    /home 目录包含用户的文件:参数设置文件、个性化文件、文档、数据、EMAIL、缓存数据等。这个目录在系统省级时应该保留。

    /proc 目录整个包含虚幻的文件。它们实际上并不存在磁盘上,也不占用任何空间。(用ls –l 可以显示它们的大小)当查看这些文件时,实际上是在访问存在内存中的信息,这些信息用于访问系统

    /bin 系统启动时需要的执行文件(二进制),这些文件可以被普通用户使用。

    /sbin 系统执行文件(二进制),这些文件不打算被普通用户使用。(普通用户仍然可以使用它们,但要指定目录。)

    /etc 操作系统的配置文件目录。

    /root 系统管理员(也叫超级用户或根用户)的Home目录。

    /dev 设备文件目录。LINUX下设备被当成文件,这样一来硬件被抽象化,便于读写、网络共享以及需要临时装载到文件系统中。正常情况下,设备会有一个独立的子目 录。这些设备的内容会出现在独立的子目录下。LINUX没有所谓的驱动符。

    /lib 根文件系统目录下程序和核心模块的共享库。

    /boot 用于自举加载程序(LILO或GRUB)的文件。当计算机启动时(如果有多个操作系统,有可能允许你选择启动哪一个操作系统),这些文件首先被装载。这个目录也会包含LINUX核(压缩文件vmlinuz),但LINUX核也可以存在别处,只要配置LILO并且LILO知道LINUX核在哪儿。

    /opt 可选的应用程序,譬如,REDHAT 5.2下的KDE (REDHAT 6.0下,KDE放在其它的XWINDOWS应用程序中,主执行程序在/usr/bin目录下)

    /tmp 临时文件。该目录会被自动清理干净。

    /lost+found 在文件系统修复时恢复的文件

    (2)“/usr”目录下比较重要的部分有:

    /usr/X11R6 X-WINDOWS系统(version 11, release 6)

    /usr/X11 同/usr/X11R6 (/usr/X11R6的符号连接)

    /usr/X11R6/bin 大量的小X-WINDOWS应用程序(也可能是一些在其它子目录下大执行文件的符号连接)。

    /usr/doc LINUX的文档资料(在更新的系统中,这个目录移到/usr/share/doc)。

    /usr/share 独立与你计算机结构的数据,譬如,字典中的词。

    /usr/bin和/usr/sbin 类似与“/”根目录下对应的目录(/bin和/sbin),但不用于基本的启动(譬如,在紧急维护中)。大多数命令在这个目录下。

    /usr/local 本地管理员安装的应用程序(也可能每个应用程序有单独的子目录)。在“main”安装后,这个目录可能是空的。这个目录下的内容在重安装或升级操作系统后应该存在。

    /usr/local/bin 可能是用户安装的小的应用程序,和一些在/usr/local目录下大应用程序的符号连接。

    (3)“/proc”目录的内容:

    /proc/cpuinfo 关于处理器的信息,如类型、厂家、型号和性能等。

    /proc/devices 当前运行内核所配置的所有设备清单。

    /proc/dma 当前正在使用的DMA通道。/proc/filesystems 当前运行内核所配置的文件系统。

    /proc/interrupts 正在使用的中断,和曾经有多少个中断。

    /proc/ioports 当前正在使用的I/O端口。

  • 什么是IDS和IPS系统

    2007-8-14

     为了应付这种威胁,一些公司开始应用入侵检测系统(IDS)。IDS的思路是监视经过你的防火墙的全部通信并且查找可能是恶意的通信。这个思路在理论上是非常好的,但是,在实际上,IDS系统由于某些原因的影响工作得并不好。

        早期的IDS系统通过查找任何异常的通信发挥作用。当检测到异常的通信时,这种行动将被记录下来并且向管理员发出警报。这个过程很少出现问题。对于初始者来说,查找异常通信方式会产生很多错误的报告。经过一段时间之后,管理员会对收到过多的错误警报感到厌烦,从而完全忽略IDS系统的警告。

        IDS系统的另一个主要缺陷是它们仅监视主要的通信。如果检测到一种攻击,它将提醒管理员采取行动。人们认为IDS系统采取的这种方法是很好的。总之,由于IDS系统会产生很多的错误报告,你真的愿意让IDS系统对合法的网络通信采取行动吗?

        在过去的几年里,IDS系统已经有了很大的进步。目前,IDS系统的工作方式更像是一种杀毒软件。IDS系统包含一个名为攻击签名的数据库。这个系统不断地把入网的通信与数据库中的信息进行比较。如果检测到攻击行动,IDS系统就发出这个攻击的报告。

        比较新的IDS系统比以前的系统更准确一些。但是,这个数据库需要不断地更新以保持有效性。而且,如果发生了攻击并且在数据库中没有相匹配的签名,这个攻击可能就会被忽略。即使这个攻击被检测到了并且被证实是一种攻击,IDS系统除了向管理员发出警报和记录这个攻击之外没有力量做出任何事情。

        这就是入侵防御系统(IPS)的任务了。IPS与IDS类似,但是,IPS在设计上解决了IDS的一些缺陷。

        对于初始者来说,IPS位于你的防火墙和网络的设备之间。这样,如果检测到攻击,IPS会在这种攻击扩散到网络的其它地方之前阻止这个恶意的通信。相比之下,IDS只是存在于你的网络之外起到报警的作用,而不是在你的网络前面起到防御的作用。

        IPS检测攻击的方法灿隝DS不同。目前有很多种IPS系统,它们使用的技术都不相同。但是,一般来说,IPS系统都依靠对数据包的检测。IPS将检查入网的数据包,确定这种数据包的真正用途,然后决定是否允许这种数据包进入你的网络。

        正如你所看到的,IDS和IPS系统有一些重要的区别。如果你要购买有效的安全设备,如果你使用IPS而不是使用IDS,你的网络通常会更安全。
  • 学习中的小收获

    2007-8-08

    好长时间没有学习新的东西了,最近被公司的回归测试搞的头直大,听说selenium是一款不错的开源WEB自动化测试工具,就下来用,不过可恨的是selenium只有FF的IDE版本,并不支持其他的broswer,只能用selenimum RC版,不过环境一直也搭建不起来,在公司尝试了N次总是无法启动selenium的jar文件,在家里的PC倒是可以,昨天一直尝试着用eclipise,可是太不熟练,今天白天又郁闷了一天,晚上回来改用.net,一直出错,不过现在嘛,我终于弄出来了,这个vs2005+selenium+nunit的web自动化框架就这样搭建好了,想想也很简单的,跑了一条录制好脚本的 case,结果pass了,下一步就是进步学习selenium的测试框架,看看能不能用eclipise+selenium+junit来测试。
     
    哪天有空写个详细的文章发上来。
  • Selenium RC:指南

    2007-8-07

     

    本指南将会告诉你如何从命令行启动Selenium server,如何在交互式模式下使用Server。这里假设你已经熟悉在命令行执行程序。最后,我们将说明如何写简单的test来实现我们已在交互式模式下实现的功能。

     

    Selenium Server 是用Java语言编写的,需要在JRE 1..5.0或者更高的版本下运行,也许你已经安装JRE。在命令行中执行:

    java -version

     

    你可以看到如下的关于你安装的java的版本信息:

    java version "1.5.0_07"

    Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_07-b03)

    Java HotSpot(TM) Client VM (build 1.5.0_07-b03, mixed mode)

     

    相反,如果你看到的是错误信息,你需要安装JRE,或者是将它填加到你的PATH环境变量中去。

    同时你需要确保你的安装的浏览器也支持这些,例如:

     * Windows:如果你用的是Windows XP 或者是Windows2003,你可以使用IE 浏览器,或者安装Mozilla Firefox 或者Opera浏览器。 如果你是用的是Windows2000,如果想使用IE浏览器,你就需要安装reg.exe,但是如果使用Firefox那就另当别论。我们建议(不是必须)将你的浏览器执行路径加到你的PATH环境变量中(如果你不明确的将你的浏览器的安装目录加到PATH中,那么你就必须将你的浏览器安装到标准路径下;Firefox的标准路径:"c:\Program Files\Mozilla Firefox\firefox.exe"; IE浏览器的标准路径:"c:\Program Files\Internet Explorer\iexplore.exe".)

    Unix/Linux:在这个指南中,要求安装Firefox,并且将FF的路径加到你的PATH环境变量中。注意,在Unix/Linux中我们激活"firefox-bin"目录,从而确保在这个路径下执行;同时不要忘记将Firefox libraries j加到你的 LD_LIBRARY_PATH.中。如果需要,我们可以通过shell脚本激活firefox(例如:"firefox" or "run-mozilla.sh")那样的话知道你关闭这个服务器的时候才可以结束Firefox浏览器。

     * Mac OS X:对于 Mac OS X,只要在你的/Applications目录下,安装Firefox.app就够了。注意:为了精确控制你的浏览器,我们需要激活/Applications/Firefox.app/Contents/MacOS 目录下的Firefox内嵌的执行程序(firefox-bin);如果你的浏览器的安装位置不在那,你需要将你当前的内嵌位置加到你的PATH路径下,作为你的DYLD_LIBRARY_PATH环境变量。

    Interactive Mode

    Selenium服务器的“交互模式”是一种不需要任何代码的原型测试,因此有必要对初学者介绍Selenium Remote Control。在交互模式下,你可以在Selenium 服务器窗口中输入一行行的命令,在工作窗口的某个位置中立刻会执行你命令的结果。通常你可以选用你喜欢的语言编写你的测试代码,整个过程都是完全自动化的。

    一旦你已经安装了Java,你就可以用如下的命令来启动你的Selenium Server了:

    java -jar selenium-server.jar -interactive

     

    这个将启动Selenium服务器,并允许你在命令窗口输入命令。在一些登录信息后边,你应该看到如下的信息:

    Entering interactive mode... type Selenium commands here (e.g: cmd=open&1=http://www.yahoo.com) 

     

    让我们从打开浏览器来学习Selenium 服务器,如果你在Windows操作系统下,想在Selenium命令中使用IE浏览器,你可以试下面的输入:

    cmd=getNewBrowserSession&1=*iexplore&2=http://www.google.com

     

    如果你想使用FireFox浏览器,你可以试如下的命令:

    cmd=getNewBrowserSession&1=*firefox&2=http://www.google.com

     

    你正在用你选择的浏览器(*iexplore for Internet Explorer, *firefox for Firefox, or *opera for Opera)执行"getNewBrowserSession"命令,打开www.google.com网站。在窗口中输入命令行,会自动的将HTTP网页的请求发送给Selenium服务器,并被执行(在非交互模式下,你可以使用你喜欢的任何的自动化工具将HTTP请求发送到服务器上,而不用手工输入他们)。当你按下“Enter”,你可以看到关于你的请求的如下描述:

    --->Requesting http://localhost:4444/selenium-server/driver?cmd=getNewBrowserSession&1=*firefox&2=http://www.google.com

     

    如果一切正常,你将会发现在你选择的浏览器中打开了一个新的窗口,回到Selenium服务器窗口中,你会发现如下的信息:

    Got result: OK,260113 on session 260113

    (如果没有以上信息,你就有必要去查一下故障向导了)

     

    消息的第一部分“Got result: OK”你的请求成功,第二部分,是Session ID,你每次执行"getNewBrowserSession" 命令时,SessionID都是不同的。

     

    让我们试一下更多的命令-Google Search!我们将打开Google的网站,在命令窗口中输入下面的命令,并且将ID换成你运行"getNewBrowserSession"时获得的ID

    cmd=open&1=http://www.google.com/webhp&sessionId=260113

     

    当执行完这个命令后,在你的浏览器窗口的下方将会打开google.com页面。(The /webhp 确保我们在www.google.com网站; 否则,我们需要通过某个国家的Google服务器间接的访问Google, 例如., www.google.fr.)

     

    现在Google已经被打开了,我们可以试着在Search Box中输入一些字段,在Selenium 服务器窗口命令中输入:

    cmd=type&1=q&2=hello world&sessionId=260113

     

    同样,不要忘记将你的Session ID换成你获得的ID,如果一切按计划执行,你将会在googlesearch对话框中看到“hello world,现在让我们开始查询:

    cmd=click&1=btnG&sessionId=260113

     

    现在在浏览器中你可以看到查询的结果,你可以通过许多Selenium命令在浏览器中自动执行手工任务,对于一些特殊的命令,你可以在 Openqa的网站上查询Selenium Core部分,或者查看我们客户端驱动的相关资料(Java, .NET, Perl, PHP, Python or Ruby).

     

    接下来我们想做的事情可能是在页面上读出一些我们想要的信息, 例如,让我们在当前页面上找到一些HTML的标题,如下:

    cmd=getTitle&sessionId=260113

     

    浏览器将会返回我们载入的HTML页面的标题:

    Got result: OK,hello world - Google Search on session 260113

     

    现在这些交互模式已经够了;让我们开始写一些代码!但是在我们开始前,让我们关掉我们启动的浏览器。输入如下的命令:

    cmd=testComplete&sessionId=260113

     

    输入这些命令后,你的浏览器窗口将会自动关闭,想要关掉Selenium服务器,输入“quit”或者只要按下“Ctrl+C”。

     

    The Same Origin Policy

    当你执行你的测试的时候,你也许会注意到你的浏览器种的URL是:

    http://www.google.com/selenium-server/RemoteRunner.html?sessionId=260113

    这个不是一般的URL,当然,因为在www.google.com种没有这个URL,如果你手工在你的浏览器中输入那个URL,将会出现404错误页面,怎么回事那?

     

    JavaSript自动测试的时候,Selenium服务器参与解决了一个难题,你自己写的Javascrīpt脚本不会在Google.com上执行,这是由于same origin policy(这是Mozilla website自己起草的,但是现代的Javascrīpt浏览器反对这个政策) 同源政策有更多的意义。你已将你的浏览器指向一个银行的网站,同时你打开了某些人的blog

     

    Javascrīpt允许从网站上读取信息,如你载入的网页上一些改动了的数值,恶意的bloger可以读取你银行的数据,更糟的是从新输入你银行的页面做一些其他的事情,他可以用欺骗你来获得他敏感的信息。同源政策表明Javascrīpt脚本允许只能阅读/修改来自相同源头的HTML

     

    这给Selenium自动测试带来了很大问题,如果你写了一个设置测试google.com.js代码,同源策略拒绝你的.js文件在google.com上运行;相反,你应该在google.com上安装那个.js文件来使它运行,我们没有权利这样做,即使有,这样做也会引起争议。

    Selenium Server便应运而生,在你用"getNewBrowserSession"自动开启的浏览器中,.Selenium Server如同是客户端配置的代理(client-configured proxy)。尤其,他将你的浏览器配置成和浏览器相关的使用Selenium Server代理。

     

    代理通常会捕捉你在HTML页面上的行为,如果页面没有找到,将会报告该页不存在。但是Selenium Server是个很不同的代理,当浏览器通过包含"/selenium-server/"的代理在URL中请求某个页面时,Selenium Server不会单纯的在远程服务器上取回该页,而是自动的返回它自己的页面。在某种意义上,这使得浏览器认为远程服务器上包含这个页面,这样我们就可以在google.com上注入任意的Javascrīpt代码而不用以任何方式修改google.com

  • Selenium命令列表

    2007-8-02

     

    Author:袁琳
    MSN:testwin@sohu.com

    一、  Commands (命令)

    • Action
      对当前状态进行操作
      失败时,停止测试
    • Assertion
      校验是否有产生正确的值
    • Element Locators
      指定HTML中的某元素
    • Patterns
      用于模式匹配

    1. Element Locators (元素定位器)

    • id=id
      id locator 指定HTML中的唯一id的元素 
    •  name=name
      name locator指定 HTML中相同name的元素中的第一个元素
    •  identifier=id
      identifier locator 首先查找HTML是否存在该id的元素, 若不存在,查找第一个该name的元素 
    • dom=javascrīptExpression
      dom locator用Javascrīpt表达式来定位HTML中的元素,注意必须要以"document"开头
      例如:
      dom=document.forms['myForm'].myDropdown
      dom=document.images[56]
    •  xpath=xpathExpression
      xpath locator用 XPath 表达式来定位HTML中的元素,必须注意要以"//"开头
      例如:
      xpath=//img[@alt='The image alt text']
      xpath=//table[@id='table1']//tr[4]/td[2]
    •  link=textPattern
      link locator 用link来选择HTML中的连接或锚元素
      例如:
      link=The link text
    • 在没有locator前序的情况下 Without a locator prefix, Selenium uses:
      如果以"document."开头,则默认是使用 dom locator,如果是以"//"开头,则默认使用xpath locator,其余情况均认作identifier locator

    2. String Matching Patterns (字符串匹配模式)

    • glob:patthern
      glob模式,用通配符"*"代表任意长度字符,"?"代表一个字符
    • regexp:regexp
      正则表达式模式,用Javascrīpt正则表达式的形式匹配字符串
    • exact:string
      精确匹配模式,精确匹配整个字符串,不能用通配符
    • 在没有指定字符串匹配前序的时候,selenium 默认使用golb 匹配模式

    3. Select Option Specifiers (Select选项指定器)

    • label=labelPattern
      通过匹配选项中的文本指定选项
      例如:label=regexp:^[Oo]ther
    • value=valuePattern
      通过匹配选项中的值指定选项
      例如:value=other
    • id=id
      通过匹配选项的id指定选项
      例如: id=option1
    • index=index
      通过匹配选项的序号指定选项,序号从0开始
      例如:index=2
    • 在没有选项选择前序的情况下,默认是匹配选项的文本

    二、 Actions
    描述了用户所会作出的操作。
    Action 有两种形式: action和actionAndWait, action会立即执行,而actionAndWait会假设需要较长时间才能得到该action的相响,而作出等待,open则是会自动处理等待时间。

    • click
      click(elementLocator)
      - 点击连接,按钮,复选和单选框
      - 如果点击后需要等待响应,则用"clickAndWait"
      - 如果是需要经过Javascrīpt的alert或confirm对话框后才能继续操作,则需要调用verify或assert来告诉Selenium你期望对对话框进行什么操作。
      click aCheckbox  
      clickAndWait submitButton  
      clickAndWait anyLink  
    • open
      open(url)
      - 在浏览器中打开URL,可以接受相对和绝对路径两种形式
      - 注意:该URL必须在与浏览器相同的安全限定范围之内
      open /mypage  
      open http://localhost/  
    • type
       type(inputLocator, value)
      - 模拟人手的输入过程,往指定的input中输入值
      - 也适合给复选和单选框赋值
      - 在这个例子中,则只是给钩选了的复选框赋值,注意,而不是改写其文本
      type nameField John Smith
      typeAndWait textBoxThatSubmitsOnChange newValue
    • select
      select(dropDownLocator, optionSpecifier)
      - 根据optionSpecifier选项选择器来选择一个下拉菜单选项
      - 如果有多于一个选择器的时候,如在用通配符模式,如"f*b*",或者超过一个选项有相同的文本或值,则会选择第一个匹配到的值
      select  dropDown Australian Dollars
      select  dropDown index=0
      selectAndWait currencySelector value=AUD
      selectAndWait currencySelector label=Auslian D*rs
    •  goBack,close
      goBack()
      模拟点击浏览器的后退按钮
      close()
      模拟点击浏览器关闭按钮
    • selectWindow
      select(windowId)
      - 选择一个弹出窗口
      - 当选中那个窗口的时候,所有的命令将会转移到那窗口中执行
      selectWindow myPopupWindow  
      selectWindow null  
    • pause
      pause(millisenconds)
      - 根据指定时间暂停Selenium脚本执行
      - 常用在调试脚本或等待服务器段响应时
      pause 5000  
      pause 2000  
    • fireEvent
       fireEvent(elementLocatore,evenName)
      模拟页面元素事件被激活的处理动作
      fireEvent textField focus
      fireEvent dropDown blur
    • waitForCondition
      waitForCondition(JavascrīptSnippet,time)
      - 在限定时间内,等待一段Javascrīpt代码返回true值,超时则停止等待
      waitForCondition var value="/selenium.getText(""foo"); value.match(/bar/); 3000
    • waitForValue
      waitForValue(inputLocator, value)
      - 等待某input(如hidden input)被赋予某值,
      - 会轮流检测该值,所以要注意如果该值长时间一直不赋予该input该值的话,可能会导致阻塞
      waitForValue finishIndication isfinished
           
    • store,stroreValue
      store(valueToStore, variablename)
      保存一个值到变量里。
      该值可以由自其他变量组合而成或通过Javascrīpt表达式赋值给变量
      store Mr John Smith fullname
      store $.{title} $.{firstname} $.{suname} fullname
      store javascrīpt.{Math.round(Math.PI*100)/100} PI
      storeValue inputLocator variableName

      把指定的input中的值保存到变量中

      storeValue userName userID
      type userName $.{userID}
    • storeText, storeAttribute
      storeText(elementLocator, variablename)
      把指定元素的文本值赋予给变量
      storeText currentDate expectedStartDate
      verifyValue startDate $.{expectedStartDate}

      storeAttribute(.{}elementLocator@attributeName,variableName.{)
      把指定元素的属性的值赋予给变量

      storeAttribute input1@class  classOfInput1
      verifyAttribute input2@class $.{classOfInput1}
    • chooseCancel.., answer..
      chooseCancelOnNextConfirmation()
      - 当下次Javascrīpt弹出confirm对话框的时候,让selenium选择Cancel
      - 如果没有该命令时,遇到confirm对话框Selenium默认返回true,如手动选择OK按钮一样
      chooseCancelOnNextConfirmation     

      - 如果已经运行过该命令,当下一次又有confirm对话框出现时,也会同样地再次选择Cancel
      answerOnNextPrompt(answerString)
      - 在下次Javascrīpt弹出prompt提示框时,赋予其anweerString的值,并选择确定

      answerOnNextPrompt Kangaroo  

    三、 Assertions
    允许用户去检查当前状态。两种模式: Assert 和 Verify, 当Assert失败,则退出测试;当Verify失败,测试会继续运行。

    • assertLocation, assertTitle
      assertLocation(relativeLocation)
      判断当前是在正确的页面
      verifyLocation /mypage  
      assertLocation /mypage  
    • assertTitle(titlePattern)
      检查当前页面的title是否正确
      verifyTitle My Page  
      assertTitle My Page  
    • assertValue
      assertValue(inputLocator, valuePattern)
      - 检查input的值
      - 对于 checkbox或radio,如果已选择,则值为"on",反之为"off"
      verifyValue nameField John Smith
      assertValue document.forms[2].nameField John Smith
    • assertSelected, assertSelectedOptions
      assertSelected(selectLocator, optionSpecifier)
      检查select的下拉菜单中选中的选型是否和optionSpecifer(Select选择选项器)的选项相同
      verifySelected dropdown2 John Smith
      verifySelected dorpdown2 value=js*123
      assertSelected document.forms[2].dropDown label=J*Smith
      assertSelected document.forms[2].dropDown index=0
    • assertSelectOptions(selectLocator, optionLabelList)
      - 检查下拉菜单中的选项的文本是否和optionLabelList相同
      - optionLabelList是以逗号分割的一个字符串
      verifySelectOptions dropdown2 John Smith,Dave Bird
      assertSelectOptions document.forms[2].dropdown Smith,J,Bird,D
    • assertText
      assertText(elementLocator,textPattern)
      - 检查指定元素的文本
      - 只对有包含文本的元素生效
      - 对于Mozilla类型的浏览器,用textContent取元素的文本,对于IE类型的浏览器,用innerText取元素文本
      verifyText statusMessage Successful
      assertText //div[@id='foo']//h1 Successful
    • assertTextPresent, assertAttribute
      assertTextPresent(text)
      检查在当前给用户显示的页面上是否有出现指定的文本
      verifyTextPresent You are now logged in  
      assertTextPresent You are now logged in  
    • assertAttribute(.{}elementLocator@attributeName.{, ValuePattern)
      检查当前指定元素的属性的值
      verifyAttribute txt1@class bigAndBlod
      assertAttribute document.images[0]@alt alt-text
      verifyAttribute //img[@id='foo']/alt alt-text
    • assertTextPresent, etc.
      assertTextPresent(text)
      assertTextNotPresent(text)
      assertElementPresent(elementLocator)
       verifyElementPresent   submitButton   
       assertElementPresent   //img[@alt='foo']    assertElementNotPresent(elementLocator)
    • assertTable
      assertTable(cellAddress, valuePattern)
      - 检查table里的某个cell中的值
      - cellAddress的语法是tableName.row.column, 注意行列序号都是从0开始
      verifyTable myTable.1.6 Submitted
      assertTable results0.2 13
    • assertVisible, nonVisible
      assertVisible(elementLocator)
      - 检查指定的元素是否可视的
      - 隐藏一个元素可以用设置css的'visibility'属性为'hidden',也可以设置'display'属性为'none'
      verfyVisible postcode  
      assertVisible postcode  
    • assertNotVisible(elementLocator)
       verfyNotVisible   postcode   
       assertNotVisible   postcode   
    • Editable, non-editable
      assertEditable(inputLocator)
      检查指定的input是否可以编辑
      verifyEditable shape  
      assertEditable colour  
    • assertNotEditable(inputLocator)
      检查指定的input是否不可以编辑
    • assertAlert
      assertAlert(messagePattern)
      - 检查Javascrīpt是否有产生带指定message的alert对话框
      - alert产生的顺序必须与检查的顺序一致
      - 检查alert时会产生与手动点击'OK'按钮一样的效果。如果一个alert产生了,而你却没有去检查它,selenium会在下个action中报错。
      - 注意:Selenium 不支持 Javascrīpt 在onload()事件时 调用alert();在这种情况下,Selenium需要你自己手动来点击OK.
    • assertConfirmation
      assertConfirmation(messagePattern)
      - 检查Javascrīpt是否有产生带指定message的confirmation对话框和alert情况一样,confirmation对话框也必须在它们产生的时候进行检查
      - 默认情况下,Selenium会让confirm() 返回true, 相当于手动点击Ok按钮的效果。你能够通过chooseCancelOnNextConfirmation命令让confirm()返回false.同样地,如果一个cofirmation对话框出现了,但你却没有检查的话,Selenium将会在下个action中报错
      - 注意:在Selenium的环境下,confirmation对话框框将不会再出现弹出显式对话框
      - 注意:Selenium不支持在onload()事件时调用confirmation对话框,在这种情况下,会出现显示confirmatioin对话框,并需要你自己手动点击。
    •  assertPrompt
      assertPrompt(messagePattern)
      - 检查Javascrīpt是否有产生带指定message的Prompt对话框
      - 你检查的prompt的顺序Prompt对话框产生的顺序必须相同
      - 必须在verifyPrompt之前调用answerOnNextPrompt命令
      - 如果prompt对话框出现了但你却没有检查,则Selenium会在下个action中报错
      answerOnNextPrompt Joe  
      click id=delegate  
      verifyPrompt Delegate to who?  

    四、 Parameters and Variables
    参数和变量的声明范围由简单的赋值到Javascrīpt表达式赋值。
    Store,storeValue 和storeText 为下次访问保存值。
    在Selenium内部是用一个叫storeVars的map来保存变量名。

    • Variable Substitution 变量替换
      提供了一个简单的方法去访问变量,语法 $.{xxx}
      store Mr title
      storeValue nameField surname
      store $.{title} $.{suname} fullname
      type textElement Full name is: $.{fullname}
    •  Javascrīpt Evaluation Javascrīpt赋值
      你能用Javascrīpt来构建任何你所需要的值。
      这个参数是以javascrīpt开头,语法是 javascrīpt.{'with a trailing'}。
      可以通过Javascrīpt表达式给某元素赋值。
      store javascrīpt.{'merchant'+(new Date()).getTime()} merchantId
      type textElement javascrīpt.{storedVars['merchantId'].toUpperCase()}
    • Generating Unique values 产生唯一值.  
      问题:你需要唯一的用户名
      解决办法: 基于时间来产生用户名,如'fred'+(new Date().getTime())  
  • 使用WMTF进行Windows Mobile程序的自动化测试

    2007-8-01


      随手打开MEDC 2007的课程列表页面,看到了一个课程的标题《使用Windows Mobile Test Framework进行自动化测试》,突然想起来新的Windows Mobile 6 SDK中似乎包含这个叫做什么Windows Mobile Test Framework的东东,于是乎打开WM6的安装目录下的Tools\Windows Mobile Test Framework\Windows Mobile Test Framework.zip这个zip包瞅一瞅。

      真是不看不知道,一看吓一跳。。。。。。微软居然把这个框架单独发布出来了。其实这套东西貌似在Windows CE 5的CE Tool Kit中就包含,不过现在貌似把它单独提出来进行推广了。那么,我也来写一个关于它的系列和大家来研究研究这套Windows Mobile Test Framework吧。

    一、微软Windows Mobile Test Framework简介
      
      Windows Mobile Test Framework(以后简称为WMTF)是微软内部使用的一套Windows CE/Windows Mobile上的自动化测试框架。使用这套框架,我们可以很方便的用它来模拟用户来对您的程序进行操作,来进行功能/UI/本地化等多种测试。
      此框架的整体结构如下图所示:

                         
            绿色部分为微软在这个Windows Mobile Test Framework中所提供的。
            橙色的UIAL,为我们需要使用微软在Windows Mobile Test Framework中的工具来自己生产且做少量修改工作的。
            蓝色部分为需要我们大家自己来完成的部分。

    二、Windows Mobile Test Framework各层次介绍
    1) Utils.Net:
            这一层提供了很多在其他各个层次中经常需要用到的公共对象或者是一些在.NET Fx中有而在.NET CF中被省略了的对象,例如进程/设备信息/内存/注册表等等等等。。。。。。
    2) Logging:
            这一层顾名思义,当然是封装了日志记录的功能,用来记录测试中的过程和结果。当然,这套Logging机制非常不错,不但在这里可以用,您甚至可以把它用于开发过程中甚至是桌面程序开发中。
    3) DATK:
            DATK的全称是Device Automation ToolKit。它是一套影射了所有的Windows CE上的标准控件的一套类库。例如文本框,列表框,按钮等等。同时,在这一层还有一个主要的对象叫做WindowsFinder,它几乎可以说是DATK甚至是WMTF的核心部分。您可以通过它来制定条件(例如类型,文本,进程等等)来寻找到某一个控件,然后把这个控件绑定到一个DATK控件上,然后您的代码来操作这个DATK 控件就可以实现对实际的控件的调用。这其实就是Windows Mobile Test Framework的核心部分。
    4)Mobility ToolKit:
            以后我们将它简称为MTK。MTK里面主要在DATK的基础上增添了许多针对移动设备特有的对象。可以认为它是DATK的一个扩展。
    5)UIAL:
            UIAL(UI Abstraction Layer),它是您要测试的应用程序的界面的一个影射。您必须为您的需要测试的每一个界面建立对应的UIAL层代码(借助微软提供的工具),这样才可以对程序进行测试。一个典型的UIAL层代码通常包含4部分。
        A. 对话框类:它是你要测试的那个对话框的一个影射,同时这个类里面也应该包含该界面上面所有控件地应的DATK控件。
        B. 应用程序类:用来启动该对话框。
        C. IdnHolder类:用来查找对话框中的本地化资源文字。
        D. 自测试代码:赫赫。。。从这一层起,就需要做测试了。
    6) Area Libraries:
            在这一层我们通常来封装一些可以复用的步骤。举例来说,您的测试程序中需要打开某一个对话框,而这个步骤显然是可以复用的(也许为了测试不同的地方我们需要反复的打开这个对话框)。那么我们就可以把这个打开程序,然后再打开该对话框的步骤封装到Area Libraries便于以后复用。
    7)Test Cases & Test Suites:
            这一层我们通常简称为Tests层,显然,在这一层我们用来编写我们的测试代码。和NUnit之类的很相似。使用Suite来把一些Test Cases组织到一起。

            最终,测试引擎Tux.NET将调用Tests层中的测试代码,按照您的测试脚本来测试程序。

    好了,这里您大概也许对Windows Mobile Test Framework有了个初步的印象了吧?也许还很晕,赫赫。。。没关系,在后面的章节中我将会陆续带领大家走进去探个究竟。 :)

    前言:

            在上一个小节中给大家简单介绍了WM6 SDK中带的Windows Mobile Test Framework。各位朋友可能对Windows Mobile Test Framework有了一个大概的印象,但是对于怎么使用它还是有些疑惑。由于我的工作比较繁忙,一直没有时间更新这个系列,对此很是抱歉。今天,我们就来用这个Windows Mobile Test Framework来做一个小小的测试,看看它是怎么运行的。让大家对它有个感性的认识。

    一、准备工作

            1. 打开Visual Studio 2005的菜单中的 工具-〉设备仿真器管理器。然后打开一个Windows Mobile 6的Professional模拟器。然后将该模拟器通过ActiveSync(如果是Vista则用WMDC)与计算机进行连接。

            2. 将Windows Mobile Test Framework.zip解开到某一个目录中。双击运行其中的CommandWindows快捷方式。则会弹出来一个命令提示符窗口。您在该窗口中输入“Set”然后回车,会发现“Path”参数中增加了Windows Mobile Test Framework下得Bin目录的路径。以及增加了_WMTFROOT这个变量。

            3. 在该命令提示符窗口中输入“SetupDevice”然后回车。则会自动向设备上Copy和安装一些必要的文件。(SetupDevice是一个批处理文件,您也可以在Bin目录下找到)

            4.在设备模拟器上,你会发现在“程序”中安装了一个快捷方式“CalView”。在设备的根目录下有一个test目录,里面是刚才copy进来的那些文件。其中包含CalView。您可以打开CalView,它是一个用来查看pOutlook中的日历信息的小程序。

            5. 通过ActiveSync或者WMDC将“%ProgramFiles%\Windows Mobile 6 SDK\Tools\Security\SDK Development Certificates\Certs.cab”拷贝到模拟器中,然后安装它。

            6. 手动在模拟器中的日历中建立一个条目以备后面的步骤使用。

    二、了解测试工程

            1. 打开_WMTFROOT下的CalViewSample这个目录,您会发现其中有三个子目录,分别是“AbstractionLayer”,“AreaLibrary”和“Tests”。它们就是在上一小节中介绍过的“UIAL”、“AreaLibrary”和“Tests”层。至于DATK和MTK,呵呵,他们都是微软已经提供了的。您可以在_WMTFROOT下的DeviceFiles目录中找到(分别是Microsoft.WindowsCE.DATK.dll和Microsoft.MobileDevices.MobilityToolKit.dll)。

            2. 由于Tests层的代码要引用Area Library层的代码;而Area Library层的代码要引用UIAL层的代码。所以,我们先用VS2005打开AbstractionLayer下的项目。CalView的AbstractionLayer分别针对PPC和Smartphone做了两个版本。我们先打开PocketPC目录下的解决方案。你会发现该解决方案中有两个项目,一个是“Microsoft.MobileDevices.AbstractionLayer.CalView.PocketPC”,一个是“TuxNet”。其中前者就是CalView的PPC版的程序的UIAL层代码,后者其实是一个空的项目,它的目的只是为了将它里面包含的那些文件部署到设备上去。打开UIAL层项目的属性,“设备”选项页。复选中“Authenticode签名”中的“用此证书对项目输出进行签名”。然后点击“选择证书...”,选中“TEST USE ONLY - Sample Privileged Root for Windows Mobile SDK”,这是一个测试用的特权证书。如果这里没有显示这个证书,那么点击“管理证书”,然后导入“%ProgramFiles%\Windows Mobile 6 SDK\Tools\Security\SDK Development Certificates\SamplePrivDeveloper.pfx”。然后再次打开这个选择证书页面就可以看到。它的目的就是给您的UIAL层代码进行测试签名,这样便于访问一些特权函数,避免运行过程中不断的弹出那些提示框,然后再编译此解决方案。接着关闭该解决方案,同样处理以及编译Smartphone版的UIAL层解决方案和Area Library层的解决方案。

            3. 打开Tests的解决方案同样处理。然后设置Tests层项目的属性中“调试”选项页中,“启动操作”为“启动外部程序”,并设置其值为“\test\TuxNet.exe”。

     

    三、运行测试程序

     

            1.  按下F5运行解决方案,注意请选择您已经启动好的那个模拟器。

            2. 您会发现模拟器中系统自动打开运行了CalView这个程序。然后调用了其中的“copy”菜单项来复制了一个日历项目。最后退出程序。

            3. 从模拟器中打开\test目录,您会发现一个resul