发布新日志

  • qtp 成为高手需要掌握常用com对象

    pcl2004_27 发布于 2008-07-11 15:47:17

       成为高手需要了解的基本com对象处理技术,了解常用的com对象的使用,如果你想成为高手,那么从下面对象开始吧:

    文件系统对象相关:
    ("scrīptING.FILESYSTEMOBJECT")

    应用:数据驱动技术常用,日志输入常用

    字典相关:
    ("scrīptING.DICTIONARY")

    应用:脚本配置控制开关 list对象item数据对比

    脚本外壳相关:
    ("Wscrīpt.SHELL")

    应用:最常用其中的sendkeys方法,利用在不可识别对象技术方面

    WINDOWS外壳相关:
    ("SHELL.APPLICATION")

     

    正则表达式相关:
    ("VBscrīpt.REGEXP")

    应用:网页解析,数据对比 验证点技术实现的一种

    编码与密码相关:
    ("scrīptPW.PASSWORD")
    ( "scrīptING.ENCODER" )

    应用:数据包传输测试过程中应用

    邮件发送的组件相关:
    ("JMAIL.MESSAGE")
    ("CDONTS.NEWMAIL")
    ("CDO.CONFIGURATION")
    ("EUDORA.EUAPPLICATION.1")
    ("NOVELLGROUPWARESESSION")

    应用:测试报告发送

    水晶报表相关:
     ("CRYSTALRUNTIME.APPLICATION")

    应用:测试报告美化,常用的是excel的报告输出,这种技术用的少

    IE浏览器相关:
    ("INTERNETEXPLORER.APPLICATION")

    应用:web测试用的比较多

    ADO相关:
    ("ADODB.CONNECTION")
    ("ADODB.COMMAND")
    ("ADODB.RECORDSET")
    ("ADODB.RECORD")
    ("ADODB.STREAM")
    ("DAO.DBENGINE.35")
    ("ADOX.CATALOG")
    ("ADOX.TABLE")

    应用:数据驱动,数据库验证,dao主要利用在access数据库处理

    SQL相关:
    ("SQLDMO.SQLSERVER")
    ("SQLDMO.LOGIN")
    ("SQLDMO.BACKUP")
    ("SQLDMO.USER")
    ("SQLDMO.BACKUPDEVICE")
    ("SQLDMO.DATABASE")
    ("SQLDMO.RESTORE")
    ("SQLDMO.APPLICATION")

    OFFICE相关:
    ("WORD.APPLICATION")
    ("EXCEL.APPLICATION")
    ("POWERPOINT.APPLICATION")
    ("EXCEL.SHEET")
    ("FRONTPAGE.APPLICATION")
    ("ACCESS.APPLICATION")
    ("MSGRAPH.APPLICATION")
    ("OUTLOOK.APPLICATION")

    应用:测试报告输出,数据驱动

    WMI相关:
    ("WBEMscrīptING.SWBEMDATETIME")
    ("WBEMscrīptING.SWBEMLOCATOR")
    ("WBEMscrīptING.SWBEMNAMEDVALUESET")
    ("WBEMscrīptING.SWBEMSINK", "SINK_")
    ("WBEMscrīptING.SWBEMREFRESHER")
    ("WBEMscrīptING.SWBEMLASTERROR")
    ("WBEMscrīptING.SWBEMOBJECTPATH")

    应用:初始化测试环境

    对象为我所用,我为测试所用

  • (转载) 修炼成QTP高手的十个步骤

    zte_boy 发布于 2008-07-09 21:54:19

    http://motevich.blogspot.com/上看到一篇文章,讲述成为QTP高手需要学习的几个方面的知识,以及一些有用的链接:
    1. VBscrīpt QTP实用VBscrīpt作为测试脚本语言,因此需要掌握很多VBscrīpt的知识:
    2. 软件测试自动化框架
    3. QTPTutorial帮助文档 Sources: '\help\QTTutorial.pdf' or '\help\Tutorial.chm' in QTP Install folder.
    4. QTP的用户指南 Sources: '\help\QTUsersGuide.pdf' or '\help\MainUsersGuide.chm' in QTP Install folder.
    5. COM/DCOM 技术 主要是Excel, Word, Outlook等相关的COM技术:
    6. SQL
    7. XML
    8. HTML, DOM 测试WEB应用程序时必须了解:
    9. HPQTP Knowledge Base 包含很多实用的QTP技术文章:
    10. 一些有用的网站
  • QTP中实现函数的重载

    zte_boy 发布于 2008-07-01 13:58:50

    大家都知道,在vbs中没有提供函数重载的功能,在很大程度上造成了开发脚本的不方便,其实在QTP中是可以将方法进行重载的,在QTP帮助里有很详细的说明

    其实无非就是两个方法:

    1、RegisterUserFunc

    原型:

    RegisterUserFunc TOClass, MethodName, FunctionName, SetAsDefault

    TOClass:测试对象

    MethodName:需要被重载的方法

    FunctionName:封装的函数名

    SetAsDefault:是否作为测试对象的标准方法

    2、UnRegisterUserFunc

    原型:

    UnRegisterUserFunc TOClass, MethodName

    TOClass:测试对象

    MethodName:需要被重载的方法

    实例:

    对于一个WebEdit的Set方法进行封装并重载

    Browser(xx).Page(xx).WebEdit(xx).Set "xxxx"

    希望在给这个WebEdit赋值前记录下之前的值,可以使用如下代码

    Function MySet (obj, newvalue)
        'obj:测试对象
        'newvalue:赋的新值
           dim oldvalue
           ōldvalue = obj.GetROProperty("value")
           Reporter.ReportEvent micDone, "previous value", oldvalue
           MySet=obj.Set(newvalue)
    End Function

    然后使用RegisterUserFunc和UnRegisterUserFunc方法:

    RegisterUserFunc "WebEdit" , "Set" , "MySet" , False

    Browser(xx).Page(xx).WebEdit(xx).Set "xxxx"

    UnRegisterUserFunc "WebEdit" , "Set"

    或者直接调用

    MySet Browser(xx).Page(xx).WebEdit(xx) , "xxxx"

    此时,MySet函数实际上是重载了Set方法,并增加了输入旧值的功能

    大家可以根据自己的需要来重载QTP的标准方法,在实际运用中有不小的作用

    比如:记录下初始值,便于测试后清理环境等

  • LR中监控ORACLE数据库常用计数器(如何自定义Oracle计数器)(转自jzl2004 )

    flyingbinbin 发布于 2007-06-05 08:54:35

    一、添加自定义计数器的方法

          要创建自定义查询,请执行以下操作:
    1.        在安装路径的Mercury LoadRunner\dat\monitors找到vmon.cfg文件,打开。
    2.        在vmon.cfg文件的第三行中,CustomCounters=指出要创建的自定义计数器个数。
    3.        在vmon.cfg文件中为新计数器新建一节,每节都有以下格式:
         [Custom0]
         Name=Five Hundred
    Descrīption=This counter always returns 500.
    Query=SELECT 500 FROM DUAL
    IsRate=0
    4.        在[Custom#]行,将计数器顺序中的下一个数字分配给新的自定义计数器。
    注意:自定义计数器必须是以数字0开始的联系顺序。
    5.        在Name行,输入新计数器的名称(可以输入中文)。
    6.        在Descrīption行,输入对该计数器的描述或解释(可以输入中文)。
    7.        在Query行,输入恰好返回数据库一行的SQL查询的文本,该行必须包含一列数值。
    注意:自定义查询文本不能够超过512字符。
    8.        在IsRate行,如果希望数据库将计数器报告为一个绝对值,请输入0;如果希望数
    据库报告每单位时间计数器的更改,请输入1。
    注意:自定义查询无法返回负值。
      
    例:
    [Custom0]
    ;Name must be unique
    Name=库快存命中率
    Descrīption=该计数器返回当前库快存命中率
    Query=SELECT 100*((sum(pins-reloads))/sum(pins)) from v$librarycache
    IsRate=0


    3        配置文件示例对象
    安装路径的Mercury LoadRunner\dat\monitors找到vmon.cfg文件:

    V$ Monitor]
    Counters=150
    CustomCounters=12
    ;How many seconds for each data sample?
    SamplingRate=10

    [Custom0]
    ;Name must be unique
    Name=库快存命中率
    Descrīption=该计数器返回当前库快存命中率
    Query=SELECT 100*((sum(pins-reloads))/sum(pins)) from v$librarycache
    IsRate=0

    [Custom1]
    ;Name must be unique
    Name=高速缓存区命中率
    Descrīption=oracle database shoot straight
    Query=SELECT round(1-SUM(PHYSICAL_READS)/(SUM(DB_BLOCK_GETS) + SUM(CONSISTENT_GETS)), 4) * 100 FROM (SELECT CASE WHEN NAME='physical reads' THEN VALUE END PHYSICAL_READS,CASE WHEN NAME = 'db block gets' THEN VALUE END  DB_BLOCK_GETS,CASE WHEN NAME = 'consistent gets' THEN VALUE END  CONSISTENT_GETS FROM V$SYSSTAT WHERE Name IN ('physical reads','db block gets','consistent gets'))
    IsRate=0

    [Custom2]
    ;Name must be unique
    Name=共享区库缓存区命中率
    Descrīption=命中率应大于0.99
    Query=Select round(sum(pins-reloads)/sum(pins) * 100, 2) from v$librarycache
    IsRate=0

    [Custom3]
    ;Name must be unique
    Name=共享区字典缓存区命中率
    Descrīption=命中率应大于0.85
    Query=Select round(sum(gets-getmisses-usage-fixed)/sum(gets) * 100, 2) from v$rowcache
    IsRate=0

    [Custom4]
    ;Name must be unique
    Name=检测回滚段的争用
    Descrīption=应该小于1%
    Query=select round(sum(waits)/sum(gets) * 100, 2) from v$rollstat
    IsRate=0

    [Custom5]
    ;Name must be unique
    Name=检测回滚段收缩次数
    Descrīption=应该小于1%
    Query=select sum(shrinks) from v$rollstat, v$rollname where v$rollstat.usn = v$rollname.usn
    IsRate=0

    [Custom6]
    ;Name must be unique
    Name=监控表空间的I/O读总数
    Descrīption=监控表空间的I/O
    Query=select sum(f.phyrds) pyr from v$filestat f, dba_data_files df where f.file# = df.file_id
    IsRate=0

    [Custom7]
    ;Name must be unique
    Name=监控表空间的I/O块读总数
    Descrīption=监控表空间的I/O
    Query=select sum(f.phyblkrd) pbr from v$filestat f, dba_data_files df where f.file# = df.file_id
    IsRate=0

    [Custom8]
    ;Name must be unique
    Name=监控表空间的I/O写总数
    Descrīption=监控表空间的I/O
    Query=select sum(f.phywrts) pyw from v$filestat f, dba_data_files df where f.file# = df.file_id
    IsRate=0
    .
    .
    .
    .
    .
    (以上为12个自定义的计数器,以下为LR工具自带的计数器)

    [0]
    Name=CPU used by this session
    Descrīption=This is the amount of CPU time (in 10s of milliseconds) used by a session between when a user call started and ended. Some user calls can complete within 10 milliseconds and as a result, the start and end user-call time can be the same. In this case, 0 milliseconds are added to the statistic. A similar problem can exist in the reporting by the operating system, especially on systems that suffer from many context switches.
    IsRate=0

    [1]
    Name=CPU used when call started
    Descrīption=The CPU time used when the call is started.
    IsRate=0
    .
    .
    .
    .


    二、常用自定义计数器列表

    序号        监控名称        SQL算法        说明
    1、   数据高速缓存区命中率        SELECT round(1-SUM(PHYSICAL_READS)/(SUM(DB_BLOCK_GETS) + SUM(CONSISTENT_GETS)), 4) * 100 FROM (SELECT CASE WHEN NAME='physical reads' THEN VALUE END PHYSICAL_READS,CASE WHEN NAME = 'db block gets' THEN VALUE END  DB_BLOCK_GETS,CASE WHEN NAME = 'consistent gets' THEN VALUE END  CONSISTENT_GETS FROM V$SYSSTAT WHERE Name IN ('physical reads','db block gets','consistent gets'))        (监控 SGA 的命中率)命中率应大于0.90最好

    2、   库快存命中率        SELECT 100*((sum(pins-reloads))/sum(pins)) from v$librarycache        该计数器返回当前库快存命中率

    3 、  共享区库缓存区命中率        Select round(sum(pins-reloads)/sum(pins) * 100, 2) from v$librarycache        (监控 SGA 中共享缓存区的命中率)命中率应大于0.99

    4、   监控 SGA 中字典缓冲区的命中率        Select round(sum(gets-getmisses-usage-fixed)/sum(gets) * 100, 2) from v$rowcache        (共享区字典缓存区命中率)命中率应大于0.85

    5、   检测回滚段的争用        select round(sum(waits)/sum(gets) * 100, 2) from v$rollstat        小于1%

    6、   检测回滚段收缩次数        select sum(shrinks) from v$rollstat, v$rollname where v$rollstat.usn = v$rollname.usn       

    7、   监控表空间的 I/O读总数        select sum(f.phyrds) pyr from v$filestat f, dba_data_files df where f.file# = df.file_id        监控表空间的 I/O

    8、    监控表空间的 I/O块读总数        select sum(f.phyblkrd) pbr from v$filestat f, dba_data_files df where f.file# = df.file_id        监控表空间的 I/O

    9、    监控表空间的 I/O写总数        select sum(f.phywrts) pyw from v$filestat f, dba_data_files df where f.file# = df.file_id        监控表空间的 I/O

    10、  监控表空间的 I/O块写总数        select sum(f.phyblkwrt) pbw  from v$filestat f, dba_data_files df where f.file# = df.file_id        监控表空间的 I/O

    11、   监控 SGA 中重做日志缓存区的命中率        SELECT Decode(immediate_gets+immediate_misses,0,0,immediate_misses/(immediate_gets+immediate_misses)*100) ratio2 FROM v$latch WHERE name IN ('redo copy')        应该小于1%

    12、   监控内存和硬盘的排序比率        select round(sum(case when name='sorts (disk)' then value else 0 end) / sum(case when name='sorts (memory)' then value else 0 end)*100,2) from (SELECT  name, value FROM v$sysstatWHERE name IN ('sorts (memory)', 'sorts (disk)'))        最好使它小于 10%
  • 在QTP里面用CDONTS组件发送邮件

    winfood 发布于 2007-08-03 12:24:49

    今天查了一下QTP Code Samples里面用Outlook发送邮件的代码,发现在帮助文档里面提供了两段代码例子。很显然第一段代码是在QTP中用Outlook发送邮件,那第二段代码是什么呢?

    ' Example 2
    Function SendMail(SendFrom, SendTo, Subject, Body)
        Set ōbjMail=CreateObject("CDONTS.Newmail")
        ObjMail.From = SendFrom
        ObjMail.To = SendTo
        ObjMail.Subject = Subject
        ObjMail.Body = Body
        ObjMail.Send
        Set ōbjMail = Nothing
    End Function

    第3行语句中的CDONTS.Newmail比较可疑,好像不属于Outlook组件。会不会是系统内的其他可以发送邮件的组件呢?在QTP中运行这段代码,CreateObject方法报告创建CDONTS.Newmail对象失败。看来CDONTS这不是系统中现成的组件。

    用Google查了一下才明白,原来CDONTS EMail是IIS提供的组件。使用这个组件有两个前提:

    • 系统安装并启动了SMTP服务
    • CDONTS.dll被注册到系统中(系统默认没有注册这个组件,从网上下载该组件并RegSvr32命令注册即可)

    重新检查并保证系统符合上面两个条件,再次在QTP中运行这段代码。这次顺利通过了,邮件被成功的发送到了制定邮箱。

    回想一下刚才的操作以及查阅资料中的解释,其实通过CDONTS组件发送邮件的基本步骤就是:

    • 创建CDONTS.Newmail对象
    • 给Newmial对象的各个属性赋值用于创建一个邮件
    • 用Newmail.Send方法向本地SMTP服务器发送了邮件

    用这种方式发送邮件的好处是可以直接发送邮件,不需要配置发送邮箱。当运行QTP脚本的测试机器为公用的时候可以考虑。而它的缺点是必须在本地机器上安装并运行SMTP服务。

  • [原创]QTP使用outlook发邮件

    风过无息 发布于 2007-03-20 17:04:09

    因为需要把一些错误信息发给相关人员,让工具更自动化。

    Dim objOutlook
    Dim objOutlookMsg
    Dim olMailItem
    ' Create the Outlook object and the new mail object.
    Set ōbjOutlook = CreateObject("Outlook.Application")
    Set ōbjOutlookMsg = objOutlook.CreateItem(olMailItem)
    Set mapi = objOutlook.GetNameSpace("MAPI")
    ' Define mail recipients
    objOutlookMsg.To = "
    my@email.com"
    'objOutlookMsg.CC = "
    my@email.com"
    ' objOutlookMsg.BCC = "
    my@email.com"
    ' Body of the message
    objOutlookMsg.Subject = "QTP Test Mail"
    objOutlookMsg.Body = "This is a test mail"
    'Display the email
    objOutlookMsg.Display
    ' Send the message
    objOutlookMsg.Send
    ' Release the objects
    objOutlook.quit
    Set ōbjOutlook = Nothing
    Set mapi = Nothing

  • 小故事大道理

    seamap 发布于 2007-11-27 16:47:55

    1、断箭
    春秋战国时代,一位父亲和他的儿子出征打丈。父亲已做了将军,儿子还只是马前卒。又一阵号角吹响,战鼓雷鸣了,父亲庄严地托起一个箭囊,其中插着一只箭。父亲郑重对儿子说:“这是家袭宝箭,配带身边,力量无穷,但千万不可抽出来。”

    那是一个极其精美的箭囊,厚牛皮打制,镶着幽幽泛光的铜边儿,再看露出的箭尾。一眼便能认定用上等的孔雀羽毛制作。儿子喜上眉梢,贪婪地推想箭杆、箭头的模样,耳旁仿佛嗖嗖地箭声掠过,敌方的主帅应声折马而毙.

    果然,配带宝箭的儿子英勇非凡,所向披靡。当鸣金收兵的号角吹响时,儿子再也禁不住得胜的豪气,完全背弃了父亲的叮嘱,强烈的欲望驱赶着他呼一声就拔出宝箭,试图看个究竟。骤然间他惊呆了。

    一只断箭,箭囊里装着一只折断的箭。
    我一直刳着只断箭打仗呢!儿子吓出了一身冷汗,仿佛顷刻间失去支柱的房子,轰然意志坍塌了。
    结果不言自明,儿子惨死于乱军之中。
    拂开蒙蒙的硝烟,父亲拣起那柄断箭,沉重地啐一口道:“不相信自己的意志,永远也做不成将军。”
    把胜败寄托在一只宝箭上,多么愚蠢,而当一个人把生命的核心与把柄交给别人,又多么危险!比如把希望寄托在儿女身上;把幸福寄托在丈夫身上;把生活保障寄托在单位身上……

    自己才是一只箭,若要它坚韧,若要它锋利,若要它百步穿杨,百发百中,磨砺它,拯救它的都只能是自己。

    2、生命的价值
    在一次讨论会上,一位著名的演说家没讲一句开场白,手里却高举着一张20美元的钞票。
    面对会议室里的200个人,他问:“谁要这20美元?”一只只手举了起来。他接着说:“我打算把这20美元送给你们中的一位,但在这之前,请准许我做一件事。”他说着将钞票揉成一团,然后问:“谁还要?”仍有人举起手来。

    他又说:“那么,假如我这样做又会怎么样呢?”他把钞票扔到地上,又踏上一只脚,并且用脚碾它。尔后他拾起钞票,钞票已变得又脏又皱。

    “现在谁还要?”还是有人举起手来。
    “朋友们,你们已经上了一堂很有意义的课。无论我如何对待那张钞票,你们还是想要它,因为它并没贬值,它依旧值20美元。人生路上,我们会无数次被自己的决定或碰到的逆境击倒、欺凌甚至碾得粉身碎骨。我们觉得自己似乎一文不值。但无论发生什么,或将要发生什么,在上帝的眼中,你们永远不会丧失价值。在他看来,肮脏或洁净,衣着齐整或不齐整,你们依然是无价之宝。”

    生命的价值不依赖我们的所作所为,也不仰仗我们结交的人物,而是取决于我们本身!我们是独特的——永远不要忘记这一点!
    3、昂起头来真美
    珍妮是个总爱低着头的小女孩,她一直觉得自己长得不够漂亮。有一天,她到饰物店去买了只绿色蝴蝶结,店主不断赞美她戴上蝴蝶结挺漂亮,珍妮虽不信,但是挺高兴,不由昂起了头,急于让大家看看,出门与人撞了一下都没在意。

    珍妮走进教室,迎面碰上了她的老师,“珍妮,你昂起头来真美!”老师爱抚地拍拍她的肩说。
    那一天,她得到了许多人的赞美。她想一定是蝴蝶结的功劳,可往镜前一照,头上根本就没有蝴蝶结,一定是出饰物店时与人一碰弄丢了。

    自信原本就是一种美丽,而很多人却因为太在意外表而失去很多快乐。
    无论是贫穷还是富有,无论是貌若天仙,还是相貌平平,只要你昂起头来,快乐会使你变得可爱——人人都喜欢的那种可爱。
    4、为生命画一片树叶
    病房里,一个生命垂危的病人从房间里看见窗外的一棵树,在秋风中一片片地掉落下来。病人望着眼前的萧萧落叶,身体也随之每况愈下,一天不如一天。她说:“当树叶全部掉光时,我也就要死了。”一位老画家得知后,用彩笔画了一片叶脉青翠的树叶挂在树枝上。

    最后一片叶子始终没掉下来。只因为生命中的这片绿,病人竟奇迹般地活了下来。
    人生可以没有很多东西,却唯独不能没有希望。希望是人类生活的一项重要的价值。有希望之处,生命就生生不息!
    5、飞翔的蜘蛛
    一天,我发现一只黑蜘蛛在后院的两檐之间结了一张很大的网。难道蜘蛛会飞?要不,从这个檐头到那个檐头,中间有一丈余宽,第一根线是怎么拉过去的?后来,我发现蜘蛛走了许多弯路——从一个檐头起,打结,顺墙而下,一步一步向前爬,小心翼翼,翘起尾部,不让丝沾到地面的沙石或别的物体上,走过空地,再爬上对面的檐头,高度差不多了,再把丝收紧,以后也是如此。

    蜘蛛不会飞翔,但它能够把网凌结在半空中。它是勤奋、敏感、沉默而坚韧的昆虫,它的网制得精巧而规矩,八卦形地张开,仿佛得到神助。这样的成绩,使人不由想起那些沉默寡言的人和一些深藏不露的智者。于是,我记住了蜘蛛不会飞翔,但它照样把网结在空中。奇迹是执着者造成的。

    6、阴影是条纸龙
    人生中,经常有无数来自外部的打击,但这些打击究竟会对你产生怎样的影响,最终决定权在你手中。
    祖父用纸给我做过一条长龙。长龙腹腔的空隙仅仅只能容纳几只蝗虫,投放进去,它们都在里面死了,无一幸免!祖父说:“蝗虫性子太躁,除了挣扎,它们没想过用嘴巴去咬破长龙,也不知道一直向前可以从另一端爬出来。因而,尽管它有铁钳般的嘴壳和锯齿一般的大腿,也无济于事。

    “当祖父把几只同样大小的青虫从龙头放进去,然后关上龙头,仅仅几分钟,小青虫们就一一地从龙尾爬了出来。
    命运一直藏匿在我们的思想里。许多人走不出人生各个不同阶段或大或小的阴影,并非因为他们天生的个人条件比别人要差嘣叮且蛭敲挥兴枷胍跤爸搅疲裁挥心托穆卣易家桓龇较颍徊讲降叵蚯埃钡窖矍俺鱿中碌亩刺臁?/P>

    7、成功并不像你想像的那么难
    1965年,一位韩国学生到剑桥大学主修心理学。在喝下午茶的时候,他常到学校的咖啡厅或茶座听一些成功人士聊天。这些成功人士包括诺贝尔奖获得者,某些领域的学术权威和一些创造了经济神话的人,这些人幽默风趣,举重若轻,把自己的成功都看得非常自然和顺理成章。时间长了,他发现,在国内时,他被一些成功人士欺骗了。那些人为了让正在创业的人知难而退,普遍把自己的创业艰辛夸大了,也就是说,他们在用自己的成功经历吓唬那些还没有取得成功的人。

    作为心理系的学生,他认为很有必要对韩国成功人士的心态加以研究。1970年,他把《成功并不像你想像的那么难》作为毕业论文,提交给现代经济心理学的创始人威尔·布雷登教授。布雷登教授读后,大为惊喜,他认为这是个新发现,这种现象虽然在东方甚至在世界各地普遍存在,但此前还没有一个人大胆地提出来并加以研究。惊喜之余,他写信给他的剑桥校友——当时正坐在韩国政坛第一把交椅上的人。他在信中说,“我不敢说这部著作对你有多大的帮助,但我敢肯定它比你的任何一个政令都能产生震动。”

    后来这本书果然伴随着韩国的经济起飞了。这本书鼓舞了许多人,因为他们从一个新的角度告诉人们,成功与“劳其筋骨,饿其体肤”、“三更灯火五更鸡”、“头悬梁,锥刺股”没有必然的联系。只要你对某一事业感兴趣,长久地坚持下去就会成功,因为上帝赋予你的时间和智慧够你圆满做完一件事情。后来,这位青年也获得了成功,他成了韩国泛业汽车公司的总裁。

    人世中的许多事,只要想做,都能做到,该克服的困难,也都能克服,用不着什么钢铁般的意志,更用不着什么技巧或谋略。只要一个人还在朴实而饶有兴趣地生活着,他终究会发现,造物主对世事的安排,都是水到渠成的。

    8、永远的坐票
    生活真是有趣:如果你只接受最好的,你经常会得到最好的。
    有一个人经常出差,经常买不到对号入坐的车票。可是无论长途短途,无论车上多挤,他总能找到座位。
    他的办法其实很简单,就是耐心地一节车厢一节车厢找过去。这个办法听上去似乎并不高明,但却很管用。每次,他都做好了从第一节车厢走到最后一节车厢的准备,可是每次他都用不着走到最后就会发现空位。他说,这是因为像他这样锲而不舍找座位的乘客实在不多。经常是在他落座的车厢里尚余若干座位,而在其他车厢的过道和车厢接头处,居然人满为患。

    他说,大多数乘客轻易就被一两节车厢拥挤的表面现象迷惑了,不大细想在数十次停靠之中,从火车十几个车门上上下下的流动中蕴藏着不少提供座位的机遇;即使想到了,他们也没有那一份寻找的耐心。眼前一方小小立足之地很容易让大多数人满足,为了一两个座位背负着行囊挤来挤去有些人也觉得不值。他们还担心万一找不到座位,回头连个好好站着的地方也没有了。与生活中一些安于现状不思进取害怕失败的人,永远只能滞留在没有成功的起点上一样,这些不愿主动找座位的乘客大多只能在上车时最初的落脚之处一直站到下车。

    温馨提示:自信、执着、富有远见、勤于实践,会让你握有一张人生之旅永远的坐票。
    9、心中的顽石
    阻碍我们去发现、去创造的,仅仅是我们心理上的障碍和思想中的顽石。
    从前有一户人家的菜园摆着一颗大石头,宽度大约有四十公分,高度有十公分。到菜园的人,不小心就会踢到那一颗大石头,不是跌倒就是擦伤。

    儿子问:"爸爸,那颗讨厌的石头,为什么不把它挖走?"
    爸爸这么回答:"你说那颗石头喔?从你爷爷时代,就一直放到现在了,它的体积那么大,不知道要挖到到什么时候,没事无聊挖石头,不如走路小心一点,还可以训练你的反应能力。"

    过了几年,这颗大石头留到下一代,当时的儿子娶了媳妇,当了爸爸。
    有一天媳妇气愤地说:"爸爸,菜园那颗大石头,我越看越不顺眼,改天请人搬走好了。"
    爸爸回答说:"算了吧!那颗大石头很重的,可以搬走的话在我小时候就搬走了,哪会让它留到现在啊?"
    媳妇心底非常不是滋味,那颗大石头不知道让她跌倒多少次了。
    有一天早上,媳妇带着锄头和一桶水,将整桶水倒在大石头的四周。
    十几分钟以后,媳妇用锄头把大石头四周的泥土搅松。
    媳妇早有心理准备,可能要挖一天吧,谁都没想到几分钟就把石头挖起来,看看大小,这颗石头没有想像的那么大,都是被那个巨大的外表蒙骗了。

    温馨提示:你抱着下坡的想法爬山,便无从爬上山去。如果你的世界沉闷而无望,那是因为你自己沉闷无望。改变你的世界,必先改变你自己的心态。

    10、追求忘我
    不要把自己当做鼠,否则肯定被猫吃。
    1858年,瑞典的一个富豪人家生下了一个女儿。然而不久,孩子染患了一种无法解释的瘫痪症,丧失了走路的能力。
    一次,女孩和家人一起乘船旅行。船长的太太给孩子讲船长有一只天堂鸟,她被这只鸟的描述迷住了,极想亲自看一看。于是保姆把孩子留在甲板上,自己去找船长。孩子耐不住性子等待,她要求船上的服务生立即带她去看天堂鸟。那服务生并不知道她的腿不能走路,而只顾带着她一道去看那只美丽的小鸟。奇迹发生了,孩子因为过度地渴望,竟忘我地拉住服务生的手,慢慢地走了起来。从此,孩子的病便痊愈了。女孩子长大后,又忘我地投入到文学创作中,最后成为第一位荣获诺贝尔文学奖的女性,也就是茜尔玛·拉格萝芙。

    温馨提示:忘我是走向成功的一条捷径,只有在这种环境中,人才会超越自身的束缚,释放出最大的能量。
    11、乐观者与悲观者
    乐观者在每次危难中都看到了机会,而悲观的人在每个机会中都看到了危难。
    父亲欲对一对孪生兄弟作"性格改造",因为其中一个过分乐观,而另一个则过分悲观。一天,他买了许多色泽鲜艳的新玩具给悲观孩子,又把乐观孩子送进了一间堆满马粪的车房里。

    第二天清晨,父亲看到悲观孩子正泣不成声,便问:"为什么不玩那些玩具呢?"
    "玩了就会坏的。"孩子仍在哭泣。
    父亲叹了口气,走进车房,却发现那乐观孩子正兴高采烈地在马粪里掏着什么。
    "告诉你,爸爸。"那孩子得意洋洋地向父亲宣称,"我想马粪堆里一定还藏着一匹小马呢!"
    温馨提示:乐观者与悲观者之间,其差别是很有趣的:乐观者看到的是油炸圈饼,悲观者看到的是一个窟窿。
    12、勇于冒险
    对于那些害怕危险的人,危险无处不在。
    有一天,龙虾与寄居蟹在深海中相遇,寄居蟹看见龙虾正把自己的硬壳脱掉,只露出娇嫩的身躯。寄居蟹非常紧张地说:"龙虾,你怎可以把唯一保护自己身躯的硬壳也放弃呢?难道你不怕有大鱼一口把你吃掉吗?以你现在的情况来看,连急流也会把你冲到岩石去,到时你不死才怪呢?"

    龙虾气定神闲地回答:"谢谢你的关心,但是你不了解,我们龙虾每次成长,都必须先脱掉旧壳,才能生长出更坚固的外壳,现在面对的危险,只是为了将来发展得更好而作出准备。"

    寄居蟹细心思量一下,自己整天只找可以避居的地方,而没有想过如何令自己成长得更强壮,整天只活在别人的护荫之下,难怪永远都限制自己的发展。

    温馨提示:每个人都有一定的安全区,你想跨越自己目前的成就,请不要划地自限,勇于接受挑战充实自我,你一定会发展得比想像中更好。

    13、再试一次
    什么东西比石头还硬,或比水还软?然而软水却穿透了硬石,坚持不懈而已。
    有个年轻人去微软公司应聘,而该公司并没有刊登过招聘广告。见总经理疑惑不解,年轻人用不太娴熟的英语解释说自己是碰巧路过这里,就贸然进来了。总经理感觉很新鲜,破例让他一试。面试的结果出人意料,年轻人表现糟糕。他对总经理的解释是事先没有准备,总经理以为他不过是找个托词下台阶,就随口应道:"等你准备好了再来试吧"。

    一周后,年轻人再次走进微软公司的大门,这次他依然没有成功。但比起第一次,他的表现要好得多。而总经理给他的回答仍然同上次一样:"等你准备好了再来试。"就这样,这个青年先后5次踏进微软公司的大门,最终被公司录用,成为公司的重点培养对象。

    温馨提示:也许,我们的人生旅途上沼泽遍布,荆棘丛生;也许我们追求的风景总是山重水复,不见柳暗花明;也许,我们前行的步履总是沉重、蹒跚;也许,我们需要在黑暗中摸索很长时间,才能找寻到光明;也许,我们虔诚的信念会被世俗的尘雾缠绕,而不能自由翱翔;也许,我们高贵的灵魂暂时在现实中找不到寄放的净土……那么,我们为什么不可以以勇敢者的气魄,坚定而自信地对自己说一声"再试一次!"

    再试一次,你就有可能达到成功的彼岸!
    14、天道酬勤
    没有人能只依靠天分成功。上帝给予了天分,勤奋将天分变为天才。
    曾国藩是中国历史上最有影响的人物之一,然他小时候的天赋却不高。有一天在家读书,对一篇文章重复不知道多少遍了,还在朗读,因为,他还没有背下来。这时候他家来了一个贼,潜伏在他的屋檐下,希望等读书人睡觉之后捞点好处。可是等啊等,就是不见他睡觉,还是翻来复去地读那篇文章。贼人大怒,跳出来说,"这种水平读什么书?"然后将那文章背诵一遍,扬长而去!

    贼人是很聪明,至少比曾先生要聪明,但是他只能成为贼,而曾先生却成为主席都钦佩的人:"近代最有大本夫源的人。"
    "勤能补拙是良训,一分辛苦一分才。"那贼的记忆力真好,听过几遍的文章都能背下来,而且很勇敢,见别人不睡觉居然可以跳出来"大怒",教训曾先生之后,还要背书,扬长而去。但是遗憾的是,他名不经传,曾先生后来启用了一大批人才,按说这位贼人与曾先生有一面之交,大可去施展一二,可惜,他的天赋没有加上勤奋,变得不知所终。

    温馨提示:伟大的成功和辛勤的劳动是成正比的,有一分劳动就有一分收获,日积月累,从少到多,奇迹就可以创造出来。
    15、好学不倦
    只有一个洞穴的老鼠很快被捉。
    在一个漆黑的晚上,老鼠首领带领着小老鼠出外觅食,在一家人的厨房内,垃圾桶之中有很多剩余的饭菜,对于老鼠来说,就好像人类发现了宝藏。

    正当一大群老鼠在垃圾桶及附近范围大挖一顿之际,突然传来了一阵令它们肝胆俱裂的声音,那就是一头大花猫的叫声。它们震惊之余,更各自四处逃命,但大花猫绝不留情,不断穷追不舍,终于有两只小老鼠走避不及,被大花猫捉到,正要向它们吞噬之际,突然传来一连串凶恶的狗吠声,令大花猫手足无措,狼狈逃命。

    大花猫走后,老鼠首领施施然从垃圾桶后面走出来说:"我早就对你们说,多学一种语言有利无害,这次我就因而救了你们一命。"
    温馨提示:"多一门技艺,多一条路。"不断学习实在是成功人士的终身承诺。
    16、居安思危
    洪水未到先筑堤,豺狼未来先磨刀。
    一只野狼卧在草上勤奋地磨牙,狐狸看到了,就对它说:"天气这么好,大家在休息娱乐,你也加入我们队伍中吧!"野狼没有说话,继续磨牙,把它的牙齿磨得又尖又利。狐狸奇怪地问道:"森林这么静,猎人和猎狗已经回家了,老虎也不在近处徘徊,又没有任何危险,你何必那么用劲磨牙呢?"野狼停下来回答说:"我磨牙并不是为了娱乐,你想想,如果有

    一天我被猎人或老虎追逐,到那时,我想磨牙也来不及了。而平时我就把牙磨好,到那时就可以保护自己了。"
    温馨提示:做事应该未雨绸缪,居安思危,这样在危险突然降临时,才不至于手忙脚乱。"书到用时方恨少",平常若不充实学问,临时抱佛脚是来不及的。也有人抱怨没有机会,然而当升迁机会来临时,再叹自己平时没有积蓄足够的学识与能力,以致不能胜任,也只好后悔莫及。

    17、困境即是赐予
    一个障碍,就是一个新的已知条件,只要愿意,任何一个障碍,都会成为一个超越自我的契机。
    有一天,素有森林之王之称的狮子,来到了天神面前:"我很感谢你赐给我如此雄壮威武的体格、如此强大无比的力气,让我有足够的能力统治这整座森林。"

    天神听了,微笑地问:"但是这不是你今天来找我的目的吧!看起来你似乎为了某事而困扰呢!"
    狮子轻轻吼了一声,说:"天神真是了解我啊!我今天来的确是有事相求。因为尽管我的能力再好,但是每天鸡鸣的时候,我总是会被鸡鸣声给吓醒。神啊!祈求您,再赐给我一个力量,让我不再被鸡鸣声给吓醒吧!"

    天神笑道:"你去找大象吧,它会给你一个满意的答复的。"
    狮子兴匆匆地跑到湖边找大象,还没见到大象,就听到大象跺脚所发出的"砰砰"响声。
    狮子加速地跑向大象,却看到大象正气呼呼地直跺脚。
    狮子问大象:"你干嘛发这么大的脾气?"
    大象拼命摇晃着大耳朵,吼着:"有只讨厌的小蚊子,总想钻进我的耳朵里,害我都快痒死了。"
    狮子离开了大象,心里暗自想着:"原来体型这么巨大的大象,还会怕那么瘦小的蚊子,那我还有什么好抱怨呢?毕竟鸡鸣也不过一天一次,而蚊子却是无时无刻地骚扰着大象。这样想来,我可比他幸运多了。"

    狮子一边走,一边回头看着仍在跺脚的大象,心想:"天神要我来看看大象的情况,应该就是想告诉我,谁都会遇上麻烦事,而它并无法帮助所有人。既然如此,那我只好靠自己了!反正以后只要鸡鸣时,我就当做鸡是在提醒我该起床了,如此一想,鸡鸣声对我还算是有益处呢?"

    温馨提示:在人生的路上,无论我们走得多么顺利,但只要稍微遇上一些不顺的事,就会习惯性地抱怨老天亏待我们,进而祈求老天赐给我们更多的力量,帮助我们度过难关。但实际上,老天是最公平的,就像它对狮子和大象一样,每个困境都有其存在的正面价值。

    18、永远的一课
    面对困难,许多人戴了放大镜,但和困难拼搏一番,你会觉得,困难不过如此。
    那天的风雪真暴,外面像是有无数发疯的怪兽在呼啸厮打。雪恶狠狠地寻找袭击的对象,风呜咽着四处搜索。
    大家都在喊冷,读书的心思似乎已被冻住了。一屋的跺脚声。
    鼻头红红的欧阳老师挤进教室时,等待了许久的风席卷而入,墙壁上的《中学生守则》一鼓一顿,开玩笑似的卷向空中,又一个跟头栽了下来。

    往日很温和的欧阳老师一反常态:满脸的严肃庄重甚至冷酷,一如室外的天气。
    乱哄哄的教室静了下来,我们惊异地望着欧阳老师。
    "请同学们穿上胶鞋,我们到操场上去。"
    几十双眼睛在问。
    "因为我们要在操场上立正五分钟。"
    即使欧阳老师下了"不上这堂课,永远别上我的课"的恐吓之词,还是有几个娇滴滴的女生和几个很横的男生没有出教室。
    操场在学校的东北角,北边是空旷的菜园,再北是一口大塘。
    那天,操场、菜园和水塘被雪连成了一个整体。
    矮了许多的篮球架被雪团打得"啪啪"作响,卷地而起的雪粒雪团呛得人睁不开眼张不开口。脸上像有无数把细窄的刀在拉在划,厚实的衣服像铁块冰块,脚像是踩在带冰碴的水里。

    我们挤在教室的屋檐下,不肯迈向操场半步。
    欧阳老师没有说什么,面对我们站定,脱下羽绒衣,线衣脱到一半,风雪帮他完成了另一半。"在操场上去,站好!"欧阳老师脸色苍白,一字一顿地对我们说。

    谁也没有吭声,我们老老实实地到操场排好了三列纵队。
    瘦削的欧阳老师只穿一件白衬褂,衬褂紧裹着的他更显单薄。
    后来,我们规规矩矩地在操场站了五分多钟。
    在教室时,同学们都以为自己敌不过那场风雪,事实上,叫他们站半个小时,他们顶得住,叫他们只穿一件衬衫,他们也顶得住。
    温馨提示:正如生命中的许多伤痛一样,其实并不如自己想像的那么严重。如果不把它当回事,它是不会很痛的。你觉得痛,那是因为你自以为伤口在痛,害怕伤口的痛。

    19、大海里的船
    在大海上航行的船没有不带伤的。
    英国劳埃德保险公司曾从拍卖市场买下一艘船,这艘船1894年下水,在大西洋上曾138次遭遇冰山,116次触礁,13次起火,207次被风暴扭断桅杆,然而它从没有沉没过。

    劳埃德保险公司基于它不可思议的经历及在保费方面给带来的可观收益,最后决定把它从荷兰买回来捐给国家。现在这艘船就停泊在英国萨伦港的国家船舶博物馆里。

    不过,使这艘船名扬天下的却是一名来此观光的律师。当时,他刚打输了一场官司,委托人也于不久前自杀了。尽管这不是他的第一次失败辩护,也不是他遇到的第一例自杀事件,然而,每当遇到这样的事情,他总有一种负罪感。他不知该怎样安慰这些在生意场上遭受了不幸的人。

    当他在萨伦船舶博物馆看到这艘船时,忽然有一种想法,为什么不让他们来参观参观这艘船呢?于是,他就把这艘船的历史抄下来和这艘船的照片一起挂在他的律师事务所里,每当商界的委托人请他辩护,无论输赢,他都建议他们去看看这艘船。

    它使我们知道:在大海上航行的船没有不带伤的。
    温馨提示:虽然屡遭挫折,却能够坚强地百折不挠地挺住,这就是成功的秘密。


    20、驴的哲学
    人生必须渡过逆流才能走向更高的层次,最重要的是永远看得起自己。
    有一天某个农夫的一头驴子,不小心掉进一口枯井里,农夫绞尽脑汁想办法救出驴子,但几个小时过去了,驴子还在井里痛苦地哀嚎着。

    最后,这位农夫决定放弃,他想这头驴子年纪大了,不值得大费周章去把它救出来,不过无论如何,这口井还是得填起来。于是农夫便请来左邻右舍帮忙一起将井中的驴子埋了,以免除它的痛苦。

    农夫的邻居们人手一把铲子,开始将泥土铲进枯井中。当这头驴子了解到自己的处境时,刚开始哭得很凄惨。但出人意料的是,一会儿之后这头驴子就安静下来了。农夫好奇地探头往井底一看,出现在眼前的景象令他大吃一惊:

    当铲进井里的泥土落在驴子的背部时,驴子的反应令人称奇──它将泥土抖落在一旁,然后站到铲进的泥土堆上面!
    就这样,驴子将大家铲倒在它身上的泥土全数抖落在井底,然后再站上去。很快地,这只驴子便得意地上升到井口,然后在众人惊讶的表情中快步地跑开了!

    温馨提示:就如驴子的情况,在生命的旅程中,有时候我们难免会陷入"枯井"里,会被各式各样的"泥沙"倾倒在我们身上,而想要从这些"枯井"脱困的秘诀就是:将"泥沙"抖落掉,然后站到上面去!

  • 【转】测试经理的能力要求

    ruanyongjie 发布于 2007-12-05 21:52:39

    中层经理人不论是作为一名执行者、还是一名领导者,都必须通过别人来完成任务。要做个“服众”的经理人,应该有意识地提高以下八项能力:

    1. 领悟能力
        做任何一件事以前,一定要先弄清楚上司希望你怎么做,然后以此为目标来把握做事的方向,这一点很重要,千万不要一知半解就开始埋头苦干,到头来力没少出、活没少干,但结果是事倍功半,甚至前功尽弃。要清楚悟透一件事,胜过草率做十件事,并且会事半功倍。

    2. 计划能力
        执行任何任务都要制定计划,把各项任务按照轻、重、缓、急列出计划表,一一分配部属来承担,自己看头看尾即可。把眼光放在部门未来的发展上,不断理清明天、后天、下周、下月,甚至明年的计划上。在计划的实施及检讨时,要预先掌握关键性问题,不能因琐碎的工作,而影响了应该做的重要工作。要清楚做好20%的重要工作,等于创造80%的业绩。

    3. 指挥能力
        无论计划如何周到,如果不能有效地加以执行,仍然无法产生预期的效果,为了使部属有共同的方向可以执行制定的计划,适当的指挥是有必要的。
        指挥部属,首先要考量工作分配,要检测部属与工作的对应关系,也要考虑指挥的方式,语气不好或是目标不明确,都是不好的指挥。而好的指挥可以激发部属的意愿,而且能够提升其责任感与使命感。要清楚指挥的最高艺术,是部属能够自我指挥。

    4. 控制能力
        控制就是追踪考核,确保目标达到、计划落实。虽然谈到控制会令人产生不舒服的感觉,然而企业的经营有其十分现实的一面,有些事情不及时加以控制,就会给企业造成直接与间接的损失。但是,控制若是操之过急或是控制力度不足,同样会产生反作用:控制过严使部属口服心不服,控制不力则可能现场的工作纪律也难以维持。要清楚最理想的控制,就是让部属通过目标管理方式实现自我控制。

    5. 协调能力
        任何工作,如能照上述所说的要求,制定完善的计划、再下达适当的命令、采取必要的控制,工作理应顺利完成,但事实上,主管的大部分时间都必须花在协调工作上。协调不仅包括内部上下级、部门与部门之间的共识协调,也包括与外部客户、关系单位、竞争对手之间的利益协调,任何一方协调不好都会影响执行计划的完成。要清楚最好的协调关系就是实现共赢。

    6. 授权能力
        任何人的能力都是有限的,作为高级经理人不能象业务员那样事事亲历亲为,而要明确自己的职责就是培养下属共同成长,给自己机会,更要为下属的成长创造机会。孤家寡人是成就不了事业的。部属是自己的一面镜子,也是延伸自己智力和能力的载体,要赋予下属责、权、利,下属才会有做事的责任感和成就感,要清楚一个部门的人琢磨事,肯定胜过自己一个脑袋琢磨事,这样下属得到了激励,你自己又可以放开手脚做重要的事,何乐而不为。切记成就下属,就是成就自己。

    7. 判断能力
        判断对于一个经理人来说非常重要,企业经营错综复杂,常常需要主管去了解事情的来龙去脉因果关系,从而找到问题的真正症结所在,并提出解决方案。这就要求洞察先机,未雨绸缪。要清楚这样才能化危机为转机,最后变成良机。

    8. 创新能力
        创新是衡量一个人、一个企业是否有核心竞争能力的重要标志,要提高执行力,除了要具备以上这些能力外,更重要的还要时时、事事都有强烈的创新意识,这就需要不断地学习,而这种学习与大学里那种单纯以掌握知识为主的学习是很不一祥的,它要求大家把工作的过程本身当作一个系统的学习过程,不断地从工作中发现问题、研究问题、解决问题。解决问题的过程,也就是向创新迈进的过程。因此,我们做任何一件事都可以认真想一想,有没有创新的方法使执行的力度更大、速度更快、效果更好。要清楚创新无极限,唯有创新,才能生存。

    领导力更需提升
        一个部门经理提高完成任务执行力的过程,其实也就是提高自身对部门员工领导力的过程。因为要提高执行部门的执行力,不是光靠经理一人所能完成的,而是要靠带领部门所有员工的共同努力才能完成的。
       说到底,对上提高执行力、对下就要提升领导力。
        那么,怎样才能提升领导力呢?除了提高以上八项能力之外,还有最重要的两点:
    1. 学会用老板眼光看企业。
        在老板看来,管理很简单,就是两件事:一是扩大业务范围,增加业务收人;另一件事就是降低管理成本,控制运作费用。其实这两件事,最终是一件事,收入减去成本,减去费用,就是利润。所以归根到底老板是看利润的,利润要从管理中来。
    2. 从被领导中学习领导。
        在领导人看来,领导也很简单,就是两件事:一是用人,内圈用德、外圈用才,用人所长、容人所短;二是激励,解人之难、记人之功,通过正面激励,引导下属往前跑,通过负面激励,推着下属往前走。要知道,任何领导都是从做下属开始的,谁都不可能一步登天当领导。在每个人的成长过程中,你会经历大大小小许多领导,只要你用心学习,不管是好领导、还是坏领导,你都可以从正反两方面学到经验和教训,这对你将来当好领导是十分珍贵的。

    除了以上各种能力外,测试技能不能丢,通过技术服众可以保证管理的有效执行。

  • 验证码技术介绍(转)

    linwenyan 发布于 2007-12-12 11:44:26

    作者:陈十三哥    发布时间:2005-07-30

     

    验证码不同于注册码,注册码是软件作者根据提交的机器码通过特殊算法算出的,能让软件正常运行的密码。


    一.常见的验证码
    1,四位数字,随机的一数字字符串,最原始的验证码,验证作用几乎为零。

    2,CSDN网站用户登录用的是GIF格式,目前常用的随机数字图片验证码。图片上的字符比较中规中矩,验证作用比上一个好。没有基本图形图像学知识的人,不可破!可惜读取它的程序,在CSDN使用它的第一天,好像就在论坛里发布了,真是可怜!

    3,QQ网站用户登录用的是PNG格式,图片用的随机数字+随机大写英文字母,整个构图有点张扬,每刷新一次,每个字符还会变位置呢!有时候出来的图片,人眼都识别不了,厉害啊…

    4,MS的hotmail申请时候的是BMP格式, 随机数字+随机大写英文字母+随机干扰像素+随机位置。

    5,Google的Gmail注册时候的是JPG格式,随机英文字母+随机颜色+随机位置+随机长度。

    6,其他各大论坛的是XBM格式,内容随机。

    二.验证码作用分析

    验证码起源:因为攻击者会使用有害程序注册大量的 Web 服务帐户(如 Passport)。攻击者可以使用这些帐户为其他的用户制造麻烦,如发送垃圾邮件或通过同时反复登录多个帐户来延缓服务的速度。在大多数情况下,自动注册程序不能识别此图片中的字符。简单的说呢,就是防止攻击者编写程序,自动注册,重复登录暴力破解密码。验证码技术应运而生。

    验证码实现流程:服务器端随机生成验证码字符串,保存在内存中,并写入图片,发送给浏览器端显示,浏览器端输入验证码图片上字符,然后提交服务器端,提交的字符和服务器端保存的该字符比较是否一致。一致就继续,否则返回提示。攻击者编写的robot程序,很难识别验证码字符,顺利的完成自动注册,登录。。。。。。。。。而用户可以识别填写,所以这就实现了阻挡攻击的作用。而图片的字符识别,就是看图片上的干扰强度了。就实际的效果来说,验证码只是增加攻击者的难度,而不可能完全的防止。

    1,论坛中的验证码的作用
        目前,不少网站为了防止用户利用机器人自动注册、登录、灌水,都采用了验证码技术。所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。
        因为你的WEB站有时会碰到客户机恶意攻击,其中一种很常见的攻击手段就是身份欺骗它通过在客户端脚本写入一些代码,然后利用其客户机在网站论坛反复登陆,或者攻击者创建一个HTML窗体,其窗体如果包含了你注册窗体或发帖窗体等相同的字段,然后利用"http-post"传输数据到服务器,服务器会执行相应的创建帐户,提交垃圾数据等操作,如果服务器本身不能有效验证并拒绝此非法操作,它会很严重耗费其系统资源,降低网站性能甚至使程序崩溃.
        而现在流行的判断访问WEB程序是合法用户还是恶意操作的方式,就是采用 一种叫 "字符校验"的技术.WEB网站像现在的动网论坛,他采用达到方法是为客户提供一个包含随即字符串的图片,用户必须读取这些字符串,然后随 登陆窗体或者发帖窗体等用户创建的窗体一起提交.因为人的话,可以很容易读出图片中的数字,但如果是一段客户端攻击代码,通过一般手段是很难识别验证码的.这样可以确保当前访问是来自一个人而非机器.
        编程实现原理:使用某种动态编程语言,比如PHP,ASP,随即生成一个随机数,大多为4位数字和字母,或者是数字和字母的组合,生成以后,用GD库的支持生成一张根据随机数来确定的图片,把随机数写入到session中,传递到要验证的页面,生成的图片显示给登陆着,并要求登陆者输入该随机数内容,提交到验证页面,验证session的内容和提交的内容是否一致,这就是大致的思路!那么怎么编写验证码程序呢,相信Google一下,就有很多现成的代码。

    2,申请QQ号时候验证码的作用

        如今你要申请一个QQ号,需要输入很复杂的验证码:验证码由若干个汉字组成,还加上了花哩唬哨的背景,使得有些汉字实在难以辨认。腾讯这么做,是为了防止有人利用软件批量获取QQ号码----每次提交都要输入随机生成的验证码,这是软件难以做到的。

    三.图片验证码技术之一:利用Xbm格式图片
        生成验证代码的技术有很多,这里只说与我们论坛有关系的这项技术。
        x-xbitmap格式的图片(以下简称为Xbm格式)特殊,就在于它并不跟gif,jpg等图片格式一样,是一个真正的纯2进制图片格式,而是ascii码文件--换句话说,它是一个纯文本文件,在Windows系统下,系统浏览器将它翻译成图片来进行显示。
        下面让我们先来制作一个Xbm图形格式图片:
      新建一个文本文件,将以下内容复制进去:
      #define counter_width 48
      #define counter_height 9
      static unsigned charcounter_bits[]={ff,3c,7c,3c,70,3c,fe,7c,fe,7c,78,7c,ee,ee,ee,ee,7c,ee,e0,ee,60,ee,74,ee,70,fe,30,
    fe,70,fe,38,ec,e0,ec,70,ec,1c,e0,ee,e0,70,e0,fe,7e,fe,7e,70,7e,fe,3c,7c,3c,70,3c}
      然后,将此文本文件保存为名字为 test.Xbm的文件。
      接下来,让我们看看如果在ie中打开它,会出现什么情形??(新开一个ie,然后将test.Xbm直接拖拽到它上面),哈,出现了如下图一样的情景,在浏览器中出来的,已经不是我们的文本,而是一个黑白的图片了!
      让我们看看上面那代码中,每一行的意义:
       #define counter_width 48 这里定义了图片的宽度,一般都设置为8的整数倍,因为我们想显示的是6个数字,所以就设置成了8*6=48的宽度
      #define counter_height 9 这里设置了图片的高度,可以任意设置,但是注意,这里的数字直接决定了下面的数组中,是用几组数来表示一个显示出的数字
      static unsigned char counter_bits[]={7c,3c,7c,3c,70,3c,fe,7c,fe,7c,78,7c,ee,ee,ee,ee,7c,ee,e0,ee,60,ee,74,ee,70,fe,30,
    fe,70,fe,38,ec,e0,ec,70,ec,1c,e0,ee,e0,70,e0,fe,7e,fe,7e,70,7e,fe,3c,7c,3c,70,3c}
      在这里,是图片用来显示内容的十六进制的代码,在这里,是9*6=54个数字来表示,值得一提的是,由于在图片显示中,是显示完了一行后,再显示第2行,直到最后一行,因此更为准确的描述是6*9显示,每6个数表示一行(因为我们显示了6个数字),一共9行(我们的定义中,是采用的高度为9的数组)
      正如static unsigned char英文意思为静态的,无符号的,烧焦的。它只能用来显示黑白两种颜色。二进制中的1将来用显示为黑色,0为白色。
      因此,上面的7c、3c这样的数字,就是一个256位的2进制,其中的1表示黑色,0表示白色,由此绘制出每个数字的图形。
      由于Xbm文件的性质决定,它只能显示黑/白两种颜色,而且以数组的方式来表现每个要显示的图形,注定了不能用它生成太复杂的图案。那么,这样的图片格式到底有什么用呢??当然有的,不少asp论坛/聊天室的登陆验证码,就是用这样的方法在asp中动态生成的。

    四.为什么要打补丁才能正常显示呢?
        在WindowsXP SP2更改后的安全策略中,因为基于安全因素的考虑,默认去掉了对 image/x-xbitmap 图片格式的支持(该图片的后缀名为Xbm)。,为什么微软在XP的SP2升级包中又要禁止掉它呢??这是因为Xbm的漏洞。
      Microsoft Internet EXPlorer和Outlook EXPress在处理WEB页,HTML邮件,EMAIL附件中畸形Xbm图象文件会导致崩溃,问题存在于对Xbm文件中的内容缺少检查,MSIE按照图象规定的长度和宽度分配内存,攻击者可以提高超大的长度和宽度数值导致系统消耗内存或者访问冲突。
      换句话说,如果构造一个长宽的尺寸特别大的Xbm文件,很容易导致Windows的内存耗尽,导致程序无响应或者死机。本身来说,这不算一个特别严重的漏洞,因为根据安全公告,无法造成溢出,不会存在太大的权限漏洞。但是由于XP的SP2强调安全性,因此将Xbm功能禁用了。从这点上可以看出,SP2对于安全的确比较重视,将有漏洞的功能基本上都补上或禁用了,作为网络管理员,我对微软的做法表示支持,因为操作系统默认设置的不安全,常常是造成非专业用户被攻击的首要因素。
      解禁方法:
      由此看出,以后我们访问某些采用生成Xbm作为验证代码的站点的时候,就相当不方便了,如果有必要,可以通过简单的操作注册表恢复我们需要的功能。
      打开注册表(开始---运行---regedit----回车),然后进到键值[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet EXPlorer\Security]
    将blockXbm的值改为00000000(dword,双字节),没有的话新建立一个就可以了。
      之后重新IE或者重新启动机器,则Xbm格式的图片就可以看到了。

    五,Xbm的趋势
      从SP2禁止Xbm的趋势看出,微软打算似乎已经开始打算放弃对Xbm格式的支持了。那么,作为程序编写者,有必要未雨绸缪,寻找其他生成验证码的途径。在php中,可以通过调用gd库等方式生成jpg/gif等图形格式的注册验证码,那么在asp中有其他的办法么?

      事实上图片验证密码的关键是--不能在客户端留下图片的真实url,或可对应反推源地址的信息,因此asp可以采用以下2种方式实现支持SP2的图形验证码。

      如果是购买的虚拟主机,那么可以采用将jpg/gif图片放到数据库,然后用session传值的方式,最后利用asp直接从数据库中输出图片,这方法的好处是不需要特别设置服务器端,坏处则是每次生成验证图片时都会需要与数据库连接,增加了开销。

      如果是有管理员控制权限的用户,可以考虑采用第三方组件来实现。天缘个人推荐 ASP图象组件shotgraph ,它的免费版本对生成的图形有一定限制,不过已经足够用来制作验证码了。

    文章来源:http://www.juntuan.net/jtyc/wenzhang/n/2005-07-30/6750.html

  • C/S程序界面规范

    87117899 发布于 2007-05-17 11:03:27

    1. 界面规范
    1.1. 总体原则
    l 以用户为中心。设计由用户控制的界面,而不是界面控制用户。
    l 清楚一致的设计。所有界面的风格保持一致,所有具有相同含义的术语保持一致,且易于理解
    l 拥有良好的直觉特征。以用户所熟悉的现实世界事务的抽象来给用户暗示和隐喻,来帮助用户能迅速学会软件的使用。
    l 较快的响应速度。
    l 简单且美观。
    1.2. 原则详述
    1.2.1. 用户控制

    用户界面设计的一个重要原则是用户应该总是感觉在控制软件而不是感觉被软件所控制。
    l 操作上假设是用户--而不是计算机或软件--开始动作。用户扮演主动角色,而不是扮演被动角色。在需要自动执行任务时,要以允许用户进行选择或控制它的方式来实现该自动任务。
    l 提供用户自定义设置。因为用户的技能和喜好各不相同,因此他们必须能够个性化界面的某些方面。Windows为用户提供了对许多这方面的访问。您的软件应该反应不同的系统属性--例如颜色、字体或其他选项的用户设置。
    l 采取交互式和易于感应的窗口,尽量避免使用模态对话框,而使用"非模式"辅助窗口。 "模式"是一种状态,它排除一般的交互,或者限制用户只能进行特定的交互。当最好使用一个模式或该模式只是可替换的设计时--例如,用于在一个绘图程序中选定一个特定感觉--请确保该模式是显然的、可见的,是一个明确的用户选定的结果,并且容易取消。
    l 在后台运行长进程时,保持前台式交互。例如,当正在打印一个文档,即使该文档不能被改变,用户也应该可以最小化该窗口。
    l 谅解。用户喜欢探索一个界面,并经常从尝试和错误中学习。一个有效的界面允许交互式的发现,它只提供一组合适的选择,并在用户可能破坏系统或数据的情况时发出警告。如果可行,还应提供可逆转或可还原的操作。即使在设计得很好得界面中,用户也可能犯错误。这些错误既可以是物理上得(偶然地指向了错误的命令或数据),也可以是逻辑上的(对选定哪一个命令或哪些数据做出了错误的决定)。有效的设计避免很可能导致错误的情况。它还包容潜在的用户错误,并且使用户易于还原。
    1.2.2. 清楚一致的设计
    一致允许用户将已有的知识传递到新的任务中,更快地学习新事物,并将更多的注意力集中在任务上。这是因为他们不必花时间来尝试记住交互中的不同。通过提供一种稳定的感觉,一致使得界面熟悉而又可预测。一致在界面的所有方面都是很重要的,包括命令的名称、信息的可视表示,操作行为,以及元素在屏幕和窗口内部的放置。
    l 相同含义的词使用统一的术语。比如对于仓库中存放的物料,不可同时又称为物品、货物、备品、产品和材料等等,而统一约定一个称谓,且此称谓是用户熟悉的和易于理解的。
    l 使用一组一致的命令和界面来展示常见功能。例如,避免一个"复制"命令在一种情况下立刻执行一个操作,但在另一种情况显示一个对话框要求用户键入目标然后才执行。应该使用同样的命令来执行对用户来说相似的功能。
    l 操作环境内的一致。保持Windows提供的交互操作和界面约定之间的高度一致,用户将能很快熟悉软件的使用。
    l 使用隐喻的一致性。如果一个特定的行为更多的是一个不同的事物的特征,而不是它的隐喻的含义,那么用户可能在学习将行为和该事物相关联时遇到困难。例如,对于放在回收站中的对象而言,焚烧炉和废纸箩代表不同的模型。
    l 建立项目保留字。通过建立保留字来明确和统一术语和操作命令。
    l 提供可视反馈。在后台运行长进程时(时间超过1~10秒,视具体情况而定),必须提供进度条等信息指示。
    l 除非特别必要时,不要提供声音反馈。在有严重的问题发生时,可以使用声音来提示用户,但是通常应该允许用户取消声音。
    l 保持文字内容清楚。信息的表达要言简意赅,易于理解而又不罗嗦;避免使用冗长的文字给用户反馈。
    1.2.3. 有良好的直觉特征
    l 用熟悉的隐喻为用户的任务提供直接而直观的界面。通过允许用户利用他们的知识和经验,隐喻使得预测和学习基于软件的表示的行为更加容易。
    l 在使用隐喻时,不需要将基于计算机的实现局限在真实世界的对应物上范围之内。例如,与其基于纸张的对应物不同,Windows桌面上的文件夹可以被用来组织各种对象,例如打印机、计算器、以及其他文件夹。同样,Windows文件夹可以其真实世界对应物不可能的方式被排序。在界面中使用隐喻的目的是提供一个认知的桥梁;隐喻并不以其自身为最终目的。
    l 隐喻支持用户认知而不是记忆。用户记起与一个熟悉的事物相关联的意义要比他们记起一个特定命令的名称要容易得多。
    l 同常见软件保持一致性。出色的用户界面在程序中将实现同用户以前用过的其它成功软件一致的动作。
    1.2.4. 较快的响应速度
    l 保持界面能很快对用户操作作出反应。
    l 提供快捷键。特别对于有大量录入项的界面,能让用户不使用鼠标即可完成快速数据录入。在用户界面中加入一些功能,这些功能可以让熟练用户在不同的区域快速的输入数据。这些功能包括重复功能、快捷键、带有有意义的图标的按钮等等,所有这些可以使速度快的用户可以控制界面并加快数据的输入。
    l 除非必要,不要重绘屏幕。
    1.2.5. 简单且美观
    l 简单。界面应该很简单(不是过分单纯化)、易于学习、并且易于使用。它还必须提供对应用程序的所有功能的访问。在界面中,扩大功能和保持简单是相互矛盾的。一个有效的设计应该平衡这些目标。支持简单性的一种方法是将信息的表示减少到进行充分交流所需的最少信息。例如,避免命令名和消息的文字描述。不相关或冗长的句子扰乱了您的设计,使得用户难以很容易地提取重要信息。另一个设计简单而有用的界面的方法是使用自然的映射和语意。界面元素的排列和表示影响它们的意义和关联。简单还与熟悉相互关联。熟悉的事物通常似乎更简单。尽可能尝试建立利用用户已有的知识和经历的联系。您可以使用渐进揭示来帮助用户管理复杂的事物。"渐进揭示"涉及到仔细的信息组织,以便只在恰当的时候才显示信息。通过隐藏向用户表达的信息,您减少了用户必须处理的信息数量。例如,您可以使用菜单来显示操作或选择的列表,还可以使用对话框来显示一组选项。渐进揭示并不意味着对显示信息使用非传统的技术,例如需要一个修饰键作为访问基本功能的唯一方法,或者强迫用户通过一个更长的分级交互序列。这会使用户界面更加复杂和麻烦。
    l 美观。可视设计是应用程序界面的重要部分。可视属性提供了非常好的印象,并传达特定对象的交互行为的重要线索。同时,出现在屏幕上的每一个可视元素也是很重要的,它们可能竞争用户的注意。提供清楚地促进用户对表达的信息的理解的连贯环境。图形或可视设计器的技巧对于这一方面是无价的。

    1.3. 细节约定
    1.3.1. 界面风格

    1.3.1.1. 普通外观
    l 使用一致性一致的外观将使用户界面更易于理解和使用。用户界面控件看起来应该是一致的。
    l 使用安排和流程在西方文化中(包括中国),人们习惯于从左到右,从上到下进行阅读,因此,应该将重要信息放在上面和左边。左上角最容易吸引起人们的注意力。
    l 使用对齐通常,使用左对齐来使用户界面控件更易于浏览。对于数值文本,应该使用小数点对齐或右对齐。对于非数值文本,应该避免使用右对齐或居中对齐。不必对什么都使用中间对齐,或者使它们保持对称形式。在右边或底部保留空白区域更适合习惯。
    l 使用分组将相关的用户界面控件分成组,以体现它们之间的关系。同时,还要显示相关信息。将控件放在它所作用的对象旁。使用空格、分组框、线条和标签,或者其它分隔符对用户界面控件进行分组。
    l 使用强调使用焦点、位置、分组、层次、启用/禁用、大小、颜色或者字体等,来将注意力集中在需要首先看到的用户界面控件上。尽量以可视的方式指明用户接下来应该进行的操作。
    l 使用可视的提示尽量使用近似的大小和间距来指出用户界面控件是相似的,而使用不同的大小和间距来指出用户界面控件视是不同的。
    l 使用空格使用空格来创建一个"透气室",以使窗口布局更易于理解,并且查看起来更舒服。空格的多少要适当,不要显得太分散。但是,要避免过多地使用空格。如果可能,尽量使窗口小一些。
    l 警惕空洞不要到处粘贴公司或产品的名称及徽标。虽然在启动屏或"关于"框中出现公司或产品名称及徽标是完全可以接受的,但其他窗口中的可用空间应该出现其他内容。如果没有其他内容,那么应尽量使窗口小一些。
    l 注意大小使用用户界面控件的分辨率具有独立性。使用系统规格(使用GetGystemMetrics API 函数)或文本规格(使用GetTextMetrics或GetTextExtentPoint32 API 函数)来确定用户界面控件的大小。任何显示文本的对象(如对话框或定义的文本文档)都应该使用文本规格。
    l 考虑使用资源或预定义的布局网格资源模板或预定义的布局网格有助于您在不同的窗口之间实现一致性。

    注意,下页所示图的第二个对话框,与第一个不同,它有一个紧凑、从左到右、从上到下的流程,并且,左对齐的标签很便于浏览;通过对齐编辑框并调整其大小,使它显得更有组织,更加平衡。
     
    不合理的


    平衡的对话框
    1.3.1.2. Windows的可视提示
    暗示与用户只需通过查看可视提示来确定对象的使用方式的能力有关。在Windows中,请保持使用下面的可视提示:
    l 可以单击凸起的项目。
    l 可以单击当鼠标从其上移过时突出显示的项目。
    l 不能单击下凹的项目。
    l 可以编辑具有白色背景和闪烁垂直条(光标)的项目。
    l 不能编辑具有灰色背景的项目。
    l 灰色项目是被禁用的。
    l 可以拖动凸起的项目。
     

    1.3.1.3. 交互
    l 尽量提供对所有功能的键盘访问理想情况下,除了绘图这样的图形功能,其他所有的功能都应该只能通过键盘来访问。
    l 尽量提供对所有功能的鼠标访问理想情况下,除了文本输入外,其他所有功能都应该只能通过鼠标来访问。
    l 确保具有明显后果的操作要求用户进行明确的选择*用户需要完全明确他将要进行危险性操作或破坏性操作。
    l 对于使有耗时的操作都给出反馈*在进行长时间的操作时,要确保有等待光标、进度表或其他的可视反馈。用户应该能够取消长时间的操作。如果可以取消未完成的操作,那么将按钮标记为"取消",否则将按钮标记为"停止"。
    l 可视的指示模式*向用户提供一种可视的反馈,以指出用户进入一种模式,通常可以通过更改光标或标题栏文本来做到这一点。
    l 确保单击和双击的一致性*单击用于非按钮选定,而双击用于选定并执行默认操作。换句话说,双击(在列表框、组合框,或其他接受双击的控件中)的效果应该与选定控件中的一个项目,然后按下Enter键的效果一样。
    l 鼠标右键仅用于快捷菜单*确保鼠标右键仅用于快捷菜单,而不要用于其他用途。
    l 不要使用鼠标中键*如果用户的鼠标有中键,那么让用户使用"控制面板"中的"鼠标"实用程序自己分配中键的行为。
    l 保持分配的快捷键的一致性组合功能键和Ctrl键用于快捷键。习惯上不将Alt键用于组合键,业务Alt键常常被用于访问键。尽量避免使用Alt键和Ctrl键,因为这种组合会使快捷键非常麻烦,而且也很不方便。
    l 将快捷键作为补充方式*千万不要将快捷键作为访问命令的唯一方法。应该让用户有更多的明显选择。
    l 避免水平滚动条与垂直滚动条不同,水平滚动条并不受欢迎,因为它会使项目阅读起来比较困难。解决的办法有:尽量使用垂直滚动条、加宽窗口、减小文本的宽度,或者使文本自动换行等。当然,如果确实需要,还可以使用水平滚动条。
    1.3.1.4. 程序
    l 只有主程序窗口才有标题栏图标、菜单栏、工具栏和状态栏*因为单击主窗口的任务栏按钮也会激活二级窗口,所以二级窗口绝对不要显示在任务栏中。二级窗口不要因为使用菜单栏、工具栏或状态栏而使其变得复杂。可以使用标题栏图标来明显区分主窗口和二级窗口。另外,绝对不要使用默认的Windows图标(飘动的窗口图标)作为窗口图标。
    l 简化默认配置让用户按自己的速度来学习和使用程序。
    l 应用程序应该使用多文档界面(MDI)或单文档(SDI)这些程序界面应该与应用程序的使用模式匹配。
    l 默认情况下,应用程序应该保持为最大化当应用程序占用整个屏幕时,常常能够提高用户的工作效率。
    l 实用程序应该使用SDI或对话框界面这些程序界面应该与实用程序的使用模式匹配。对于实用程序,建议不要使用MDI界面,因为管理这些窗口需要付出很多努力。
    l 实用程序应该在小屏幕范围内运行实用程序常常与其他程序一起运行,因此它们需要在小屏幕范围内运行。实用程序应该有灵活的窗口布局,以适应多种不同的大小。实用程序很少以最大化的形式运行。
    l 使用实际文档的SDI程序必须支持运行多个实例*运行多个实例使用户能够同时操作多个文档。
    l 使用"退出"命令终止程序使用"退出"终止程序;使用"关闭"移走主窗口和非模式对话框;使用"取消"移走模式对话框。当关闭主窗口并不表示终止进程时,对于主窗口使用"关闭"来代替使用"退出"。例如:关闭打印机状态窗口不会取消打印任务。
    1.3.1.5. 默认
    l 保存和恢复用户选择程序应该能够能够恢复到其最后退出的状态。MDI程序应该能够恢复文档窗口的大小和位置。对话框通常应该使用最后输入的值作为默认值。
    l 提供适当的默认值提供提供适当的默认值来减少用户不必要的操作,从而帮助用户完成工作。提供最可能使用并给出设置实际使用方式的默认值。通常,最好的默认值是用户最后输入的值。
    l 考虑选择默认值时的安全性* 不应该将不可恢复或破坏性的操作设置为默认值。不要使用令用户感到莫名其妙的默认值。
    1.3.1.6. 窗体
    对话框窗体大小尽量不要超过640*460,留20给任务栏。并且高和宽(或W宽和高)的比应该大致保持为3:4(或4:3)。一般应该将窗体的"Position"属性定义为 "poDesktopCenter","WindowState"属性为"wsNormal",某些主界面设置为"wsMaximized"。"ShowHint"属性设为"True"。如果是模式对话框,则将"BorderStyle"属性设置为"bsDialog"。
    窗体文件(*.dfm)保存为文本格式,以便在VSS中比较不同版本之间的差别。如果窗体大小超过屏幕大小,则在Delphi开发环境中打开时,大小会有改变,并且影响到运行时刻效果。由于每个人的屏幕大小设置不一样,有些是1024*768,有些是800*600,因此在设计期间请注意窗体大小,尽量不要超过800*600,以免出现上述问题。
    
    1.3.1.7. 布局和间距
    窗体控件布局和间距尽量保持与Windows标准一致。控件与窗体的上、下、左、右边距为7象素。右下角主命令按钮之间的间距为6象素,如果主命令按钮在右上角,之间的间距则为4象素。主命令按钮一般情况为75×21象素,如果按钮的文本很长,应该适当加宽按钮的宽度。如下图。其它详细资料请完全参照错误!书签自引用无效。和命令按钮。
     

    控件的"TabOrder"属性值应该与控件排列顺序一致,即遵循从上到下、从左到右这样一个流程。如果在PageControl的多个页面中存在类似的控件,应该尽量使得它们在各个页面中出现的位置/大小比较一致,以免在页面间切换时产生闪烁感。

    1.3.1.8. 图标、图片
    不同界面中的同一功能应该使用同样的图标和图片。图标、图片的色调、风格尽量保持一致。图标、图片的隐喻应能确切表示功能的含义,如果不能,就直接使用文本,以免混淆用户。如果功能是一个动作时,可能比较难找到确切表示该功能的图标,这时应该尽量采用此动作相关的名词做图标。例如Windows中的"剪切"功能就是用一把剪刀来表示的。
    1.3.1.9. 提示信息(Hint)
    工具栏按钮应该设置工具提示 "Hint" 属性。Hint能帮助用户更方便地理解和使用。详细资料可以参照工具栏、工具提示。
    如果使用了"TSpeedButton"控件,并且只有图标,同样应对它设置"Hint"属性。如果不是特殊情况,应尽量避免使用"TSpeedButton"控件,而使用"TButton"控件代替。
    1.3.1.10. 标点符号
    在标识控件用途的标签文本(Label)和提示信息(Hint)中,应使用半角符号。如果是指导性标签文本(如解释按钮功能的句子),则使用全角符号,并且句子应遵循中文标点符号标准。如下图Microsoft标准对话框例子。其他详细资料可参照静态文本。


    1.3.1.11. 对话框
    l 对话框应该在所有视频模式下都能够正确显示当在VGA模式(640×480)下显示时,对话框应该不超过640×460(留20像素给任务栏)。这将确保对话框能够显示在所有的视频模式下。
    l 确保模式对话框的模式*确保使用具有父窗口的模式对话框都提供正确的父窗口句柄,而不时提供NULL句柄。如果没有提供父窗口句柄,那么父窗口仍处于活动状态,因此该对话框实际上并不是模式对话框。
    l 不要使用可滚动的对话框*也就是说,不要使用需要滚动条来进行完全查看的对话框。这种对话框使用起来非常不方便,并且也时完全不必要的。应该重新设计这种对话框。
    l 不要在作为二级窗口的对话框中使用菜单栏*使用这种对话框需要付出很多努力。注意,在用作主窗口的对话框(如"查找"实用工具)中,菜单栏时可以接受的。还要注意的是,在所有对话框中,快捷菜单和菜单按钮都是可以接受的。


    二级对话框不要使用菜单栏,但可以使用菜单按钮。

    l 不要在作为二级窗口的对话框中使用标题栏图标*标题栏图标用于区别主窗口和二级窗口。
    l 不要在任务栏上显示作为二级窗口的对话框*注意,单击主窗口的的任务栏图标也将激活二级窗口。
    l 对话框中使用下页图所示的页面布局和间距。
     
    l 对于相似的对话框,使用控件位置来强调其相似性。如果意义相同的同一控件出现在一些相似的对话框中,那么它应该显示在相同的位置。另一方面,应避免将可能会产生混淆的不同控件放在同一位置。
    l 对非模式对话框最好使用可停放的对话框可停放对话框在功能上与非模式对话框是等效的,但其位置设置更为灵活。
    l 策略地设置输入焦点将最初的输入焦点设置在最可能首先使用的控件上。
    l 在对话框标题文本中不要出现省略号例如,作为选择"打印选项..."命令结果而显示地对话框的标题应该为"对于选项"。但是,表示命令正在执行过程中菜单对话框(如"连接到Internet..."对话框)是一种例外情况。
    l 为所有可处理访问键的控件分配访问键*访问键可以使用户的手保持在键盘上,从而使访问程序更加方便。您可以直接在其标题中为诸如命令按钮、单选按钮、复选框等控件分配访问键。通过提供静态文本标签或带有访问键、在Tab顺序上先于控件的组框,您可以为诸如编辑框、列表框、组合框等控件分配访问键。在其他情况下不要为组框分配访问键--这会使人产生混淆。"确定"按钮没有访问键,因为在作为默认按钮时,它通过提Enter键来选定的。"取消"按钮也没有访问键,因为Esc键预览清除模式对话框。如果可能,避免使用小写的g、j、p、q或y作访问键,也避免使用这些字母前后的字母作为访问键。下划线不能与这些字母的下行字母分开。当然,访问键必须是唯一的。
    l 避免使用粗体文本尽量少使用粗体文本。在Windows 3.1 的对话框中,粗体文本用于在旧式的视频硬件上绘制被禁用的文本(即抖动的灰色文本)。因为现在的视频硬件可以绘制没有抖动的灰色文本,所以Windows 为了使外观更加清洁,现在Windows 在对话框中使用正常文本。粗体文本仅用于强调。对于大多数对话框不要粗体文本。
    l 提供环境敏感的帮助对于复杂的对话框,应该为整个对话框提供环境敏感的帮助(通过帮助按钮或F1键访问),或者为个别控件提供控件特定的帮助(通过"这是什么?"按钮或Shift+F1 键来访问),或者同时提供这两种帮助。
    1.3.1.12. 对话框的主要命令按钮
    l 将主命令按钮与对话框主体分开*主命令按钮包括像"确定"、"取消"、"关闭"、"帮助"、"停止"、"隐藏",以及其他相关按钮的等命令按钮。这种分开使主命令按钮更易于查找和识别。
    l 认真选择对话框的方向在西方文化中,人们习惯于从左到右、从上到下进行阅读,因此,将主命令按钮靠底部或右边放置更容易被发现。您应该选择对话框的外观比例与屏幕的外观比例(通常高与宽的比例为3:4)相似的方向。这将使对话框的外观看起来更加舒服,并且更易于在屏幕上进行定位。如果按钮具有不同的大小,那么可以将它们放在对话框菜单底部。当不能确定时,也可以将按钮放在底部,因为这种定位方式最为常见,也更易于阅读。
    l 将排列在底部的主命令按钮右对齐右对齐主命令按钮适合从左到右的阅读习惯。当只有一个主命令按钮时,您或许希望例外地将其居中放置。

     

    右对齐主命令按钮

    l 避免使用多行或多列的主命令按钮多行或多列的主命令按钮对用户是一个打击。如果有许多主命令按钮,那么注意,通常在右边排成一列与在底部排成一行相比可以放置更多的按钮。另外,您可以考虑使用命令菜单。如果必须使用很多按钮,那么注意使用多行别使用多列的效果好。
    l 对模式对话框,通常提供"确定"和"取消"按钮*要使用对话框,用户需要能够方便地识别前进(使用"确定"按钮)和后退(使用"取消"按钮)的方式。您可以使用更明确的按钮代替"确定"按钮,但绝对不要在模式对话框中替换"取消"按钮,除非用"停止"来表明正在进行的操作无法取消。
    l 对于非模式对话框或或作为主窗口的对话框,提供"关闭"按钮而不提供"确定"和"取消"按钮*将"确定"和"取消"按钮用于非模式对话框或作为主窗口的对话框可以使对话框看起来像是模式对话框。而且,当用于非模式环境中时,"确定"和"取消"时没有什么意义的。使用"关闭"按钮可以消除这种混淆。
    l 通常将"确定"按钮排第一,"取消"其次,"帮助"最后*"确定"或其等价按钮通常作为第一个主命令按钮。"取消"按钮应该位于"确定"的右边或下面。将"确定"和"取消"按钮放在一起。"帮助"按钮应该时最后一个按钮。如果没有"确定"按钮,那么应该将"取消"按钮放在"帮助"按钮的前面。这可以使主命令按钮更易于查找和识别。
    l 确保"取消"按钮真正用于取消操作*当取消时,程序的状态栏应该与之前显示的模式对话框完全相同。如果不是这样,那么应该用"停止"按钮来代替"取消"按钮。模式对话框中的"取消"按钮应该与标题栏中的"关闭"按钮效果相同。而属性表是个例外,因为"取消"按钮不会取消已经应用的更改。
    1.3.1.13. 属性表和属性页
    l 让属性页独立工作避免使一个属性页的行为或操作受其他属性页的限止。用户不可能发现属性页之间的这种独立关系。在属性页的使用顺序方面应该没有限止。用户应该能够随时查看任意的属性页。
    l 属性页的布局相互独立一些属性页通常不会占用同样大小的空间。占用空间较小的属性页应该与最大的属性页的布局的格式方式不同,因为将会产生额外的空间(见下图)。

     

    属性页的布局保持独立,避免居中。

     

    l 用属性表代替使用带选项卡的对话框使用属性表而不使用带选项卡的对话框除了具有一致性之外,没有什么明显的实用性优势。另外,对于实际显示对象属性的对话框使用属性表,而对于其他用途,所有带选项卡的对话框。
    l 对属性显示总采用属性表,即使仅有一个页*采用属性表能够明确告诉用户查看的使属性而不是一般的对话框。属性表有一个"应用"按钮来帮助用户测试设置。
    l 绝对不要使用两行以上的标签*最好使用一行标签,但两行也是可接受的,两行以上就太多了,可用级连属性设置或多个对话框代替。
    l 总为属性提供"应用"按钮再说一次,提供"应用"按钮帮助用户对设置进行测试。
    l 对显示属性的属性表总是在其标题中写上"属性"一词和对象的名称*请注意,不是所有的属性表都是用来显示属性的。
    l 总将命令按钮放在右边*适用于所有页的命令按钮必须置于标签页区域的外面,而仅适用于单个页的命令按钮必须置于该标签页的里面。
    1.3.1.14. 向导
    l 对高级的、复杂的或不常用的任务使用向导向导对非常高级或复杂的任务十分有用,省去了用户许多麻烦的操作。当向导用于不常用的任务时,其效果最好。对常用任务使用向导则显得大而不当。
    1.3.1.15. 控件
    l 尽量采用标准控件尽可能采用标准控件(6个最早的控件和新的Win32常用控件)。采用非标准控件的程序与绝大多数Windows程序看起来不一致。只用完全合理时才使用自定义控件。
    l 定制标准控件时要小心改变标准控件的标准外观或行为时一定要小心,这是个常常出错的地方。
    l 将无效控件置为不可用*将不适用于当前程序状态的控件置为不可用。
    l 取消不必要滚动条尽量使控件的尺寸足够大,避免使用滚动条。
    1.3.1.16. 命令按钮
    l 采用最小的宽度和标准的高度带文字的命令按钮应该采用50个对话单位(75个像素点)的最小宽度、14个对话单位(21个像素点)的标准高度。尽量将不同大小的带文字命令按钮的个数控制在两个以内。对父窗口拖动(owner-draw)按钮或无文字的按钮(如"…"),其大小可以任意设置,原则是使命令按钮外观简朴一致。高度大于14个对话单位(21个像素点)的按钮看起来不够专业。尽管不限制命令按钮的最大宽度,但宽度超过200个对话单位的按钮使不妥当的。请参阅下图所示关于命令按钮的实例。
     

    命令按钮大小示例

    l 针对国际化适当加宽按钮尽管50个对话单位(75个像素点)的宽度是适合英语文字的最小宽度,但对需要针对其他语言进行本地化的程序来说,可能就太小了。对于需要翻译为其他语言的程序,将命令按钮的最小宽度定为60个对话单位可能更适合。
    l 将无效按钮置为不可用,以取消报错*绝对不要使可用的按钮仅产生一条出错信息。
    l 总采用省略号来表示需要更多信息*命令中的省略号表示执行命令时需要更多信息,而不是简单的确认。省略号并不表示一定会出现对话框。
    l 绝对不要指定双击行为*用户意料不到命令按钮会响应双击,因此不可能发现这样的行为。
    命令按钮大小使用Window标准75x21象素。一般情况下,"确定"和"取消"按钮的属性设置如下:
      btnOk: TButton
         Caption = '确定'
         Default = True
         ModalResult = mrOk
      end
      object btnCancel: TButton
         Cancel = True
         Caption = '取消'
         ModalResult = mrCancel
      End
    "确定"和"取消"按钮一般被映射为Enter键和Esc键,因此不应该对它们指定访问键,除此以外的命令按钮都应该指定一个访问键。如下图:
     

    主命令按钮在下

    如果主命令按钮在右上角,应该布置为这样。
     

    主命令按钮在上

    如有其他不明,请参照命令按钮。
    如果设计期间未指定"ModalResult",注意一定要在按钮的"OnClick" 事件代码中为"ModalResult"赋值。
    1.3.1.17. 复选框
    l 用复选框开关选项,用单选按钮改变模式*用复选框进行选项的开关操作是很有效的,但如果用来将模式改变为另外一种状态就难免让人迷惑了。例如,可用一个复选框来表示是否显示工具栏,但若用复选框来切换打印机的横向模式和纵向模式就会使人糊涂,对横向和纵向模式应该用一组单选按钮代替。
    l 避免一组复选框中选项个数超过8个应该考虑用复选框列表代替,它占用的空间更少,但复选框列表需要滚动时使用就稍稍麻烦了。尽管控件足够或保持与同一窗口中其他复选框一致时,采用复选框时可取的,但大于8个左右的复选框就未免太多了。
    l 考虑将修改组的复选框置于应该分组框中这样的分组使得复选框之间的关系更为明显。
    l 宁可竖向对齐虽然更合适的情况下采用横向对齐或直角对齐也是可以接受的,但竖向对齐的一组复选框更易于浏览。
    1.3.1.18. 单选按钮
    l 避免一组单选按钮中的选项个数超过8个考虑用列表或组合框代替,它们占用的空间更少,但要记住控件使用更麻烦些。尽管控件足够或保持与同一窗口中其他单选按钮一致时,采用单选按钮是可取的,但多于8个的单选按钮未免太多了。
    l 避免使用单选按钮进行开 / 关或是 / 否选择用复选框代替。
    l 总将单选按钮置于一个分组框中*由于单选按钮是一组相互排斥的选项,所以分组框使选择更为明确。
    l 宁可竖向对齐虽然更合适的情况下采用横向对齐或直角对齐也是可以接受的,但竖向对齐的一组单选按钮更易于浏览。
    1.3.1.19. 组合框
    l 总给组合框提供一个标签*必须用标签来表明组合框的用途。
    l 使组合框的下拉列表最少有5行长少于5行的列表就没有可用的滑块,不易于滚动。请注意,如果组合框没有足够的列项来填满列表,那么将自动缩短列表的长度。
    l 避免组合框的列项少于4考虑用单选按钮代替,它们虽然多占空间,但更易于操作。如果空间更为重要或为了保持与同一窗口中的其它组合框一致时,采用组合框则更为可取。
    1.3.1.20. 编辑框
    l 总给编辑框提供一个标签*必须用标签来标明编辑框的用途。如果标签在左边,将标签文字与编辑框文本垂直对齐。
    l 避免有输入限制的编辑框将编辑框用于用户对任何文本的输入或数字编辑框用于数字的编辑。对于输入受限的情况,使用其他的控件,如组合框、列表、滑块和微调框。对于日期和时间,使用日期和时间拾取控件。
    l 用微调框和浏览按钮使编辑框可视微调框和浏览按钮是简单的可视机制,它们帮助用户在编辑框中进行有效的输入。避免让用户必须输入。仅对数字编采用带微调框的编辑框,对于文本,使用组合框代替。
    l 按期望输入来设置编辑框的宽度编辑框的宽度是对期望输入的可视提示。例如,如果用户是输入地址,两个字符宽的State字段明显暗示用户输入两个字符的州名缩写。如果期望的输入没有特别的大小,就选择与其他编辑框或控件一致的宽度。
    l 总采用数字编辑框用于数字输入*当用户在数字字段中输入非数字文本时,不应该有任何出错消息。
    1.3.1.21. 滑块
    l 总给滑块提供一个标签* 必须用标签来标明滑块的用途。而且,滑块还应该有标明高、低值意义和当前选择的标签--当然都不带冒号。
    1.3.1.22. 静态文本
    l 左对齐静态文本标签左对齐使得标签外观更有条理,且易于浏览。
    l 宁可将静态文本标签置于相关控件的左边,而不是上面这样对齐使标签更易于被发现,且方便了标签和控件的浏览。很明显,长控件是例外情况,如列表视图、树形视图(Tree)和多行编辑框。
    l 总在用于标识控件的静态文本标签后带上冒号*使用冒号明显表示为控件标签的文本。为控件提供附加信息的标签不应该有冒号,如用来解释滑块控件的标签。标签也可作为屏幕读出器的输入信息。
    l 对非标签文本总用只读编辑框*  只读编辑框允许用户将文本复制到剪贴板上,并在文本比控件长时可进行滚动。
    l 不要把静态文本置于凸起的边界上*在凸起边界上的静态文看起来像按钮,因而用户会试图单击它。
    1.3.1.23. 列表框
    l 总给列表框提供一个标签*必须用标签来标明列表框的用途。
    l 使列表框至少5行长少于5行的列表没有滑块,不便于滚动。如果列表框没有滚动条,那么使用一个更短的列表框也是可以接受的。
    l 对多个选择考虑采用复选框复选框列表可以突出其多个选择的能力。如果不能接受复选框列表,那么可以采用多选列表,并用静态文本表示选项个数,清楚指明可进行多项选择。
    l 对多选列表考虑提供"全部选中"和"全部取消选中"命令由于希望全部选中或全部取消使常见的事情,所以这两个命令方便了用户进行多项选择。
    1.3.1.24. 列表视图
    l 总给列表视图提供一个标签*必须用标签来标明列表视图的用途。
    l 使列表视图至少5行长少于5行的列表视图没有滑块,不便于滚动。如果列表视图没有滚动条,那么使用一个更短的列表视图也是可以接受的。
    l 仅在列表可排序时采用可单击的表头*可单击的表头只应用于排序。首次单击时应按正序对列表进行排序,而第二次单击时按反序进行排列。
    l 对列项大约超过30的列表视图总使其可进行排序*用户能够对列表进行排序方便了对信息的查找。
    1.3.1.25. 滚动条
    l 滚动条仅用于滚动*使用滑块或微调框来设置数值。
    l 使滚动条足够长,保证有可用的滑块。没有滑块的滚动条不便于使用。
    1.3.1.26. 分组框
    l 利用分组框分组相关控件尽管分组框通常是用于单选按钮的分组,但也可用于任何控件的分组。避免使用只有一个控件的分组框,除非是为了保持与同一对话框中其他分组框一致。
    l 考虑采用静态线或文本标签来代替分组框分组框多时要占去许多空间。如果空间紧张的话,一个替代分组控件的好办法是同时采用静态文本标签和静态线。

     

    考虑采用静态文本标签和静态线代替分组框

    l 不要在分组框标签的后面使用冒号*分组框标签的意思明白,使用冒号完全没有必要且让人糊涂。

    1.3.1.27. 菜单
    l 总用单个单词作为菜单标题*菜单栏上多个单词的菜单标题看起来像多个菜单标题。
    l 不要在菜单栏的文本间留有空隙*不一至的菜单栏文本既无用,又难看。
    l 避免占多行的菜单栏*尽管将父窗口缩小到足够窄时,任何菜单栏都要占用几行,当要避免正常使用时因菜单项都而占用几行的菜单栏。
    l 保持菜单稳定*将无效菜单置为不可用,而不要删除它们。但是,对整个程序实例都无效的菜单,就应该删除。
    l 合理安排菜单项的顺序将相关菜单项组合在一起。重要的命令应该位于菜单的顶部,而不重要的菜单则位于菜单的底部。
    l 将无效菜单置为不可用来代替报错*菜单绝不应该有仅产生出错消息的可用命令。
    l 分配访问键*访问键使用户可以手不离开键盘进行操作,并提供程序的可访问性。尽可能避免用小写字母g、j、p、q、y或单词中与它们靠近的字母来分配访问键,因为下划线与下一行的字母不好区分。当然,一个菜单中的访问键应该是唯一的。
    l 总采用省略号来表示需要更多信息*命令中的省略号表示执行时需要更多的信息,而不是简单确认。省略号不表示一定有对话框出现。
    l 使用标准菜单避免不提供"文件"、"编辑"和"帮助"菜单。由于这些是标准菜单,所以用户会期望它们出现。例如,期望在"文件"菜单中发现像"打印"和"退出"这样的命令,虽然这些命令可能与"文件"无关。同样,用户期望在"编辑"菜单中发现"剪切"、"复制"和"粘贴"命令,至少要在"帮助"菜单中发现"关于"命令。
    l 统一放置"查找"和"选项"命令总将"查找"命令放在"编辑"菜单中,而有"工具"菜单时,总将"选项"置于其中,否则置于"查看"菜单中。
    l 用复选标记来开关选项,用单选组来改变模式*用复选标记进行选项的开关操作是有效的,但如果用来将模式改变为另外一种状态就难免让人迷惑了。例如,可用一个复选标记来表示是否显示工具栏,但若用复选框来切换打印机的横向模式和纵向模式就会使人糊涂,对横向和纵向模式应该用一个单选组来代替。
    l 不要使用多列的下拉菜单*多列增加了菜单不必要的复杂性。
    l 不要使用"Bang"(爆炸的声音)菜单*Bang菜单是菜单栏上那些看起来像下拉菜单,但实际是选择后立即执行的命令,如"退出"!显然,用户希望菜单标题就只是菜单,而不是命令。
    l 不要右对齐菜单标题*这样的菜单风格陈旧且不易于使用。
    1.3.1.28. 上下文菜单
    l 考虑将上下文菜单作为冗余使用上下文才菜单不应该是访问命令的唯一方式。通常上下文菜单中的命令应该在菜单栏中也提供,使用上下文菜单是为了提高访问效率。
    l 避免在上下文菜单中包含快捷键应该将快捷键分配在菜单栏中,上下文菜单的快速访问是通过鼠标进行,而不是通过键盘。
    1.3.1.29. 工具栏
    l 保持工具栏稳定*将无效的工具栏按钮置为不可用,而不是将它删除。但是,应该考虑删除用户进入一种模式用不到的整个工具栏。
    l 将无效命令置为不可用,而不是报错*工具栏绝不应该包含只出现错误消息的命令。
    l 对实用程序采用大工具栏按钮好的使用程序工具栏常常与应用程序的按钮不同,其按钮更简朴,更大。实用程序工具栏应该只包含几个带有描述性文字和图形的显眼命令。
    l 对应用程序采用可移动的、可定制的工具栏,而对实用程序采用固定的工具栏应用程序需要灵活的工具栏来支持其典型的使用方式。用户使用实用程序的时间一般不长,因而不需要定制工具栏。
    l 提供显示或隐藏工具栏选项如果有多个工具栏,分别为它们提供显示或隐藏的选项。
    l 总使用工具提示*工具提示帮助用户了解工具栏按钮的作用。
    1.3.1.30. 工具提示
    l 用工具栏的工具提示来提供信息,但要简短避免提示很明显的事情。考虑采用省略号来表示执行命令时需要更多信息。如果该命令已分配有快捷键,则显示该快捷键。
    l 使工具提示文本成为高级用户的媒介工具提示用于简短的识别和提醒,而不是用来教学。
    l 用工具提示显示有用信息不仅仅可在工具栏上使用工具提示,它的使用简单,能够向用户提供有用信息。但不可滥用--工具提示太多也就失去了其价值。不要对命令按钮会静态文本这样的控件使用工具提示。
    l 不要自动消去包含许多文字的工具栏提示默认时,10秒种后工具提示将自动消去。如果工具提示的文字很多,10秒钟对用户来说就看不完了。
    1.3.1.31. 文本
    l 避免不必要的缩写词要么给文本更多的空间,要么改写文本使其占用更少的空间,缩写词使文本不易理解。
    l 避免不必要的大写字母文本除非只去首字母构成的缩写词,否则不要用字母全为大写的单词,这样的单词看起来像在冲用户大喊大叫一样。
    l 避免复杂的标号尽量采用简单的标点,如句号、逗号、问号,以及破折号。避免使用分号、感叹号、圆括号、括号,等等。
    l 采用一致的大小写规则*对窗口标题、菜单、命令按钮、列标题属性页选项卡以及工具栏提示文字采用与书题一样的大小写规则,而对于标题、单选按钮、复选框、分组框和菜单项帮助中的文本采用与句子一致的大小写规则。(对于标题,除了不是标题开头和结尾的冠词和介词外,每个单词的第一个字母大小。对于句子,每个句子的第一个单词以及通常大写的单词--如专有名词的首字母大写。)
    l 避免不好的背景将文本放在实地、颜色适中的背景上,确保在文本和背景之间存在良好的对比。
    l 避免冒犯性语言避免激烈的词语,如fatal(致命的)、execute(执行)、kill(杀死、毁掉)、terminate(终止)、和abort(中止)。
    1.3.1.32. 消息框
    l 仔细选择消息框的类型采用带"确定"按钮的信息消息框向用户提供有关命令结果的信息。采用带"是"、"否",以及可能"取消"按钮的警告消息框在继续进行前需要用户输入的情形下告诫用户。采用危急消息框通知用户进行工作前需要修改一个错误。
    l 不要使用疑问消息框类型*不再推荐对消息框使用疑问标记符(MB_ICONQUESTION),因为它在Windows98后一致用来表示上下文修改帮助。
    l 避免不必要的消息框不要用出错消息来报告正常行为,而应该用来报告不正常或不期望的结果。不要对很容易恢复的操作进行确认。
    l 问用是/否回答的问题问用户问题时,采用"是"和"否"按钮代替"确定"和"取消"按钮,这样使问题易于理解。与对话框中不一样,"确定"和"取消"按钮很少同时用在消息框中。
    l 确保消息框选项按钮与文本一致例如绝不要用"是"和"否"来作为非提问消息的响应。同样,不要使用多个效果相同的选项按钮。例如,除非有不同的操作结果,否则不要同时提供"否"和"取消"按钮。"否"按钮应该执行操作,而"取消"应该取消操作。
    l 仔细选择默认按钮将最安全的或最常用的选项作为默认按钮。
    l 避免无用的帮助除非提供真正有用的附加信息,否则不要提供"帮助"按钮。不要附加带无用帮助信息的没意义的消息框。
    l 对危急错误考虑采用系统模式消息框采用系统模式消息框向用户提示严重的、可能造成破坏性的、急需注意的错误。系统消息框除了有WS_EX_TOPMOST样式外,与应用程序模式对话框完全一样。与在16位Windows中不一样的是,系统模式不影响用户与其他程序的交互。
    1.3.1.33. 错误消息
    l 避免错误号除非这个错误号对用户真正有用,否则不要给出错误号。
    l 避免责怪用户避免在出错消息文字中出现单词you(你)或your(你的)。如果需要,当指用户操作时使用被动语气。采用与"错误发生了"等价的表达,比采用与"你捅漏子了"等价的表达要好得多。
    l 避免敌对性语言避免在错误消息文字中使用词语bad(糟糕的、坏的)、caution(小心)、error(错误)、fatal(致命的)、illegal(非法)、invalid(无效)和warning(警告),而应该使用更具体的描述性词语。并且应该尽量解释到底是什么出了错。
    l 在出错消息文字中使用平实的语句表达要简短、清楚、协调、具体。除非缩写词,否则不要使用全部大写的单词,那样的单词看起来像在冲用户大喊大叫一样。使用完整的句子和一般的现在或过去时态。避免缩写词。
    l 避免在用户错误消息文字中装做有趣或高人一等用户并不觉得错误消息有趣,故装幽默并不能被广泛接受。
    l 允许用户压制非危急的错误消息对经常出现的非危急错误,向用户提供一个压制该错误消息的选项。
    1.3.1.34. 字体
    字体统一使用以下设置:
    Charset = GB2312_CHARSET
    Name = '宋体'
    Size = 9
    Color = clWindowText
    Style = []
    字符集不要使用 ANSI_CHARSET 或 DEFAULT_CHARSET,否则可能导致不同的操作系统下字符集不一致。
    l 尊重用户的字体选择*Windows允许用户为标题栏、菜单、消息框和工具提示选择字体。及时处理WM_SETTINGCHANGE消息以根据设置迅速而安全地改变字体。
    l 避免让人分心地字体一般说来,应避免使用Arial、Tahoma和MS Sans Serif之外的字体。Verdana、TrebuchetMS和Century Gothic也适合于轻微差别的外观。即使文档中的截线字体很不错,但界面中的任何截线字体都被认为是让人分心的。除了提示用户输入或模拟打字机外,不要采用等宽字体。
    l 避免使用粗体和斜体用粗体来吸引人的注意,用斜体表示着重,但要还少使用。
    l 避免混合字体任何不包含文档的窗口最多包含两种不同的字体。
    1.3.1.35. 颜色
    l 使用系统颜色*尊重用户的颜色选择,避免使用固定颜色。不要强迫用户使用您选择的颜色。避免让人分心的文本颜色,通常是黑色之外任何颜色,对文本使用系统颜色COLOR_BTNTEXT或COLOR_WINDOWTEXT。在白色(COLOR_WINDOW)背景上使用黑色(COLOR_WINDOWTEXT)文字是完全正确的。及时处理WM_SYSCOLORCHANGE消息以根据设置迅速而完全地改变颜色。
    l 根据内容而不是外观来选择系统颜色*不要将作为一个集合中的几种系统颜色混合匹配在一起。例如,不要将COLOR_BTNTEXT和COLOR_WINDOW混合在一起。
    l 考虑对图形使用中间调色板在256色模式下使用中间色调色板避免了调色板的闪烁。
    l 不要用颜色作为传递消息的唯一方式*不依赖于对颜色的区分可以增强程序对色盲用户的可访问性,并且使程序可运行在单色显示器上。
    1.3.1.36. 三维效果
    l 避免不必要的三维效果除非对控件分组,否则避免三维静态线和矩形框。宁可采用空白来分开组件,绝不在三维矩形框周围套其他的三维矩形框。避免使用三维文本。

     

    三维效果过多

    在界面中采用太多的三维效果是程序员常范的错误。毕竟,如果有些三维效果很酷,对吧?不完全如此。请看下面的对话框。一点也不酷。一旦三维控件流行起来,就好像能使用三维的都采用三维,而不管看起来是好是坏。即使采用三维边框,其目的也是为了让人理解。采用许多三维静态框架控件通常是个坏征兆,现代的趋时是倾向于更为简单的风格。
     


    l 使用柔和的三维效果请注意Window98中更为细致的三维效果是如何比Window 3.1中的三维效果更有效更悦目的。尽管绝大多数现时世界的物体有加亮区,但很少有黑色实边框的。Windows98仅是通过在突起物体的右边和底部加上黑色边框以及在凹陷物体的上部和左边加黑色边框来达到三维效果。

     

    去除多余的三维效果

     

    最少三维效果

    l 使用一致的三维效果*确保三维效果的光源位于屏幕的左上角。
    1.3.1.37. 各种细节
    l 不要发音和闪动没什么比发音和闪动的程序更烦人的了。但闪烁程序的任务栏窗口按钮通知用户未决消息例外。
    l 避免不必要的视频效果至少一个使其为可选择的。理想情形是,默认时关闭这样的效果,用户有明确要求时才打开。
    l 用缩放功能提高文档可访问性提供提供文档缩放功能,可提高显示文档的程序的可访问性和整体性能。
    l 处理WM_DISPLAYCHANGE消息*改变显示分辨率后,程序应该能够正确显示和运行。
    l 基于光盘的程序的应该支持自动播放当光盘插入驱动器后,"自动播放"应该显示一列选项,包括安装。程序安装以后,不应该运行"自动播放"。
    l 支持用户采用日期和时间拾取控件进行日期输入,GetDateFormat和GetTimeFormat函数用于设置货币和数字的格式,LCMapString API用于排序。考虑采用RichEdit控件用于文本输入和输出。最后,利用WM_INPUTLANGCHANGE消息来处理输入语言的改变。
    1.3.2. 统一术语
    1.3.2.1. 术语的重要性
    我们用名称来区别、描述和查找事物,使用名称来分解并理解不熟悉的事物。采用统一的术语有助于我们更好地理解和进行交流--简化并统一用户界面术语有助于用户理解和充分应用我们设计的界面。
    使用不同的术语描述相同的事物是最让人迷惑的,而改变人人都已经熟悉的术语也是有害的。这两种情况都使得程序难以讨论、描述,以及归档。甚至使它难以编程。
    1.3.2.2. 命名
    下面是一些需要命名的、与界面有关的典型对象:
    ● 程序本身;
    ● 程序使用的文档类型;
    ● 用户利用程序执行的主要操作;
    ● 所有的窗口、对话框和属性表;
    ● 主程序窗口中的使用区域;
    ● 认为非标准的屏幕对象、命令、属性、交互、或者技术。
    简而言之,用户可以看到或需要与其进行交互的、显示在菜单、工具栏、窗口、对话框、状态栏、联机帮助或文档中的任何内容都需要有一个名称。当然,您将会使用已存在的标准屏幕对象的名称。例如,您不需要命名常用的对话框,因为它们已经拥有名称。

    1.3.2.3. 用用户的语言说话
    使用软件面向的用户所熟悉的词语,除非您的软件是为了程序员设计的,否则应该避免使用计算机行话,而应用常用的单词代替。例如,对绝大多数用户来说,常用单词"separator"(分隔符)就比技术术语"delimiter"(定界符)要好得多。如果必须使用技术词汇,那么应采用那些用户可能知道的术语。
    1.3.2.4. 要避免的术语
    也有些术语是千万不要用在您的用户界面中的。尽管"execute"执行、"kill"(杀死)、"terminate"(结束)、"fatal"(致命的)和"abort"(中止)这样的术语在程序员文献中是完全可接受的,但完全应该避免出现在其他的文字中。

  • [转载]QTP测试页面的连接是否可用.

    风过无息 发布于 2007-05-23 18:36:51

    set a= Browser("Yahoo!")
    set b= Browser("Yahoo!").Page("Yahoo!")
    call CheckLinks(a,b)
    Function CheckLinks (BrowserObject,BrowserPage)
    CheckLinks=TRUE
    Dim s_URL,i_CreationTime
    Dim s_LinkOuterText,s_LinkInnerText,s_Linkhref
    s_URL=BrowserPage.GetROProperty("url")
    i_CreationTime=1
    i_LinkCount=BrowserPage.object.links.length - 1

    Dim i_Link

    For i_Link=0 to i_LinkCount
    If Trim(BrowserPage.object.links(i_Link).target)="" Then
    BrowserPage.object.links(i_Link).target="_blank" ' Set the link to open i a new window so that we dont have any change in current window
    End If

    BrowserPage.object.links(i_Link).click
    On error resume next
    Browser("CreationTime:=" & i_CreationTime).sync
    Browser("CreationTime:=" & i_CreationTime).Page("micClass:=Page").sync
    On error goto 0
    Dim s_LinkDetails

    IHTML = Browser("CreationTime:=" & i_CreationTime).Page("micClass:=Page").object.Body.innerHTML
    'Check if page was not able to be displayed
    If (InStr(IHTML,"HTTP 404") <> 0) Or (InStr(IHTML,"cannot be displayed") <> 0) Then
    s_LinkDetails="Link Broken" + vbcrlf + "Link Details:" +vbcrlf
    s_LinkDetails=s_LinkDetails+"OuterText: "+ s_LinkOuterText + vbcrlf
    s_LinkDetails=s_LinkDetails+"InnerText: "+ s_LinkInnerText + vbcrlf
    s_LinkDetails=s_LinkDetails+ "href: " + s_Linkhref+ vbcrlf
    s_LinkDetails=s_LinkDetails+ "Links Open in New Browse: " & bNewBrowser & vbcrlf
    Reporter.ReportEvent micWarning,"Check Link(" & i_Link & ") -> " & s_LinkOuterText ,s_LinkDetails
    CheckLinks=FALSE
    Else
    s_LinkDetails="Link Working" + vbcrlf + "Link Details:" +vbcrlf
    s_LinkDetails=s_LinkDetails+"OuterText: "+ s_LinkOuterText + vbcrlf
    s_LinkDetails=s_LinkDetails+"InnerText: "+ s_LinkInnerText+ vbcrlf
    s_LinkDetails=s_LinkDetails+ "href: " + s_Linkhref+ vbcrlf
    s_LinkDetails=s_LinkDetails+ "Links Open in New Browse: " & bNewBrowser & vbcrlf
    Reporter.ReportEvent micPass,"Check Link(" & i_Link & ") -> " & s_LinkOuterText ,s_LinkDetails
    End If

    Browser("CreationTime:=1").close ' Close the link open.
    Next
    End Function


     

  • 懂LINUX才能勾引美女

    kanglizhi 发布于 2007-09-13 06:43:41

    是一个用LINUX命令来模拟一个在酒吧勾搭美妹的过程
    自己慢慢体味吧,顺便考查一下你linux命令学的怎么样。
    find 
    talk 
    whoami 
    whatis 
    uname 
    quota 
    set 
    mv 
    whereis 
    unzip 
    strip 
    touch 
    finger 
    top 
    mount 
    compress 
    !! 
    more 
    yes 
    jobs 
    umount 
    sleepy

    看懂了没有哦,交流一下,如果你是linux爱好者,这样的命令不收藏真可惜......
    for i in `seq 10000000`;do
    mount;
    umount;
    done

    shutdown -h now
  • TD缺陷管理系统公网配置

    秋之水 发布于 2007-07-02 11:07:12

        TD缺陷管理系统,已经在公司内部网络中正常的使用几年了, 由于公司有些项目外包,或一些项目要到客户现场开发,就想着让TD能在公网上使用.

    1、IIS方面差不多不用怎么配置,就修改了一下默认web站点的主目录位置,改为C:\Inetpub\TDBIN\

    2、去花生壳的网站注册了一个用户,申请了一个免费域名:XXXXX.vicp.net,下载花生壳的客户端,并运行.

    在浏览器中输入http://XXXXX.vicp.net, 页面无法连接,而用HTTP://127.0.0.1 却可以连接

    去网上一查,原来是没有在路由器那边没有映射端口,于是进行以下的第三步:

    3、进入路由器的管理控制台:http://192.168.0.1/ 公司使用的是tplink 的路由器,admin网络密码为moden。打开控制台后,进入转发规则的虚拟服务器,添加新的条目

    服务端口号:80

    IP地址:192.168.0.xxx

    协议:tcp

    常用服务器端口号:http

    这样映射好端口后,再次在浏览器中输入http://XXXXX.vicp.net,成功,再让公网上的朋友连接到这个地址试试,成功连接

  • 转载-软件测试及Bug管理经验谈

    bunny112 发布于 2007-09-11 14:42:45

     

    软件测试及Bug管理经验谈

     

    1、 写在前面的话

     

    本人从事软件工作多年,对如何作测试、如何管理Bug上有一些体会和想法;正好看到网上关于这方面的讨论较多,不妨简单地写出来。本文就测试工作的组织及工具的选用介绍一下主要的思路,供大家参考。

     

    2、如何作好软件测试

     

    1)清晰的质量概念

    常言道没有规矩不成方圆,产品交到您手上,各方面质量标准您要心中有数。安装卸装、功能性能、用户界面、出错与恢复......等等,您可列出大纲式的CheckList,不一定很详细但一定要全。

    不同的开发队伍,规范化水平不同,他们不一定能提交完善的规格书、品质书,如果您自己也没有这个概念,测试中就容易疏漏很多东西。比如,界面上的Button大小、用词、字体、颜色等有规范吗?页面响应时间呢?总之,您要让人家明白,您对这些方面是有要求的。

    2)善作计划

    按照CheckList,要测试的东西真的是很多,但人力、时间等资源是有限的,您需要考虑重要性、优先级等因素,作一个测试计划。确定测试内容是重要的,确定哪些不测或暂缓测试、同样也是重要的。针对需要测的内容,安排测试环境、人员、时间等,这些大的方面要与上司、相关人员讨论清楚,获得他们的支持。接下来再细化大的Check点,形成详细的测试方案。

    3)明确进入退出标准

    需要明确进行测试所必须具备的条件,如:测试环境、送测产品的媒介形式、文档等。如果达不到基本要求可明确地提出来,暂时退出直到问题得到解决,否则很浪费大家时间的。如:环境不具备、根本就安装不上、有大量严重错误等。

    4)对测试人员的要求

    逻辑思维要强,说到底,测试就是一种逻辑覆盖,要用尽量少的测试实例覆盖尽量多的逻辑,这就是效率。细心很重要,在每一个测试点,您需要静下来好好想想,还有哪些可能的情况?细心一定会给您带来高产量的Bug的。

    5)关于自动测试工具

    任何工具都是在人的安排下发挥作用,您自己如何测永远是第一位的。一般说来,自动测试工具只能在压力、容量等某些性能领域发挥作用,其他绝大部分需要的是勤奋和智慧。

    6)不断积累、持续改善

    您无论多么出色还是会漏掉Bug,您需要有一个方法能够不断地、持续地改善。分析总结原因、不断完善测试计划、测试方法等,并用文档整理出来,您的基础就会越垫越厚,工作越来越有效。

    7)明确自己的责任

    作为测试人员,您的任务就是找出缺陷、及时清晰的汇报给相关人员,让管理者清楚产品的质量状况。有时,您测出的问题他们决定不改,或者您认为没达到Release标准他们决定Release,这是可能的。影响一个决定的因素是多方面的,有经费、市场、策略、质量等,虽然测试通常是产品开发的最后一关,但我还没有见过测试人员决定一切的。

     

    3Bug管理的作用层次

     

    软件开发的重点已经从技术转到管理与质量控制上了,如何按时做出符合质量的产品是我们最大的挑战,测试工作在开发过程中占据相当大的份额,Bug管理的作用可想而知。其作用基本上分以下几个层次。

    1)备忘与沟通

    备忘是一个Bug管理系统最朴素、最基本的作用,好记性不如烂笔头,道理就这么简单。您什么时候测出了Bug、怎么测的、当时环境怎样,开发人员解决了没有、什么时候解决的、如何解决的,需要及时记录下来;问题一多,您靠记忆是记不住的。没有遗漏地记下所有问题点并确保适当地处理掉,是Bug管理的基本要求。

    Bug的产生、变更需及时通知相关人员,他们也应能随时查询不同状况的Bug 数据,良好的沟通才能保证有效的协作。

    2)监控

    作为项目管理者,您需要及时全面了解目前的项目状况,有些Bug是影响全局的严重错误,需要立即做出处理、决策;有些Bug需要决定改还是不改,或是放入以后版本、分配给其他人等等。所以项目管理者应该能够监控Bug状况。

    3)定量分析

    Bug数据作定量的统计分析是更进一步的需求,如:bug数量随时间变化的趋势图、从测试者、责任人、缺陷级别、缺陷原因等不同角度统计缺陷数量等等。

    4)环境集成

    更高一级的需求是与需求、测试方案、SourceCode、自动测试工具等关联起来。

     

    4Bug管理工具的选用

     

    与选用任何一件商品一样,与您的需求、产品价格、服务等有关。

    1)需求

    大部分开发机构对Bug工具的要求并不高,能记录问题点、能及时传达给相关人员,并监督他们都作了适当的处理,基本上就可以了。很多网友说某某系统怎么弄得这么复杂、这么贵,自己花一个星期就能做个可用的东西,说的就是这个意思。早期,市场上没有合适的Bug管理系统,我使用Excel作,说实在的也不错。当然啦,时代在进步,Bug管理系统可更好地实现这些需求。

    稍微高一点的要求,可做定量的统计分析,挖掘信息潜在价值。

    更高一级的需求,就是景上添花啦,可以与需求、测试方案、SourceCode、自动测试工具等环境集成。但事物总是两面性的,要真正发挥这些作用需要有完善的需求规格、测试方案,需要仔细规划自动化工具所产生数据的过滤、运用。一句话,对自身的规范化要求较高,否则这些功能听起来不错,实际利用不起来。

    2)服务与价格

    从价格上说,有3类缺陷管理工具可供选用。

    一是纯免费的,如BugzillaMantis等。但免费的东西用户友好性差、安装难,您需要懂linuxperlmySQLapache之类的东西;而且没服务,出一点问题您就上Internet淘技术文章去吧,如何安装、使用这些免费软件简直是一门学问了。

    二是价格较低的国产软件,基本满足备忘沟通和监控的需要。如华创BMS,做得比较灵活,字段、权限、email通知、数据字典等都可以定制,适应性较强,统计报表的定制性也较强,可以做一定的定量分析。一般开发单位使用这类系统基本够用。

    三是价格中等或较高,如微创的BMSMITestDirectorIBM RationalClearQuest等。可以做一定的环境集成,如TD,可以把RequirementTestplanBug关联起来,微创BMS可以与MS ProjectSourceSafe关联。价格稍高,几万到几十万之间,关键是这些高级功能您真的能利用上。

     

    总的说来,适合您的、就是好的,微软内部的Bug管理界面也非常朴素,看上去有点像windows 95那个时代的小工具。另外服务是很重要的,问题解决不了耽误自己的时间不说,可别影响测试工作。

     

    5、典型Bug管理工具比较

     

    我经历过几个单位,如何管理Bug前后使用过Excel、自制的简易工具、BugzillaTD、华创BMS,再参考分析ClearQuest、微创BMS,分析比较如下:

  • td系统数据库的密码

    秋之水 发布于 2007-06-26 14:29:28

    td系统数据库的密码 tdtdtd
  • [转]SQL语句优化技术分析

    ting_yt2 发布于 2007-08-30 16:41:17

  • 功能特征 \ 产品

    Testdirector

    ClearQuest

    微创BMS

    Bugzilla

    华创BMS

    构架模式

    B/S

    C/S,B/S

    B/S

    B/S

    B/S

    用户友好性

    一般

    流程定制

    Y

    Y

    N

    Y

    Y

    查询功能定制

    Y

    Y

    Y

    Y

    Y

    功能域定制

    Y

    Y

    Y

    Y

    Y

    附件支持

    Y

    Y

    Y

    Y

    Y

    用户权限分级管理

    Y

    Y

    Y

    Y

    Y

    Email通知

    Y

    Y

    Y

    Y

    Y

    批量修改

    N

    N

    N

    Y

    Y

    导出至外部文档

    Word文档

    N

    N

    N

    Excel,HTML

    报表定制功能

    Y

    ,集成Crystal Report

    有标准报表和高级报表,定制功能不够

    Y

    ,有标准报表,定制方便

    数据更改历史

    Y

    Y

    Y

    N

    Y

    支持平台

    Windows

    SQL语句优化技术分析

    操作符优化

    IN 操作符

    IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。

    但是用INSQL性能总是比较低的,从ORACLE执行的步骤来分析用INSQL与不用INSQL有以下区别:

           ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。由此可见用INSQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。

           推荐方案:在业务密集的SQL当中尽量不采用IN操作符。

    NOT IN操作符

           此操作是强列推荐不使用的,因为它不能应用表的索引。

           推荐方案:用NOT EXISTS 或(外连接+判断为空)方案代替

    <> 操作符(不等于)

           不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。

    推荐方案:用其它相同功能的操作运算代替,如

           a<>0 改为 a>0 or a<0

           a<>’’ 改为 a>’’

    IS NULL IS NOT NULL操作(判断字段是否为空)

           判断字段是否为空一般是不会应用索引的,因为B树索引是不索引空值的。

           推荐方案:

    用其它相同功能的操作运算代替,如

           a is not null 改为 a>0 a>’’等。

           不允许字段为空,而用一个缺省值代替空值,如业扩申请中状态字段不允许为空,缺省为申请。

           建立位图索引(有分区的表不能建,位图索引比较难控制,如字段值太多索引会使性能下降,多人更新操作会增加数据块锁的现象)

    > < 操作符(大于或小于操作符)

           大于或小于操作符一般情况下是不用调整的,因为它有索引就会采用索引查找,但有的情况下可以对它进行优化,如一个表有100万记录,一个数值型字段A30万记录的A=030万记录的A=139万记录的A=21万记录的A=3。那么执行A>2A>=3的效果就有很大的区别了,因为A>2ORACLE会先找出为2的记录索引再进行比较,而A>=3ORACLE则直接找到=3的记录索引。

    LIKE操作符

    LIKE操作符可以应用通配符查询,里面的通配符组合可能达到几乎是任意的查询,但是如果用得不好则会产生性能上的问题,如LIKE ‘%5400%’ 这种查询不会引用索引,而LIKE ‘X5400%’则会引用范围索引。一个实际例子:用YW_YHJBQK表中营业编号后面的户标识号可来查询营业编号 YY_BH LIKE ‘%5400%’ 这个条件会产生全表扫描,如果改成YY_BH LIKE ’X5400%’ OR YY_BH LIKE ’B5400%’ 则会利用YY_BH的索引进行两个范围的查询,性能肯定大大提高。

    UNION操作符

    UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如:

    select * from gc_dfys

    union

    select * from ls_jg_dfys

    这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。

    推荐方案:采用UNION ALL操作符替代UNION,因为UNION ALL操作只是简单的将两个结果合并后就返回。

    select * from gc_dfys

    union all

    select * from ls_jg_dfys

    SQL书写的影响

    同一功能同一性能不同写法SQL的影响

    如一个SQLA程序员写的为

           Select * from zl_yhjbqk

    B程序员写的为

           Select * from dlyx.zl_yhjbqk(带表所有者的前缀)

    C程序员写的为

           Select * from DLYX.ZLYHJBQK(大写表名)

    D程序员写的为

           Select *  from DLYX.ZLYHJBQK(中间多了空格)

    以上四个SQLORACLE分析整理之后产生的结果及执行的时间是一样的,但是从ORACLE共享内存SGA的原理,可以得出ORACLE对每个SQL 都会对其进行一次分析,并且占用共享内存,如果将SQL的字符串及格式写得完全相同则ORACLE只会分析一次,共享内存也只会留下一次的分析结果,这不仅可以减少分析SQL的时间,而且可以减少共享内存重复的信息,ORACLE也可以准确统计SQL的执行频率。

    WHERE后面的条件顺序影响

    WHERE子句后面的条件顺序对大数据量表的查询会产生直接的影响,如

    Select * from zl_yhjbqk where dy_dj = '1KV以下' and xh_bz=1

    Select * from zl_yhjbqk where xh_bz=1  and dy_dj = '1KV以下'

    以上两个SQLdy_dj(电压等级)及xh_bz(销户标志)两个字段都没进行索引,所以执行的时候都是全表扫描,第一条SQLdy_dj = '1KV以下'条件在记录集内比率为99%,而xh_bz=1的比率只为0.5%,在进行第一条SQL的时候99%条记录都进行dy_djxh_bz的比较,而在进行第二条SQL的时候0.5%条记录都进行dy_djxh_bz的比较,以此可以得出第二条SQLCPU占用率明显比第一条低。

    查询表顺序的影响

    FROM后面的表中的列表顺序会对SQL执行性能影响,在没有索引及ORACLE没有对表进行统计分析的情况下ORACLE会按表出现的顺序进行链接,由此因为表的顺序不对会产生十分耗服务器资源的数据交叉。(注:如果对表进行了统计分析,ORACLE会自动先进小表的链接,再进行大表的链接)

    SQL语句索引的利用

    对操作符的优化(见上节)

    对条件字段的一些优化

    采用函数处理的字段不能利用索引,如:

    substr(hbs_bh,1,4)=’5400’,优化处理:hbs_bh like ‘5400%’

    trunc(sk_rq)=trunc(sysdate), 优化处理:

    sk_rq>=trunc(sysdate) and sk_rqsysdate+1)

    进行了显式或隐式的运算的字段不能进行索引,如:

    ss_df+20>50,优化处理:ss_df>30

    ‘X’||hbs_bh>’X5400021452’,优化处理:hbs_bh>’5400021542’

    sk_rq+5=sysdate,优化处理:sk_rq=sysdate-5

    hbs_bh=5401002554,优化处理:hbs_bh=’ 5401002554’注:此条件对hbs_bh 进行隐式的to_number转换,因为hbs_bh字段是字符型。

    条件内包括了多个本表的字段运算时不能进行索引,如:

    ys_df>cx_df,无法进行优化

    qc_bh||kh_bh=’5400250000’,优化处理:qc_bh=’5400’ and kh_bh=’250000’

    应用ORACLEHINT(提示)处理

    提示处理是在ORACLE产生的SQL分析执行路径不满意的情况下要用到的。它可以对SQL进行以下方面的提示

    目标方面的提示:

    COST(按成本优化)

    RULE(按规则优化)

    CHOOSE(缺省)(ORACLE自动选择成本或规则进行优化)

    ALL_ROWS(所有的行尽快返回)

    FIRST_ROWS(第一行数据尽快返回)

    执行方法的提示:

    USE_NL(使用NESTED LOOPS方式联合)

    USE_MERGE(使用MERGE JOIN方式联合)

    USE_HASH(使用HASH JOIN方式联合)

    索引提示:

    INDEXTABLE INDEX)(使用提示的表索引进行查询)

    其它高级提示(如并行处理等等)

    ORACLE的提示功能是比较强的功能,也是比较复杂的应用,并且提示只是给ORACLE执行的一个建议,有时如果出于成本方面的考虑ORACLE也可能不会按提示进行。根据实践应用,一般不建议开发人员应用ORACLE提示,因为各个数据库及服务器性能情况不一样,很可能一个地方性能提升了,但另一个地方却下降了,ORACLESQL执行分析方面已经比较成熟,如果分析执行的路径不对首先应在数据库结构(主要是索引)、服务器当前性能(共享内存、磁盘文件碎片)、数据库对象(表、索引)统计信息是否正确这几方面分析。

  • 软件测试检查表

    bingling_11 发布于 2007-09-04 16:03:23

    1        针对测试组长或测试经理
    1.1   测试管理工作检查表:
    1.      检查每轮测试开始时测试环境是否准备好(包括软件硬件、测试基本数据等);
    2.      确保测试环境(数据和程序)与开发分离,除了测试组之外其他人不能更新测试环境的数据和程序;
    3.      每轮测试根据上一轮的情况和总体测试计划做分工调整;
    4.      检查case库的填报情况,抽查执行过的case;
    5.      检查BUG提交情况,抽查提交的BUG是否规范;
    6.      每天晚上统计BUG情况,填写每天的BUG报告;
    7.      根据每天的测试情况,决定是否开发组要发布新的BUILD;
    8.      每轮测试结束后填写测试总结。
    2        下面是针对测试执行人员的:
    2.1   输入、编辑功能的验证检查点:
    1.       必输项是否有红星标记,如果不输入提示是否跟相应的Label对应,提示的顺序是否跟Form输入域的排列次序一致;
    2.       输入的特殊字符是否能正确处理:`~!@#$%^&*()_+-={}[]|\:;”’<>,./?;
    3.       Form下拉菜单的值是否正确,下拉菜单的值通过维护后是否正确显示并可用;下拉菜单比如是机构编码,要到机构编码的维护界面查询一下是否Form列出的与其一致;
    4.       涉及到下拉菜单的编辑修改Form,要检查在编辑和修改From中,下拉菜单是否能正确显示当前值;
    5.       Form提交后,要逐项检查输入的内容跟通过查询的结果一致;
    6.       有多层下拉菜单选择的情况要校验两层菜单的选择是否正确,比如:
    a)       部门 人员
           部门 财务软件开发部人员 张三
    7.       备注字段的超常检查;
    8.       提交保存后能否转到合适的页面;
    9.       编辑Form显示的数据是否跟该记录的实际数据一致;
    10.    编辑权限的检查,比如:user1的数据user2不能编辑等;
    11.    可编辑数据项的检查,比如:数据在正式提交之前所有的属性都可以编辑,在提交之后,编号、状态等不能编辑,要根据业务来检查是否符合需求;
    12.    对于保存有事务Trasaction提交,比如一次提交对多表插入操作,要检查事务Trasaction的处理,保证数据的完整和一致;
    13.    其他的合法性校验。
    2.2   查询功能检查点:
    1.       查询输入Form是否正常工作,不输入数据是否查询到全部记录;
    2.       当查询的数据非常多的时候,性能有无问题;
    3.       查询的下拉菜单列出的数据是否正确;
    4.       查询结果是否正确;对于复杂的查询要通过SQL来检查结果;
    5.       如输入%*?等统配符是否会导致查询错误;
    6.       查询结果列表分页是否正确,在点击下一页上一页时,查询条件是否能带过去,不能点击翻页时又重新查询;
    7.       对于数据量比较大的表查询时,不容许无条件查询,避免性能问题的出现;
    8.       对于查询输入项的值是固定的要用下拉菜单,比如状态、类型等;
    9.       分页的统计数字是否正确,共X页,第N页,共X条记录等;
    10.    对于查询有统计的栏目,比如:总计、合计等要计算数据是否正确;
    11.    查询结果有超链接的情况要检查超链接是否正确;
    12.    查询权限的检查,比如:user1不能查询到user2的数据等;
    2.3   删除功能检查点:
    1.       必须有“确认删除”的提示;
    2.       根据需求检查是软删除还是硬删除,来检查数据库中是否还存在该条记录;
    3.       是否有相关的数据删除,如果有要确认该相关的数据也已经删除,并且在同一事务中完成;
    4.       是否有删除约束,如果有删除约束,要检查该记录是否被约束,如果被约束该记录不能被删除;
    5.       如果是软删除,用查询、统计界面检查该条记录能否被查询出来,数据是否被统计进去;
    6.       检查因为业务约束不能删除的数据能否被保护不能手工删除,比如:流程中已经审批的文件不能被删除;
    7.       跟删除相关的权限问题,比如:需求要求只有管理员和该记录的创建人能够删除该记录,那就以不同的用户和角色登录进去,执行删除操作,检查是否与需求匹配;
    2.4   上传附件检查点:
    1.       检查是否能正确上传附件文件;
    2.       检查上传的文件是否能正确下载并打开;
    3.       至少检查下列大小的文件能正确上传,100k,1M,2M,4M,10M,20M等;
    4.       如果没有指定类型的限制,至少上传以下几种类型的文件能否正确上传并正确打开,类型有:.doc, .xls, .txt, .ppt, .htm, .gif, .jpg, .bmp, .tif, .avi等;
    5.       如果有文件类型的限制还要检查能上传的文件的类型;
    6.       上传同名的文件,在打开的时候是否出错;
    7.       有中文文件名的文件能否正确上传;
    2.5   影响操作性能的检查点:
    (不能代替系统的性能测试和压力测试,主要看系统在正常操作情况下的响应和处理能力)
    1.       对数据记录条数比较多的表的查询操作,避免全表查询,比如对银行用户账号的查询就不能缺省全部查出,必须让用户输入查询条件;
    2.       菜单树,测试大量数据时菜单树的响应情况;
    3.       有日志的查询或者统计,要注意查询的效率;
    4.       大报表的处理或者批处理的操作,要关注效率,比如:银行对帐、财务年终结算、财务年报表、系统初始化等;
    5.       大报表的排序sort、组函数的使用等;
    6.       大数据量的处理,如导入、导出、系统备份、文件传输等;
  • tsl脚本命令(转贴)一

    annayin 发布于 2007-07-21 11:08:16

    tsl脚本命令(转贴)一

    Winrunner Context Sensitive命令列表




    1.ActiveBar_combo_select_item ( band_tool , item_name );选择下拉菜单某一项,例如:


    set_window("Form1", 1);


    ActiveBar_combo_select_item("Format;Font", "Arial");


    In the following example, WinRunner selects the third item in the Format:Font tool.


    set_window("Form1", 1);


    ActiveBar_combo_select_item("Format;Font", "#3");


    2.ActiveBar_dump ( file_name );存储活动工具栏信息,包括标题、名称、ID等。

    file_name            参数包括路径,例如:

    set_window("Form1", 1);

    ActiveBar_dump ("d:Bardump.txt");

    3、ActiveBar_select_menu ( band_tool [, events_only ] ) ;选择菜单某一项,例如:

    in the following example, WinRunner selects the Cut menu item in the Edit toolbar.

    set_window("Form1", 1);

    ActiveBar_select_menu ("Edit;Cut",TRUE);

    4、ActiveBar_select_tool (band_tool [, events_only ] ) ;选择工具栏里某一项,例如:

    set_window("Form1", 1);

    ActiveBar_select_tool("Format;Center", TRUE);

    5、win_check_bitmap ( window, bitmap, time [, x, y, width, height ] );比较窗口位图,

    6、obj_check_bitmap ( object, bitmap, time [, x, y, width, height] );比较对象位图,

    7、button_check_info ( button, property, property_value );检查按钮属性的值

    8、button_check_state ( button, state );检查单选框或复选框的状态

    9、button_get_info ( button, property, out_value );返回按钮属性的值

    10、button_get_state ( button, out_state );返回单选框或复选框的状态

    11、button_press ( button );点击按钮

    12、button_set ( button, state );设置单选框或复选框的状态

    13、button_wait_info ( button, property, value, time );等待按钮的属性值变化

    14、calendar_activate_date ( calendar, date );双击日历某个日期

    15、db_check ( checklist, expected_results_file [ , max_rows [ , parameter_array ] ] );比较当前数据库数据和期待的数据库数据

    16、db_connect ( session_name, connection_string );建立一个数据库session并建立odbc连接

    17、db_disconnect ( session_name );断开连接结束session

    18、db_execute_query ( session_name, SQL, record_number );执行sql语句返回记录集

    19、db_get_field_value ( session_name, row_index, column );返回数据库特定区域的值

    20、db_get_headers ( session_name, header_count, header_content );返回数据库session的列的数量及列的内容并以tab分组

    21、db_get_last_error ( session_name, error );返回最后一条数据库session错误信息

    22、db_get_row ( session_name, row_index, row_content );返回特定行内容

    23、db_record_check ( ChecklistFileName , SuccessConditions, RecordNumber ); Compares information that appears in the application under test during a test run with the current values in the corresponding record(s) in your database.

    24、db_write_records ( session_name, output_file [ , headers [ , record_limit ] ] );把结果记录集写到一个文本文件

    25、ddt_close ( data_table_name );关闭数据表文件

    26、ddt_close_all_tables();关闭全部数据表

    27、ddt_export ( data_table_namename1, data_table_namename2 );把一个数据表信息导到另一个数据表文件

    28、ddt_get_current_row ( data_table_name, out_row );返回数据表当前所在行

    29、ddt_get_parameters ( table, params_list, params_num );返回数据表的参数和参数的个数

    30、ddt_get_row_count ( data_table_name, out_rows_count );返回数据表行数

    31、ddt_is_parameter ( data_table_name, parameter );返回一个参数是否在数据表里有效

    32、ddt_next_row ( data_table_name );指向数据表中到当前行的下一行

    33、ddt_open ( data_table_name [ , mode ] );打开或创建一个可以访问的数据表

    34、ddt_report_row ( data_table_name );报告当前行到测试结果

    35、ddt_save ( data_table_name );保存数据表信息

    36、ddt_set_row ( data_table_name, row );设置当前行为第几行

    37、ddt_set_val ( data_table_name, parameter, value );插入parameter列一个新值value

    38、ddt_set_val_by_row ( data_table_name, row, parameter, value  );插入特定行的parameter列一个新值value

    39、ddt_show ( data_table_name [ , show_flag ] );显示或隐藏数据表,1是显示,0是隐藏

    40、ddt_sort ( table_file, row1, col1, row2, col2, sort_by_rows, key1 [ , key2, key3 ]  );根据关键字将数据表特定区域的值排序,sort_by_rows            参数1是按行,0是按列

    41、ddt_update_from_db ( data_table_name, file, out_row_count [ , max_rows ] );从数据库往数据表里导数据;

    42、ddt_val ( data_table_name, parameter );返回数据表当前行的参数的值

    43、ddt_val_by_row ( data_table_name, row_number, parameter );返回数据表特定行的参数的值

    44、date_age_string ( date, years, month, days, new_date );将日期相应改变返回新值

    45、date_align_day ( align_mode, day_in_week );指定特定的日期给某天

    46、date_calc_days_in_field ( field_name1, field_name2 );计算两个日期间的天数

    47、date_calc_days_in_string ( string1, string2 );计算字符串格式的日期间的天数

    48、edit_check_info ( edit, property, property_value );检查对象属性的值

    49、edit_check_selection ( edit, selected_string );检查选择的字符串是否存在

    50、edit_check_text (edit, text, case_sensitive );检查编辑对象的文本内容

    51、edit_delete ( edit, start_column, end_column );删除编辑对象的文本内容

    52、edit_delete_block ( edit, start_row, start_column, end_row, end_column );删除文本区

    53、edit_get_block ( edit, start_row, start_column, end_row, end_column, out_string );返回文本区

    54、edit_get_info ( edit, property, out_value );返回编辑对象的属性值

    55、edit_get_row_length ( edit, row, out_length );返回编辑对象里行的长度

    56、edit_get_rows_count ( edit, out_number );返回编辑对象里行数

    57、edit_get_selection ( edit, out_string );返回编辑对象的选定字符串

    58、edit_get_selection_pos ( edit, out_start_row, out_start_column, out_end_row, out_end_column );返回选定区域的开始和结束位置

    59、edit_get_text ( edit, out_string );返回编辑对象的文本

    60、edit_insert ( edit, text, columnI );在编辑对象第一行插入文本

    61、edit_insert_block ( edit, text, row, column );在一个多行编辑对象插入文本

    62、edit_replace ( edit, text, start_column, end_column );替换一个编辑对象的内容

    63、edit_replace_block ( edit, text, start_row, start_column, end_row, end_column );替换一个编辑对象的多行内容

    64、edit_set ( edit, text );替换编辑对象的全部内容

    65、edit_set_insert_pos ( edit, row, column );把鼠标指针放到编辑对象特定位置

    66、edit_set_selection ( edit, start_row, start_column, end_row, end_column );选择编辑对象的文本

    67、edit_type ( edit, text );在编辑对象敲入字符串

    68、edit_wait_info ( edit, property, value, time );等待编辑对象属性的值

    69、obj_check_gui ( object, checklist, expected_results_file, time );比较当前的gui对象数据

    70、win_check_gui ( window, checklist, expected_results_file, time );对一个窗口比较当前的gui对象数据

    71、get_class_map ( custom_class, out_standard_class );返回和一个自定义的类相关的标准类

    72、get_record_attr ( class, out_obligatory, out_optional, out_selector );从一个对象类返回属性

    73、get_record_method ( class, out_method );返回一个对象类的方法

    74、set_class_map ( custom_class, standard_class );关联一个自定义类和一个标准类

    75、set_record_attr ( class, oblig_prop, optional_prop, selector );设置一个对象类的属性

    76、set_record_method ( class, method );设置对一个类的记录方法

    77、unset_class_map ( custom_class );解开一个自定义类和标准类的关联关系

    78、GUI_add ( file path, window, object, physical_desc );往gui map文件里加一个对象

    79、GUI_buf_get_desc ( file, window, object, out_desc );返回guimap文件里对象的物理描述

    80、GUI_buf_get_desc_attr ( file, window, object, property, out_prop_value ); 返回guimap文件里对象的属性的值

    81、GUI_buf_get_logical_name ( file, physical_desc, window, out_name ); 返回guimap文件里对象的逻辑名称

    82、GUI_buf_new ( file );创建新的gui对象文件

    83、GUI_buf_set_desc_attr ( file, window, object, property, value );设置guimap文件里对象的属性的值

    84、GUI_close ( file );关闭guimap文件

    85、GUI_close_all ();关闭全部guimap文件

    86、GUI_delete ( file, window, obj  );从guimap文件里删除一个对象

    87、GUI_desc_compare ( desc_1, desc_2 );比较两个物理描述

    88、GUI_desc_get_attr ( physical_desc, property, out_attr_value );从物理描述得到属性的值

    89、GUI_desc_set_attr ( physical_desc, property, value );设置属性的值

    90、GUI_get_name ( out_name, out_version );返回测试程序下gui对象的类型

    91、GUI_get_window ( );在guimap里返回当前窗口

    92、GUI_list_buf_windows ( file, out_windows, out_number );列举出guimap文件里所有的窗口

    93、GUI_list_buffers ( out_files, out_number );列举所有打开的guimap文件

    94、GUI_list_desc_attrs ( physical_desc, out_array );列举一个gui对象的属性值

    95、GUI_list_map_buffers ( out_file, out_number );列举所有载入的guimap文件

    96、GUI_list_win_objects ( file, window, out_objects, out_number );列举一个窗口的全部对象

    97、GUI_load ( file_name );载入一个guimap文件

    98、GUI_map_get_desc ( window, object, out_desc, out_file );返回guimap里对象的物理描述

    99、GUI_map_get_logical_name ( physical_desc, window, out_obj, out_file );返回guimap里对象的逻辑名称

    100、GUI_open ( file_name );打开guimap文件
     
  • Selenium 学习----初涉

    iccer 发布于 2007-01-08 16:36:20

    About Selenium:

    优势:

    1. 记录测试过程中,所见 即是所得,selenium 的所有内部程序都是用Javascipt编写的。

    [Javascrīpt: 由Netscape Communications 和Sun Micorsystems公司共同开发的一种描述语言,与Java 的关系比较松散。Javascrīpt 能为Web页添加基本的联机应用程序和功能,但它不是一种真正的面向对象语言。

    它的工作特点是,当client端发出一个JS的请求时,它不必从web server下载,而直接由浏览器做出响应。]

    2. 支持多种操作系统,如windows, Mac, Linux,也支持多种浏览器,如IE,Firefox, Mozilla.

    若使用Selenium IDE进行web 自动记录测试用例录制,只能是在Firefox (笔者还没试过Mozilla,嘿嘿)是先录制好脚本,再在其它浏览器执行测试用例,进行测试。

    3. 执行两种开发脚本,test runner,需要安装Selenium Core,执行的文件为.HTML后缀名。另一种是driven(脚本语言编写),支持多种语言:JAVA,.NET, Perl, Python, Ruby.(在下用的是ruby, 没办法,谁叫它既简洁又明了呢!^ ^)

    劣势:

    较难处理逻辑关系强的业务测试。

     

    Selenium 实质:

      通过HTTP协议,发送请求来完成测试用例的。

    Selenium 命令:只有两种

    1. 操作(action):用于模拟用户与web的交互。

    2. 断言(assertion):验证一个命令的预期结果。(类似于watir^ ^)

     

    Selenium 的组成:

    Selenium IDE: firefox 的 plug-in。 是浏览器的工具,不能安装在IE上。

    Selenium Core:纯粹由Javascrīpt组成的,有assertion机制的test suit runnner.

    Selenium Remote Control:

    一个代理与控制端, 可代替Selenium core 和IDE 的client端。

    下载地址:http://www.openqa.org/

     

    一个使用Selenium IDE的测试例子脚本:

    class NewTest
      def test_foo
        open "/intl/zh-CN/"
        assertTitle "Google"
        type "q", "selenium"
        clickAndWait "btnG"
        assertTitle "selenium - Google 搜索"
        clickAndWait "link=高级搜索"
        assertTitle "Google 高级搜索"
        type "as_epq", "iccer"
        select "lr", "label=简体中文"
        clickAndWait "btnG"
        assertTitle "selenium "iccer" - Google 搜索"
        click "link=测试| 软件测试| 软件缺陷跟踪| 软件配置工具| 测试用例设计| Web测试 ..."
      end
    end

    将脚本拷下,存为.HTML文档,再在firefox的selenium IDE工作中打开,执行就OK了。(执行不了就多试几次吧。^ ^)

    迟点要添加用selenium core的例子。

    欢迎大家多指教交流!!        ^ ^

     

  • 模板的应用

    ghx 发布于 2007-03-27 15:05:31

    新建一个文本,输入一些新建Action时常包含的信息,然后保存为ActionTemplate.MST文件,
     并复制到QTP/dat目录下;这样每次新建action都会包含固定的信息了;
    例如:
    '-------------------脚本说明---------------
    '产品版本:      __Build(  )
    '测试员:
    '编写日期:
    '测试功能:
    '脚本类型:
    '被测试对象初始状态:
    '进展程度:
    '基本思路:
    '主要功能函数:
    '历史修改:
    '没解决的问题:
    '--------------------脚本内容-------------

    当然了,脚本的说明内容可以随意修改,但必须保存到dat目录下,并且文件的名字为:ActionTemplate.MST

221/212>
Open Toolbar