努力实现自己的奋斗目标!

发布新日志

  • 软件测试工作流程图解析

    2013-08-28 17:55:49

     

    2012-02-21 21:30:00|  分类: 测试 |  标签: |字号 订阅

    1、目前流行的软件测试流程方法有很多种,如瀑布模型、螺旋模型、RUP模型、IPD流程等,不同的过程模型适合于不同类型的项目。

      2、测试工作流程图:

      3、需求阶段流程图

      4、单元/集成测试阶段流程图

      5、系统测试阶段流程图

      6、压力测试流程图(说明:压力测试为模拟用户正常使用时,系统正常工作的最小时间)

      7、性能测试流程图(说明:测试系统的崩溃极限(最多使用人数和数据库的极限容量))

  • 做好性能测试需要了解的知识汇总

    2013-08-28 17:54:44

    2012-02-21 21:33:38|  分类: LoadRunner |  标签: |字号 订阅

     性能测试

      1. 如何理解TPS?

      2. 如何理解线程调用?

      3. 如何理解响应时间?

      4. 如何理解性能建模?(可分类回答)

      5. 如何理解响应时间、TPS曲线和用户之间的关系?

      6. 在LoadRunner中为什么要设置思考时间和pacing?

      应用服务器

      1. 如何理解J2EE的系统架构?

      2. 如何理解J2EE应用服务器的容器?

      3. 如何理解内存泄露?如何定位JAVA类的应用的内存泄露?如何定位C语言编写的应用的内存泄露?

      4. 如果用纯JAVA的应用调用J2EE应用服务器的容器资源会出现什么结果?需要如何维护容器资源?(说明原理即可)

      5. 如何定位JAVA的方法调用消耗的时间?(不通过在源代码中加时间戳的方式)?

      6. 如何定位C语言中的函数调用消耗的时间?

      7. 如何监控J2EE应用服务器?(可以用一个具体的应用服务器做例子)

      数据库

      1. 如何理解数据库架构?(可以用一个数据库做例子)

      2. SQL语句在数据库中的执行分成几步,每一步都做什么?(可以用一个数据库做例子)

      3. 如何跟踪SQL的执行时间和内存的消耗?(可以用一个数据库做例子)

      4. 如何监控数据库?监控能得到什么数据?(可以用一个数据库做例子)

      5. 如何定位死锁问题?如何定位热块问题?如何监控日志切换?(可以用一个数据库做例子)

      6. 有几种手段可以改变执行计划?(可以用一个数据库做例子)

      操作系统

      1. 如何判断CPU、内存、磁盘的瓶颈?

      2. 如何理解CPU、内存、磁盘之间的关系?

      3. 如何理解paging in/paging out?

      4. 如何监控操作系统的资源?(可以用一个操作系统做例子)

      5. 如何理解内存管理和线程调度?(可以用一个操作系统做例子)

      6. 如何理解CSwitch?(可以用一个操作系统做例子)

      7. 如何理解磁盘IO?(可以用一个操作系统做例子)

      网络

      1. 如何定位数据包的传输在网络上消耗的时间?

      2. 如何理解纯路由和NAT的区别?

      性能测试工具

      1. 解释LoadRunner的工作原理。

      2. 如何理解LoadRunner里的关联?

      3. 如何理解性能压力工具?

      4. 如何理解虚拟用户?(可以用一个工具做例子)

      5. 如果理解业务到脚本的转化?(可以用一个工具做例子)

      6. 如何做到业务统计数据到场景的转化?(可以用一个工具做例子)

  • 性能测试兵法

    2013-08-28 17:52:39

    作者:吴老师   发布时间:2012-02-18  浏览次数:164 次

    本文转载与互联网

    在大多数的性能测试工作中,我们可以看出很多内容都是互相关联的。这就给我们提供了一个思路:性能测试的很多内容可以经过一定的组织统一来进行。统一开展性能测试的巨大好处是可以由浅入深按照层次对系统进行测试,进而减少不必要的工作量,以实现节约测试成本的目的。为此,本文提出了“全面性能测试模型”的概念。

      “全面性能测试模型”提出的主要依据就是一种类型的性能测试可以在某些条件下转化成为另外一种类型的性能测试,而这些类型的测试实施也是很类似的。例如:针对一个网站进行测试,模拟10到50个用户就是在进行常规性能测试,用户增加到1000乃至上万就变成了压力/负载测试。如果同时对系统进行大量的数据查询操作,就包含了强度测试。

    1 全面性能测试模型

      在“全面性能测试模型”中,把Web性能测试分为八个类别。下面首先介绍八个性能测试类别的主要内容。

      (1)预期指标的性能测试:系统在需求分析和设计阶段都会提出一些性能指标,这些指标是性能测试要完成的首要工作之一,本模型把预先确定的一些性能指标的测试称为预期指标的性能测试。

      这些指标主要是指诸如“系统可以支持并发用户1000”、“系统响应时间不得高于10秒”等在产品说明书等文档中中十分明确的内容,对这种预先承诺的性能要求,测试小组应该“首当其冲”完成这类测试。

      (2)独立业务性能测试:独立业务主要是指一些核心业务模块,这些模块通常具有功能比较复杂、使用比较频繁、属于核心业务等特点。这类特殊的、功能比较独立的业务模块始终都是性能测试重点。我们通常不但要测试这类模块的一些和性能相关的算法,还要测试这类模块对并发用户的响应情况。

      核心业务模块在需求阶段就可以确定,在系统测试阶段开始单独测试其性能。如果是系统类软件或者特殊应用的软件,通常从单元测试阶段就开始进行测试,在后继的集成测试、系统测试、验收测试中进一步进行测试,以保证核心业务模块的性能稳定。

      用户并发测试是核心业务模块的重点测试内容,“并发”的主要内容是模拟一定数量的用户同时使用某一核心模块的“相同”或者“不同”的功能,并且持续一段时间。对“相同”的功能进行并发测试分为两种类型,一类是在同一时刻进行完全一样的操作,例如打开同一条数据记录进行查看;另外一类是在同一时刻使用完全一样的功能,例如同时提交数据进行保存。可以看出后者是包含前前者的,后者是前者的特例,这种并发测试都要持续一定的时间。

      从微观角度讲,同时使用某一核心模块“不同”的功能,也是一种组合业务性能测试,只不过这种组合的相关业务大分类是一致的。

      (3)组合业务性能测试:通常不会所有的用户只使用一个或者几个核心业务模块,每个功能模块都可能被使用到,所以Web性能测试既要模拟多用户的“相同”操作(这里的“相同”指很多用户使用同一功能),又要模拟多用户的“不同”操作(这里的“不同”指很多用户同时对一个或者多个模块的不同功能进行操作),对多个业务进行组合性能测试。组合业务测试是最接近用户实际使用情况的测试,因而是性能测试的核心内容。我们通常按照用户的实际使用情况来模拟使用各个模板的人数比例。

      由于组合业务测试是最反映用户使用系统情况的测试,因而组合测试往往和服务器(操作系统、Web服务器、数据库服务器)性能测试结合起来,在通过工具模拟用户行为的同时,还通过测试工具的监控功能采集服务器的计数器信息,进而全面分析系统的瓶颈,为改进系统提供有利的依据。

      用户并发测试是组合业务测试的核心内容。“组合”并发的突出特点是分成不同的用户组进行并发,每组的用户比例要根据实际情况来进行匹配。组合业务测试可以理解为包含了“核心业务模块并发”和“非核心业务模块并发”同时进行的并发用户测试。

      (4)疲劳强度性能测试:疲劳强度测试是在系统稳定运行下模拟较大的用户数量、并长时间运行系统的测试,通过综合分析执行指标和资源监控来确定系统处理最大业务量时的性能,主要目的是为了测试系统的稳定性。

      (5)大数据量性能测试:大数据量测试分为两种:一种是针对某些系统存储、传输、统计查询等业务进行大数据量的测试,主要是测试数据增多时的性能情况,这类一般都是针对某些特殊的核心业务或者一些日常比较常用的组合业务的测试。

      第二种是极限状态下的数据测试,主要是指系统数据量达到一定程度时,通过性能测试来评估系统的响应情况,测试的对象也是某些核心业务或者日常常用的组合业务。例如系统的数据每年只备份转移一次,可分别选择一个季度、半年、一年作为参考,模拟输入各个时间段的预计数据量,然后测试系统的性能,进而预估系统的性能走向。

      由于大数据量仍然是为了测试系统的业务处理能力,因此大数据量性能测试可以独立进行,也可以和前面的独立、组合业务测试结合起来进行,主要由性能测试策略来决定。由于大数据量测试一般在投产环境进行,因此把它单独独立出来,和疲劳强度测试放在一起,在整个性能测试的后期进行。大数据量测试可以理解为特定条件下的核心业务或者组合业务测试。

      (6)网络性能测试:网络性能测试主要是为了准确展示带宽、延迟、负载和端口的变化是如何影响用户的响应时间的。在实际的软件项目中,主要是测试应用系统的用户数目与网络带宽的关系。

      (7)服务器性能测试(操作系统、Web服务器、数据库服务器):服务器性能测试分为初级和高级两种形式。“初级服务器性能测试”主要是指在业务系统工作或者进行前面其它种类性能测试的时候,监控服务器的一些计数器信息,通过这些数据对服务器进行综合性能分析,找出系统瓶颈,为调优或者提高性能提供依据。“高级服务器性能测试”一般不由测试人员进行,由专门的系统管理员来进行,例如数据库服务器由专门的DBA来进行测试和调优。本文主要讨论在测试中常用到的“初级服务器性能测试”,既通过工具对服务器资源进行监控的性能测试。

      (8)一些特殊测试:主要是指配置测试、内存泄漏测试一些特殊的Web性能测试。这类性能测试或者和前面的测试结合起来进行,或者在一些特殊情况下会独立进行,本文重点来讨论前一种情况,因为后一种情况往往通过特有的工具、较大投入的进行,可以不作为性能测试的范畴来研究。

    2性能测试通用策略

    2.1性能测试策略通用方法

      本节主要介绍一下通用的性能测试策略制定方法。性能测试策略一般从需求设计阶段开始讨论制定,策略的内容决定着性能测试工作投入多少资源、什么时间开始实施等后继工作如何安排。其制定的主要依据是“软件自身特点”和“用户对性能的关注程度”两个因素,其中软件的自身特点起决定作用。

      软件按照用途的不同分为两大类:系统类软件和应用类软件。系统类软件对性能一般要求比较高,因此性能测试应该尽早介入。应用类软件分为特殊类应用和一般类应用,特殊类应用主要指银行、电信、电力、保险、医疗、安全等领域类的软件,这类软件使用比较频繁,用户较多,一般也要较早进行性能测试;一般类应用主要指一些普通应用,例如办公自动化软件、MIS系统等,一般应用类软件多根据实际情况决定性能测试策略,比如OA系统,可以早开始、也可以最后进行性能测试,这类软件受用户因素影响比较大。

      用户一般可以分为四类:即对性能特别关注、中等重视、一般关注、不怎么关注四类。这里这么划分并不意味着用户不关注性能测试人员就可以忽略性能测试。不过,用户如果特别关注性能,测试人员也应该特别重视性能测试。表1列出了性能测试策略制定的基本原则。(注意:这里的用户是广义范围的用户,包括所有和我们的产品有利害关系的群体。因而不单单指最终使用产品的用户,这些用户既可以是为我们提出需求的产品部,也可以是公司的董事会,甚至是我们研发人员自己。)

      软件的特点决定性能测试策略另外一个重要原因就是“一般应用类软件”通常耗费资源较少,因此可以通过提高硬件配置,进而改善运行环境来提高“一般应用类软件”的性能。从硬件方面解决性能问题往往更容易做到,同时可以降低我们的开发成本,不过也不能过分让用户进行较大的硬件投入,否则会降低我们的“客户满意度”。我们调整性能最好的办法还是软硬件相结合。

      用户对待系统性能的态度影响性能测试策略,但不起决定作用的根本原因是我们最终要把产品交付给用户来使用,而不是做出来给用户欣赏。因此不管用户是否重视性能测试,即使根本不关心,对于性能要求高的软件产品我们都应该按照测试上面的策略进行合理的安排。同时,如果我们的上帝——用户如果特别重视,这意味着我们需要进行更多的性能测试方面的投入,因为我们有义务使我们的用户满意。

    3 Web性能测试模型使用方法

      “全面性能测试模型”是针对Web性能测试而提出的一种方法,主要目的是为了比较全面的开展性能测试,使Web性能测试更容易组织和开展。本模型包含了测试策略制定的通用方法和测试用例设计通用方案,测试用例的设计覆盖了应用软件、服务器、操作系统多方面的内容,按照由浅入深的顺利对性能测试进行了合理的组织。

      “全面性能测试模型”是一种经很多性能测试项目抽象出来的方法论,主要用来指导测试,它一般不适合具体的性能测试项目,因为任何一个项目都会有它的特定背景。要想通过“Web全面性能测试模型”做好性能测试工作,首先要制定好性能测试策略,同时还要按照一些基本指导原则来使用“Web性能测试用例设计模型”的内容。这些原则主要包括如下的内容:

      测试策略遵从最低成本原则。Web性能测试本身是一种高投入的测试,而实际中国内公司通常在测试上进行较低的投入,Web性能测试只是全部测试工作的一部分,很多项目只能进行一些重要的性能内容,这就决定测试经理制定性能测试策略时在资源投入方面一定要遵从最低成本化原则。最低成本的衡量标准主要指“投入的测试成本能否使系统满足预先确定的性能测试目标”,只要我们经过反复的“测试——系统调优——测试”后,系统符合性能需求并有一定的扩展空间,就可以认为性能测试工作是成功的。反之,如果系统经过测试后不满足性能需求或者满足性能需求后仍然投入资源,都可以认为是不合理的。

      策略为中心原则。本原则不但对性能测试工作有效,对其他类型的测试工作都具有同样的指导意义。测试策略不但决定了我们测试用例设计时的主要内容,还决定着我们实施测试工作时如何根据项目的实际情况进行处理,例如:如果项目时间比较紧张,我们完全可以按照测试用例的优先级只执行一部分性能测试用例。因此,性能测试策略应该贯穿整个性能测试过程。

      适当裁剪原则。裁剪原则主要是针对性能用例设计而言。Web性能测试用例设计模型主要是针对电信、银行级的应用而提出的,包含的测试内容比较全面,而这类项目的性能测试一般周期较长、投入较大,作者曾亲身经历过测试周期为一年的银行项目。要想性能测试用例设计模型在大多数测试项目中使用,必须对测试用例模型包含的内容进行合理的裁剪,这样做的主要目的是为了适合特定项目的测试需求,进而节约测试成本。

      裁减的主要依据是性能测试策略,我们根据策略制定方法制定出测试策略,然后依据策略从“五类性能测试用例”中选择适当的内容来编写测试用例。例如有些要求不高的静态门户网站,用户也没有提出性能方面的要求,我们完全可以只测试一下用户并发情况作为系统性能的参考。

      完善模型原则。本模型只是作者的工作经验总结,由于不同的性能测试任务都有自己的项目背景,因而需要对模型内容进行不断的调整、补充、完善,才能使之适合更多的性能测试工作。不断完善具体来说就是要在工作中不断总结自己的经验,形成自己的“Web全面性能测试模型”。只有“自己的”测试模型,才是最符合自己需要的模型。

      模型具体化原则。模型具体化主要是指把本模型运用到具体的项目中,是前面所有原则的目标。如果只记住模型的这些条条框框,然后生搬硬套框架来设计测试,只能得到适得其反的结果。要想使模型在Web性能工作中发挥作用,只有根据实际项目的特点制定合理的性能测试策略、编写适当的性能测试用例,并在测试实施中灵活的执行测试方案。

      综合上面的分析,可以看出模型使用完全可以概括成两个字——“活用”。要想真正做好性能测试工作,最有效的办法就是在掌握基本理论和方法后,在工作中不断的去探索和总结,不断的完善该模型,形成自己的“Web全面性能测试模型”。

      “全面性能测试模型”是一种很有效的做Web性能测试的“兵法”,这正是本篇命名为“兵法篇”的目的。“兵法”是“将帅”们“打仗”的必备知识,学会了兵法才可以指挥战争,但是兵法毕竟不能代替具体的“战术”,它只是“打胜仗”的前提条件,具体的“仗”怎么去“打”,仍然要根据具体的战场情况来指挥。因此,具体的Web性能测试工作仍然按照项目的自身特点去组织和实施。

  • 路由器六大测试详解

    2013-08-28 17:51:35

    作者:吴老师   发布时间:2012-02-18  浏览次数:128 次

     

     

           路由器是IP网络的核心设备,其性能的好坏直接影响IP网网络规模、网络稳定性以及网络可扩展性。路由器区别于一般简单的网络互连设备,在性能测试时还应该加上路由器特有的性能测试。路由器在计算机网络中有着举足轻重的地位,是计算机网络的桥梁。通过它不仅可以连通不同的网络,还能选择数据传送的路径,并能阻隔非法的访问。 路由器的配置对初学者来说,并不是件十分容易的事。  (一)功能测试

      路由器功能通常可以划分为如下方面。

      (1)接口功能:该功能用作将路由器连接到网络。可以分为局域网接口及广域网接口两种。局域网接口主要包括以太网、令牌环、令牌总线、FDDI等网络接口。广域网接口主要包括E1/T1、E3/T3、DS3、通用串行口(可转换成X.21DTE/DCE、V.35DTE/DCE、RS232DTE/DCE、RS449DTE/DCE、EIA530DTE)等网络接口。(2)通信协议功能:该功能负责处理通信协议,可以包括TCP/IP、PPP、X.25、帧中继等协议。(3)数据包转发功能:该功能主要负责按照路由表内容在各端口(包括逻辑端口)间转发数据包并且改写链路层数据包头信息。(4)路由信息维护功能:该功能负责运行路由协议,维护路由表。路由协议可包括RIP、OSPF、BGP等协议。(5)管理控制功能:路由器管理控制功能包括五个功能,SNMP代理功能,Telnet服务器功能,本地管理、远端监控和RMON功能。通过多种不同的途径对路由器进行控制管理,并且允许纪录日志。(6)安全功能:用于完成数据包过滤,地址转换,访问控制,数据加密,防火墙,地址分配等功能。

      路由器对上述功能并非必要完全实现。但是由于路由器作为网络设备,存在最小功能集,对最小功能集所规定的功能,路由器必须支持。因为绝大多数功能测试可以由接口测试、性能测试、协议一致性测试和网管测试所函盖,所以路由器功能测试一般可以只对其他测试无法涵盖的功能作验证性测试。路由器功能测试一般采用远端测试法。 
      (二)性能测试 路由器是IP网络的核心设备,其性能的好坏直接影响IP网网络规模、网络稳定性以及网络可扩展性。由于IETF没有对路由器性能测试作专门规定,一般来说只能按照RFC2544( Benchmarking Methodology for Network Interconnect Devices)作测试。但路由器区别于一般简单的网络互连设备,在性能测试时还应该加上路由器特有的性能测试。例如路由表容量、路由协议收敛时间等指标。

    路由器性能测试应当包括下列指标。


      (1)吞吐量:测试路由器包转发的能力。通常指路由器在不丢包条件下每秒转发包的极限,一般可以采用二分法查找该极限点。(2)时延:测试路由器在吞吐量范围内从收到包到转发出该包的时间间隔。时延测试应当重复20次然后取其平均值。(3)丢包率:测试路由器在不同负荷下丢弃包占收到包的比例。不同负荷通常指从吞吐量测试到线速(线路上传输包的最高速率),步长一般使用线速的10%。(4)背靠背帧数:测试路由器在接收到以最小包间隔传输时不丢包条件下所能处理的最大包数。该测试实际考验路由器缓存能力,如果路由器具备线速能力(吞吐量=接口媒体线速),则该测试没有意义。(5)系统恢复时间:测试路由器在过载后恢复正常工作的时间。测试方法可以采用向路由器端口发送吞吐量110%和线速间的较小值,持续60秒后将速率下降到50%的时刻到最后一个丢包的时间间隔。如果路由器具备线速能力,则该测试没有意义。(6)系统复位:测试路由器从软件复位或关电重启到正常工作的时间间隔。正常工作指能以吞吐量转发数据。

      在测试上述RFC2544中规定的指标时应当考虑下列因素。
      帧格式:建议按照RFC2544所规定的帧格式测试;帧长:从最小帧长到MTU顺序递增,例如在以太网上采用64, 128, 256, 512, 1024, 1280, 1518字节;认证接收帧:排除收到的非测试帧,例如控制帧、路由更新帧等;广播帧:验证广播帧对路由器性能的影响,上述测试后在测试帧中夹杂1%广播帧再测试;管理帧:验证管理帧对路由器性能的影响,上述测试后在测试帧中夹杂每秒一个管理帧再测试;路由更新:路由更新即下一跳端口改变对性能的影响;过滤器:在设置过滤器条件下对路由器性能的影响,建议设置25个过滤条件测试;协议地址:测试路由器收到随机处于256个网络中的地址时对性能的影响;双向流量:测试路由器端口双向收发数据对性能的影响;多端口测试:考虑流量全连接分布或非全连接分布对性能的影响;多协议测试:考虑路由器同时处理多种协议对性能的影响;混合包长:除测试所建议的递增包长外,检查混合包长对路由器性能的影响,RFC2544除要求包含所有测试包长外没有对混合包长中各包长所占比例作规定。笔者建议按照实际网络中各包长的分布测试,例如在没有特殊应用要求时以太网接口上可采用60字节包50%,128字节包10%,256字节包15%,512字节包10%,1500字节包15%。除上述RFC2544建议的测试项外还建议测试如下内容。  

        ①路由震荡:路由震荡对路由器转发能力的影响。路由震荡程度即每秒更新路由的数量可以依据网络条件而定。路由更新协议可采用BGP。②路由表容量:测试路由表大小。骨干网路由器通常运行BGP,路由表包含全球路由。一般来说要求超过10万条路由,建议通过采用BGP输入导出路由计数来测试。③时钟同步:在包含相应端口例如POS口的路由器上测试内钟精度以及同步能力。④协议收敛时间:测试路由变化通知到全网所用时间。该指标虽然与路由器单机性能有关,但是一般只能在网络上测试,而且会因配置改变而变化。可以在网络配置完成后通过检查该指标来衡量全网性能。测试时间应当根据具体项目以及测试目标而定。一般认为测试时间应当介于60秒到300秒之间。另外一般可以根据用户要求和测试目标作设定选择。路由器性能测试一般可采用远端测试法。

  • 利用LoadRunner进行http接口功能自动化测试

    2013-08-28 17:50:22

      

    2012-03-12 19:31:12|  分类: LoadRunner |  标签: |字号 订阅

    利用LoadRunner进行http接口功能自动化测试

    作者:吴老师  发布时间:2012-01-08  浏览次数:67 次

    需要取得的输入应预先制作了CSV文件,关在脚本参数配置中定义变量。
      自动化测试程序关键代码
      1、生成结果文件(html格式),文件名称为 test _系统时间(%Y%m%d%H%M%S)_虚拟用户编号,并写入测试结果文件的html开始标识
      CODE:
      //定义结果文件变量
      long file;
      //定义文件名种子(虚拟用户编号)变量
      char *vusernum;
      //定义测试结果变量
      char V_Result[1024];
      vuser_init()
      {
      //取得文件名种子(虚拟用户编号)
      vusernum=lr_eval_string ("_{vuserid}");
      //取得文件种子(系统时间)
      lr_save_datetime("%Y%m%d%H%M%S", DATE_NOW, "now_date");
      //拼结测试结果文件名称
      strcpy(V_Result,"d://test/Result/test");
      strcat(V_Result,lr_eval_string("_{now_date}"));
      strcat(V_Result,vusernum);
      strcat(V_Result,".html");
      //生成并打开测试结果文件
      file=fopen(V_Result,"at+");
      //写入测试文件头部html信息
      strcpy(V_Result,"<html><table  border='1'><tr>< td>IMSI号码</td><td>预期值</td><td>返回值< /td><td>结果</td></tr>");
      fputs(V_Result,file);
      return 0;
      }2、从参数化文件读取测试参数和预期结果、发送请求并获得服务器返回实际结果,比较测试结果后写入测试结果文件。
      CODE:
      Action()
      {
      //测试结果文本
      char V_testres[1024];
      //定义返回结果是否正确变量
      int result;
      //取得IMSI号码
      char *V_imsi=lr_eval_string ("{IMSI}");
      //设置页面接收最大的字节数,该设置应大于服务器返回内容的大小
      web_set_max_html_param_len("20000");
      //取得服务器返回内容
      web_reg_save_param("filecontent",
      "LB=",
      "RB=",
      "Search=Body",
      LAST);
      //发送请求
      web_submit_data("login",
      "Action=http://host:port/autonavit/search?cmd=clientlogin&termver=5&termcode=30001&termdbver=3 ",
      "Method=POST",
      "RecContentType=text/html",
      "Referer=",
      "Snapshot=t9.inf",
      "Mode=HTTP",
      ITEMDATA,
      "Name=imsi", "Value={IMSI}", ENDITEM,
      LAST);
      //比较预期值和实际值是否相等
      result=strcmp(lr_eval_string("{YQJG}"),lr_eval_string("{filecontent}"));
      if ( result == 0 )
      {
      strcpy(V_testres,"通过");
      }
      else
      {
      strcpy(V_testres,"失败");
      }
      strcpy(V_Result,"<tr><td>");
      //写入测试参数
      strcat(V_Result,V_imsi);
      strcat(V_Result,"</td>");
      strcat(V_Result,"<td id='yq'>");
      //写入预期结果
      strcat(V_Result,lr_eval_string("{YQJG}"));
      strcat(V_Result,"</td>");
      strcat(V_Result,"<td id='sj'>");
      //写入实际结果
      strcat(V_Result,lr_eval_string("{filecontent}"));
      strcat(V_Result,"</td>");
      strcat(V_Result,"<td>");
      //写入测试是否通过
      strcat(V_Result, V_testres);
      strcat(V_Result,"</td></tr>");
      fputs(V_Result,file);
      return 0;
      }3、写入测试结果文件尾部html信息,关闭文件并结束测试。
      CODE:
      vuser_end()
      {
      //结束并关闭文件
      strcpy(V_Result,"</table></html>");
      fputs(V_Result,file);
      fclose(file);
      return 0;
      }

  • 网络七层协议的形象说明

    2013-08-28 17:47:36

    第一层,物理层 
    OSI
    模型最低层的劳苦大众。它透明地传输比特流,就是传输的信号。该层上的设备包括集线器、发送器、接收器、电缆、连接器和中继器。

    第二层,数据链路层
    这一层是和包结构和字段打交道的和事佬。一方面接收来自网络层(第三层)的数据帧并为物理层封装这些帧;另一方面数据链路层把来自物理层的原始数据比特封装到网络层的帧中。起着重要的中介作用。
    数据链路层由IEEE802规划改进为包含两个子层:介质访问控制(MAC)和逻辑链路控制(LLC)。
    智能集线器、网桥和网络接口卡(NIC)等就驻扎在这一层。但是网络接口卡它同样具有物理层的一些编码功能等。

    第三层,网络层
    这一层干的事就比较多了。它工作对象,概括的说就是:电路、数据包和信息交换。
    网络层确定把数据包传送到其目的地的路径。就是把逻辑网络地址转换为物理地址。如果数据包太大不能通过路径中的一条链路送到目的地,那么网络层的任务就是把这些包分成较小的包。
    这些光荣的任务就派给了路由器、网桥路由器和网关。
    以后几层属于较高层,通常驻留在跨网络相互通信的计算机中,而不象以上几层可以独自为阵。设备中只有网关可跨越所有各层。

    第四层,传输层。
    确保按顺序无错的发送数据包。传输层把来自会话层的大量消息分成易于管理的包以便向网络发送。

    第五层,会话层。
    在分开的计算机上的两种应用程序之间建立一种虚拟链接,这种虚拟链接称为会话(session)。会话层通过在数据流中设置检查点而保持应用程序之间的同步。允许应用程序进行通信的名称识别和安全性的工作就由会话层完成。

    第六层,表示层。
    定义由应用程序用来交换数据的格式。在这种意义上,表示层也称为转换器(translator)。该层负责协议转换、数据编码和数据压缩。转发程序在该层进行服务操作。

    第七层,应用层,该层是OSI模型的最高层。应用层向应用进程展示所有的网络服务。当一个应用进程访问网络时,通过该层执行所有的动作。
    纵观七层,从低级到高级。作一个形象的比喻就是从汇编到了BASIC,越到高层与硬件的关联就越弱。

    所谓的网络七层协议就是OSI模型,具体分为:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。

    7——应用层
    6——
    表示层
    5——
    会话层
    4——
    传输层
    3——
    网络层
    2——
    数据链路层
    1——
    物理层


    物理介质
    七层模型在Windows程序下的体现:
    物理层----就是我们看得见的网卡。网卡的作用就是把线路发送过来的高频电流转化数据包,然后传给网卡驱动程序,同是也把网卡驱动程序传送过来的数据包转化成电信号传送出去。定义通过网络设备发送数据的物理方式:是网络媒介和设备间的接口。
    数据链路层----是网卡驱动程序。定义控制通信连接的程序;封包;监测和改正包传输错误。
    网络层----NDISNDIS提供网络接口。决定网络设备间如何传输数据;根据唯一的网络设备地址选择包;提供流和拥塞控制,以阻止同时网络资源的损耗。
    传输层----TCPTCP协议的封包处理是在这一层进行的。管理网络中首尾连接的信息传送;提供通过错误恢复和流控制装置传送可靠且有序的包;提供无连接面向包的传送。
    会话层----SPISPI是服务提供者接口,管理用户间的会话和对话;控制用户间的连接和挂断连接;报告上层错误。
    表示层----API,它为应用程序提供接口。API负责SPI与应用程序之间的通信;定义不同体系间不同数据格式;具体说明独立结构的数据传输格式;编码和解码数据;加密和解密数据;压缩和解压缩数据。
    应用层----EXE,就是大家常见的应用程序。定义用于网络通信和数据传输的用户接口程序;提供标准服务,比如虚拟终端、文档以及任务的传输和操作。
    七层协议与Windows结构的生产力映射如下:
    7 
    应用层 7 应用程序(exe
    6 
    表示层 6 Winsock API dll
    5 
    会话层 5 SPIdll
    4 
    传输层 4 TDIvxdsys
    3 
    网络层 3 NDISvxdsys
    2 
    数据链路层 2 网卡驱动程序(vxdsys
    1 
    物理层 1 网卡

  • 交互设计和视觉设计的区别

    2013-08-28 17:46:21

     

    2012-07-12 16:24:09|  分类: 设计 |  标签: |字号 订阅

    1.交互设计和视觉设计的目的

    交互设计和视觉设计的目的其实都是一样的,他们都是为了给用户带来愉快感。具有良好交互设计的网站,能让用户使用起来感觉很顺畅,很方便,这就是给用户来带愉快感。而好的视觉设计能传达一种感情给用户,让用户能够享受这种感情或者达到某种共鸣,这也给用户带来了愉快感。当一种产生愉快感不足时,可以用另一种愉快感弥补,ag_udsx但你很难说哪种愉快感一定超越另一种,具体的情况还是要看网站的性质。如是工具性质的强交互类的网站,这时交互设计会比视觉设计对用户影响更大些。反过来,一些视觉展示和体验类的网站通常视觉效果对用户影响更大,这时视觉设计会更重要些。

    2.交互设计和视觉设计发展阶段不同

    目前,交互设计是比较新兴的一个职业,从事这方面的人还不是很多,企业也渐渐发现它的重要性。相比竞争比较激烈接近饱和的视觉设计,交互设计目前的待遇可能会比视觉设计高些。但这并不表明交互设计的重要性超过视觉设计,只是说明交互设计这个职务的竞争还处在粥多僧少的阶段。

    3.交互设计的投入产出比更容易衡量

    对于企业来说它关心的无非两件事:一是降低成本,二是提高利润,实际上就是个投入和产出比。相比之下,交互设计比视觉设计的投入和产出比更易衡量。做好交互设计能够为企业带来更多的利益。但这样的认识却忽略了一点,视觉设计往往是第一个传达给用户的体验,如果用户第一次访问一个网站,感觉在视觉上不舒服,他可能就不会再去深入了解这个网站,当然也没有后面的交互体验,而企业可能永远失去了这个用户。可是这样的情况很难去衡量,或者衡量的成本很高,无法量化视觉设计对与产品的贡献度自然就使得视觉设计在表述自己的作用时显得没有底气。但是它的重要性绝对不输给交互设计。

  • 性能调优攻略

    2013-08-28 17:44:59

    2012-10-31 21:46:52|  分类: LoadRunner |  标签: |字号 订阅

    在开始这篇文章之前,大家可以移步去看一下酷壳以前发表的《代码优化概要》,这篇文章基本上告诉你——要进行优化,先得找到性能瓶颈! 但是在讲如何定位系统性能瓶劲之前,请让我讲一下系统性能的定义和测试,因为没有这两件事,后面的定位和优化无从谈起。
    一、系统性能定义让我们先来说说如何什么是系统性能。这个定义非常关键,如果我们不清楚什么是系统性能,那么我们将无法定位之。我见过很多朋友会觉得这很容易,但是仔细一问,其实他们并没有一个比较系统的方法,所以,在这里我想告诉大家如何系统地来定位性能。 总体来说,系统性能就是两个事:
    • Throughput ,吞吐量。也就是每秒钟可以处理的请求数,任务数。
    • Latency, 系统延迟。也就是系统在处理一个请求或一个任务时的延迟。
    一般来说,一个系统的性能受到这两个条件的约束,缺一不可。比如,我的系统可以顶得住一百万的并发,但是系统的延迟是2分钟以上,那么,这个一百万的负载毫无意义。系统延迟很短,但是吞吐量很低,同样没有意义。所以,一个好的系统的性能测试必然受到这两个条件的同时作用。 有经验的朋友一定知道,这两个东西的一些关系:
    • Throughput越大,Latency会越差。因为请求量过大,系统太繁忙,所以响应速度自然会低。
    • Latency越好,能支持的Throughput就会越高。因为Latency短说明处理速度快,于是就可以处理更多的请求。
    二、系统性能测试经过上述的说明,我们知道要测试系统的性能,需要我们收集系统的Throughput和Latency这两个值。


    • 首先,需要定义Latency这个值,比如说,对于网站系统响应时间必需是5秒以内(对于某些实时系统可能需要定义的更短,比如5ms以内,这个更根据不同的业务来定义)
    • 其次,开发性能测试工具,一个工具用来制造高强度的Throughput,另一个工具用来测量Latency。对于第一个工具,你可以参考一下“十个免费的Web压力测试工具”,关于如何测量Latency,你可以在代码中测量,但是这样会影响程序的执行,而且只能测试到程序内部的Latency,真正的Latency是整个系统都算上,包括操作系统和网络的延时,你可以使用Wireshark来抓网络包来测量。这两个工具具体怎么做,这个还请大家自己思考去了。
    • 最后,开始性能测试。你需要不断地提升测试的Throughput,然后观察系统的负载情况,如果系统顶得住,那就观察Latency的值。这样,你就可以找到系统的最大负载,并且你可以知道系统的响应延时是多少。
    再多说一些,
    • 关于Latency,如果吞吐量很少,这个值估计会非常稳定,当吞吐量越来越大时,系统的Latency会出现非常剧烈的抖动,所以,我们在测量Latency的时候,我们需要注意到Latency的分布,也就是说,有百分之几的在我们允许的范围,有百分之几的超出了,有百分之几的完全不可接受。也许,平均下来的Latency达标了,但是其中仅有50%的达到了我们可接受的范围。那也没有意义。
    • 关于性能测试,我们还需要定义一个时间段。比如:在某个吞吐量上持续15分钟。因为当负载到达的时候,系统会变得不稳定,当过了一两分钟后,系统才会稳定。另外,也有可能是,你的系统在这个负载下前几分钟还表现正常,然后就不稳定了,甚至垮了。所以,需要这么一段时间。这个值,我们叫做峰值极限。
    • 性能测试还需要做Soak Test,也就是在某个吞吐量下,系统可以持续跑一周甚至更长。这个值,我们叫做系统的正常运行的负载极限。
    性能测试有很多很复要的东西,比如:burst test等。 这里不能一一详述,这里只说了一些和性能调优相关的东西。总之,性能测试是一细活和累活。
    三、定位性能瓶颈有了上面的铺垫,我们就可以测试到到系统的性能了,再调优之前,我们先来说说如何找到性能的瓶颈。我见过很多朋友会觉得这很容易,但是仔细一问,其实他们并没有一个比较系统的方法。
    3.1)查看操作系统负载首先,当我们系统有问题的时候,我们不要急于去调查我们代码,这个毫无意义。我们首要需要看的是操作系统的报告。看看操作系统的CPU利用率,看看内存使用率,看看操作系统的IO,还有网络的IO,网络链接数,等等。Windows下的perfmon是一个很不错的工具,Linux下也有很多相关的命令和工具,比如:SystemTapLatencyTOP,vmstat, sar, iostat, top, tcpdump等等 。通过观察这些数据,我们就可以知道我们的软件的性能基本上出在哪里。比如:
    1)先看CPU利用率,如果CPU利用率不高,但是系统的Throughput和Latency上不去了,这说明我们的程序并没有忙于计算,而是忙于别的一些事,比如IO。(另外,CPU的利用率还要看内核态的和用户态的,内核态的一上去了,整个系统的性能就下来了。而对于多核CPU来说,CPU 0 是相当关键的,如果CPU 0的负载高,那么会影响其它核的性能,因为CPU各核间是需要有调度的,这靠CPU0完成)
    2)然后,我们可以看一下IO大不大,IO和CPU一般是反着来的,CPU利用率高则IO不大,IO大则CPU就小。关于IO,我们要看三个事,一个是磁盘文件IO,一个是驱动程序的IO(如:网卡),一个是内存换页率。这三个事都会影响系统性能。
    3)然后,查看一下网络带宽使用情况,在Linux下,你可以使用iftop, iptraf, ntop, tcpdump这些命令来查看。或是用Wireshark来查看。
    4)如果CPU不高,IO不高,内存使用不高,网络带宽使用不高。但是系统的性能上不去。这说明你的程序有问题,比如,你的程序被阻塞了。可能是因为等那个锁,可能是因为等某个资源,或者是在切换上下文。
    通过了解操作系统的性能,我们才知道性能的问题,比如:带宽不够,内存不够,TCP缓冲区不够,等等,很多时候,不需要调整程序的,只需要调整一下硬件或操作系统的配置就可以了
    3.2)使用Profiler测试接下来,我们需要使用性能检测工具,也就是使用某个Profiler来差看一下我们程序的运行性能。如:Java的JProfiler/TPTP/CodePro Profiler,GNU的gprof,IBM的PurifyPlus,Intel的VTune,AMD的CodeAnalyst,还有Linux下的OProfile/perf,后面两个可以让你对你的代码优化到CPU的微指令级别,如果你关心CPU的L1/L2的缓存调优,那么你需要考虑一下使用VTune。 使用这些Profiler工具,可以让你程序中各个模块函数甚至指令的很多东西,如:运行的时间调用的次数CPU的利用率,等等。这些东西对我们来说非常有用。
    我们重点观察运行时间最多,调用次数最多的那些函数和指令。这里注意一下,对于调用次数多但是时间很短的函数,你可能只需要轻微优化一下,你的性能就上去了(比如:某函数一秒种被调用100万次,你想想如果你让这个函数提高0.01毫秒的时间 ,这会给你带来多大的性能)
    使用Profiler有个问题我们需要注意一下,因为Profiler会让你的程序运行的性能变低,像PurifyPlus这样的工具会在你的代码中插入很多代码,会导致你的程序运行效率变低,从而没发测试出在高吞吐量下的系统的性能,对此,一般有两个方法来定位系统瓶颈:
    1)在你的代码中自己做统计,使用微秒级的计时器和函数调用计算器,每隔10秒把统计log到文件中。
    2)分段注释你的代码块,让一些函数空转,做Hard Code的Mock,然后再测试一下系统的Throughput和Latency是否有质的变化,如果有,那么被注释的函数就是性能瓶颈,再在这个函数体内注释代码,直到找到最耗性能的语句。
    最后再说一点,对于性能测试,不同的Throughput会出现不同的测试结果,不同的测试数据也会有不同的测试结果。所以,用于性能测试的数据非常重要,性能测试中,我们需要观测试不同Throughput的结果
    四、常见的系统瓶颈下面这些东西是我所经历过的一些问题,也许并不全,也许并不对,大家可以补充指正,我纯属抛砖引玉。关于系统架构方面的性能调优,大家可移步看一下《由12306.cn谈谈网站性能技术》,关于Web方面的一些性能调优的东西,大家可以看看《Web开发中需要了解的东西》一文中的性能一章。我在这里就不再说设计和架构上的东西了。
    一般来说,性能优化也就是下面的几个策略:
    • 用空间换时间。各种cache如CPU L1/L2/RAM到硬盘,都是用空间来换时间的策略。这样策略基本上是把计算的过程一步一步的保存或缓存下来,这样就不用每次用的时候都要再计算一遍,比如数据缓冲,CDN,等。这样的策略还表现为冗余数据,比如数据镜象,负载均衡什么的。
    • 用时间换空间。有时候,少量的空间可能性能会更好,比如网络传输,如果有一些压缩数据的算法(如前些天说的“Huffman 编码压缩算法” 和 “rsync 的核心算法”),这样的算法其实很耗时,但是因为瓶颈在网络传输,所以用时间来换空间反而能省时间。
    • 简化代码。最高效的程序就是不执行任何代码的程序,所以,代码越少性能就越高。关于代码级优化的技术大学里的教科书有很多示例了。如:减少循环的层数,减少递归,在循环中少声明变量,少做分配和释放内存的操作,尽量把循环体内的表达式抽到循环外,条件表达的中的多个条件判断的次序,尽量在程序启动时把一些东西准备好,注意函数调用的开销(栈上开销),注意面向对象语言中临时对象的开销,小心使用异常(不要用异常来检查一些可接受可忽略并经常发生的错误),…… 等等,等等,这连东西需要我们非常了解编程语言和常用的库。
    • 并行处理。如果CPU只有一个核,你要玩多进程,多线程,对于计算密集型的软件会反而更慢(因为操作系统调度和切换开销很大),CPU的核多了才能真正体现出多进程多线程的优势。并行处理需要我们的程序有Scalability,不能水平或垂直扩展的程序无法进行并行处理。从架构上来说,这表再为——是否可以做到不改代码只是加加机器就可以完成性能提升?
    总之,根据2:8原则来说,20%的代码耗了你80%的性能,找到那20%的代码,你就可以优化那80%的性能。 下面的一些东西都是我的一些经验,我只例举了一些最有价值的性能调优的的方法,供你参考,也欢迎补充。
    4.1)算法调优。算法非常重要,好的算法会有更好的性能。举几个我经历过的项目的例子,大家可以感觉一下。
    • 一个是过滤算法,系统需要对收到的请求做过滤,我们把可以被filter in/out的东西配置在了一个文件中,原有的过滤算法是遍历过滤配置,后来,我们找到了一种方法可以对这个过滤配置进行排序,这样就可以用二分折半的方法来过滤,系统性能增加了50%。
    • 一个是哈希算法。计算哈希算法的函数并不高效,一方面是计算太费时,另一方面是碰撞太高,碰撞高了就跟单向链表一个性能(可参看Hash Collision DoS 问题)。我们知道,算法都是和需要处理的数据很有关系的,就算是被大家所嘲笑的“冒泡排序”在某些情况下(大多数数据是排好序的)其效率会高于所有的排序算法。哈希算法也一样,广为人知的哈希算法都是用英文字典做测试,但是我们的业务在数据有其特殊性,所以,对于还需要根据自己的数据来挑选适合的哈希算法。对于我以前的一个项目,公司内某牛人给我发来了一个哈希算法,结果让我们的系统性能上升了150%。(关于各种哈希算法,你一定要看看StackExchange上的这篇关于各种hash算法的文章 )
    • 分而治之和预处理。以前有一个程序为了生成月报表,每次都需要计算很长的时间,有时候需要花将近一整天的时间。于是我们把我们找到了一种方法可以把这个算法发成增量式的,也就是说我每天都把当天的数据计算好了后和前一天的报表合并,这样可以大大的节省计算时间,每天的数据计算量只需要20分钟,但是如果我要算整个月的,系统则需要10个小时以上(SQL语句在大数据量面前性能成级数性下降)。这种分而治之的思路在大数据面前对性能有很帮助,就像merge排序一样。SQL语句和数据库的性能优化也是这一策略,如:使用嵌套式的Select而不是笛卡尔积的Select,使用视图,等等。
    4.2)代码调优。从我的经验上来说,代码上的调优有下面这几点:
    • 字符串操作。这是最费系统性能的事了,无论是strcpy, strcat还是strlen,最需要注意的是字符串子串匹配。所以,能用整型最好用整型。举几个例子,第一个例子是N年前做银行的时候,我的同事喜欢把日期存成字符串(如:2012-05-29 08:30:02),我勒个去,一个select  where between语句相当耗时。另一个例子是,我以前有个同事把一些状态码用字符串来处理,他的理由是,这样可以在界面上直接显示,后来性能调优的时候,我把这些状态码全改成整型,然后用位操作查状态,因为有一个每秒钟被调用了150K次的函数里面有三处需要检查状态,经过改善以后,整个系统的性能上升了30%左右。还有一个例子是,我以前从事的某个产品编程规范中有一条是要在每个函数中把函数名定义出来,如:const char fname[]=”functionName()”, 这是为了好打日志,但是为什么不声明成 static类型的呢?
    • 多线程调优。有人说,thread is evil,这个对于系统性能在某些时候是个问题。因为多线程瓶颈就在于互斥和同步的锁上,以及线程上下文切换的成本,怎么样的少用锁或不用锁是根本(比如:多版本并发控制(MVCC)在分布式系统中的应用 中说的乐观锁可以解决性能问题),此外,还有读写锁也可以解决大多数是读操作的并发的性能问题。这里多说一点在C++中,我们可能会使用线程安全的智能指针AutoPtr或是别的一些容器,只要是线程安全的,其不管三七二十一都要上锁,上锁是个成本很高的操作,使用AutoPtr会让我们的系统性能下降得很快,如果你可以保证不会有线程并发问题,那么你应该不要用AutoPtr。我记得我上次我们同事去掉智能指针的引用计数,让系统性能提升了50%以上。对于Java对象的引用计数,如果我猜的没错的话,到处都是锁,所以,Java的性能问题一直是个问题。另外,线程不是越多越好,线程间的调度和上下文切换也是很夸张的事,尽可能的在一个线程里干,尽可能的不要同步线程。这会让你有很多的性能。
    • 内存分配。不要小看程序的内存分配。malloc/realloc/calloc这样的系统调非常耗时,尤其是当内存出现碎片的时候。我以前的公司出过这样一个问题——在用户的站点上,我们的程序有一天不响应了,用GDB跟进去一看,系统hang在了malloc操作上,20秒都没有返回,重启一些系统就好了。这就是内存碎片的问题。这就是为什么很多人抱怨STL有严重的内存碎片的问题,因为太多的小内存的分配释放了。有很多人会以为用内存池可以解决这个问题,但是实际上他们只是重新发明了Runtime-C或操作系统的内存管理机制,完全于事无补。当然解决内存碎片的问题还是通过内存池,具体来说是一系列不同尺寸的内存池(这个留给大家自己去思考)。当然,少进行动态内存分配是最好的。说到内存池就需要说一下池化技术。比如线程池,连接池等。池化技术对于一些短作业来说(如http服务) 相当相当的有效。这项技术可以减少链接建立,线程创建的开销,从而提高性能。
    • 异步操作。我们知道Unix下的文件操作是有block和non-block的方式的,像有些系统调用也是block式的,如:Socket下的select,Windows下的WaitforObject之类的,如果我们的程序是同步操作,那么会非常影响性能,我们可以改成异步的,但是改成异步的方式会让你的程序变复杂。异步方式一般要通过队列,要注间队列的性能问题,另外,异步下的状态通知通常是个问题,比如消息事件通知方式,有callback方式,等,这些方式同样可能会影响你的性能。但是通常来说,异步操作会让性能的吞吐率有很大提升(Throughput),但是会牺牲系统的响应时间(latency)。这需要业务上支持。
    • 语言和代码库。我们要熟悉语言以及所使用的函数库或类库的性能。比如:STL中的很多容器分配了内存后,那怕你删除元素,内存也不会回收,其会造成内存泄露的假像,并可能造成内存碎片问题。再如,STL某些容器的size()==0  和 empty()是不一样的,因为,size()是O(n)复杂度,empty()是O(1)的复杂度,这个要小心。Java中的JVM调优需要使用的这些参数:-Xms -Xmx -Xmn -XX:SurvivorRatio -XX:MaxTenuringThreshold,还需要注意JVM的GC,GC的霸气大家都知道,尤其是full GC(还整理内存碎片),他就像“恐龙特级克赛号”一样,他运行的时候,整个世界的时间都停止了。
    4.3)网络调优
    关于网络调优,尤其是TCP Tuning(你可以以这两个关键词在网上找到很多文章),这里面有很多很多东西可以说。看看Linux下TCP/IP的那么多参数就知道了(顺便说一下,你也许不喜欢Linux,但是你不能否认Linux给我们了很多可以进行内核调优的权力)。强烈建议大家看看《TCP/IP 详解 卷1:协议》这本书。我在这里只讲一些概念上的东西。
    A) TCP调优
    我们知道TCP链接是有很多开销的,一个是会占用文件描述符,另一个是会开缓存,一般来说一个系统可以支持的TCP链接数是有限的,我们需要清楚地认识到TCP链接对系统的开销是很大的。正是因为TCP是耗资源的,所以,很多攻击都是让你系统上出现大量的TCP链接,把你的系统资源耗尽。比如著名的SYNC Flood攻击。
    所以,我们要注意配置KeepAlive参数,这个参数的意思是定义一个时间,如果链接上没有数据传输,系统会在这个时间发一个包,如果没有收到回应,那么TCP就认为链接断了,然后就会把链接关闭,这样可以回收系统资源开销。(注:HTTP层上也有KeepAlive参数)对于像HTTP这样的短链接,设置一个1-2分钟的keepalive非常重要。这可以在一定程度上防止DoS攻击。有下面几个参数(下面这些参数的值仅供参考):
    1
    2
    3
    net.ipv4.tcp_keepalive_probes = 5
    net.ipv4.tcp_keepalive_intvl = 20
    net.ipv4.tcp_fin_timeout = 30



    对于TCP的TIME_WAIT这个状态,主动关闭的一方进入TIME_WAIT状态,TIME_WAIT状态将持续2个MSL(Max Segment Lifetime),默认为4分钟,TIME_WAIT状态下的资源不能回收。有大量的TIME_WAIT链接的情况一般是在HTTP服务器上。对此,有两个参数需要注意,
    1
    2
    net.ipv4.tcp_tw_reuse=1
    net.ipv4.tcp_tw_recycle=1



    前者表示重用TIME_WAIT,后者表示回收TIME_WAIT的资源。
    TCP还有一个重要的概念叫RWIN(TCP Receive Window Size),这个东西的意思是,我一个TCP链接在没有向Sender发出ack时可以接收到的最大的数据包。为什么这个很重要?因为如果Sender没有收到Receiver发过来ack,Sender就会停止发送数据并会等一段时间,如果超时,那么就会重传。这就是为什么TCP链接是可靠链接的原因。重传还不是最严重的,如果有丢包发生的话,TCP的带宽使用率会马上受到影响(会盲目减半),再丢包,再减半,然后如果不丢包了,就逐步恢复。相关参数如下:
    1
    2
    3
    4
    net.core.wmem_default = 8388608
    net.core.rmem_default = 8388608
    net.core.rmem_max = 16777216
    net.core.wmem_max = 16777216



    一般来说,理论上的RWIN应该设置成:吞吐量  * 回路时间。Sender端的buffer应该和RWIN有一样的大小,因为Sender端发送完数据后要等Receiver端确认,如果网络延时很大,buffer过小了,确认的次数就会多,于是性能就不高,对网络的利用率也就不高了。也就是说,对于延迟大的网络,我们需要大的buffer,这样可以少一点ack,多一些数据,对于响应快一点的网络,可以少一些buffer。因为,如果有丢包(没有收到ack),buffer过大可能会有问题,因为这会让TCP重传所有的数据,反而影响网络性能。(当然,网络差的情况下,就别玩什么高性能了) 所以,高性能的网络重要的是要让网络丢包率非常非常地小(基本上是用在LAN里),如果网络基本是可信的,这样用大一点的buffer会有更好的网络传输性能(来来回回太多太影响性能了)。
    另外,我们想一想,如果网络质量非常好,基本不丢包,而业务上我们不怕偶尔丢几个包,如果是这样的话,那么,我们为什么不用速度更快的UDP呢?你想过这个问题了吗?
    B)UDP调优
    说到UDP的调优,有一些事我想重点说一样,那就是MTU——最大传输单元(其实这对TCP也一样,因为这是链路层上的东西)。所谓最大传输单元,你可以想像成是公路上的公交车,假设一个公交车可以最多坐70人,带宽就像是公路的车道数一样,如果一条路上最多可以容下100辆公交车,那意味着我最多可以运送7000人,但是如果公交车坐不满,比如平均每辆车只有20人,那么我只运送了2000人,于是我公路资源(带宽资源)就被浪费了。 所以,我们对于一个UDP的包,我们要尽量地让他大到MTU的最大尺寸再往网络上传,这样可以最大化带宽利用率。对于这个MTU,以太网是1500字节,光纤是4352字节,802.11无线网是7981。但是,当我们用TCP/UDP发包的时候,我们的有效负载Payload要低于这个值,因为IP协议会加上20个字节,UDP会加上8个字节(TCP加的更多),所以,一般来说,你的一个UDP包的最大应该是1500-8-20=1472,这是你的数据的大小。当然,如果你用光纤的话, 这个值就可以更大一些。(顺便说一下,对于某些NB的千光以态网网卡来说,在网卡上,网卡硬件如果发现你的包的大小超过了MTU,其会帮你做fragment,到了目标端又会帮你做重组,这就不需要你在程序中处理了)
    再多说一下,使用Socket编程的时候,你可以使用setsockopt() 设置 SO_SNDBUF/SO_RCVBUF 的大小,TTL和KeepAlive这些关键的设置,当然,还有很多,具体你可以查看一下Socket的手册。
    最后说一点,UDP还有一个最大的好处是multi-cast多播,这个技术对于你需要在内网里通知多台结点时非常方便和高效。而且,多播这种技术对于机会的水平扩展(需要增加机器来侦听多播信息)也很有利。
    C)网卡调优
    对于网卡,我们也是可以调优的,这对于千兆以及网网卡非常必要,在Linux下,我们可以用ifconfig查看网上的统计信息,如果我们看到overrun上有数据,我们就可能需要调整一下txqueuelen的尺寸(一般默认为1000),我们可以调大一些,如:ifconfig eth0 txqueuelen 5000。Linux下还有一个命令叫:ethtool可以用于设置网卡的缓冲区大小。在Windows下,我们可以在网卡适配器中的高级选项卡中调整相关的参数(如:Receive Buffers, Transmit Buffer等,不同的网卡有不同的参数)。把Buffer调大对于需要大数据量的网络传输非常有效。
    D)其它网络性能
    关于多路复用技术,也就是用一个线程来管理所有的TCP链接,有三个系统调用要重点注意:一个是select,这个系统调用只支持上限1024个链接,第二个是poll,其可以突破1024的限制,但是select和poll本质上是使用的轮询机制,轮询机制在链接多的时候性能很差,因主是O(n)的算法,所以,epoll出现了,epoll是操作系统内核支持的,仅当在链接活跃时,操作系统才会callback,这是由操作系统通知触发的,但其只有Linux Kernel 2.6以后才支持(准确说是2.5.44中引入的),当然,如果所有的链接都是活跃的,过多的使用epoll_ctl可能会比轮询的方式还影响性能,不过影响的不大。
    另外,关于一些和DNS Lookup的系统调用要小心,比如:gethostbyaddr/gethostbyname,这个函数可能会相当的费时,因为其要到网络上去找域名,因为DNS的递归查询,会导致严重超时,而又不能通过设置什么参数来设置time out,对此你可以通过配置hosts文件来加快速度,或是自己在内存中管理对应表,在程序启动时查好,而不要在运行时每次都查。另外,在多线程下面,gethostbyname会一个更严重的问题,就是如果有一个线程的gethostbyname发生阻塞,其它线程都会在gethostbyname处发生阻塞,这个比较变态,要小心。(你可以试试GNU的gethostbyname_r(),这个的性能要好一些) 这种到网上找信息的东西很多,比如,如果你的Linux使用了NIS,或是NFS,某些用户或文件相关的系统调用就很慢,所以要小心。
    4.4)系统调优
    A)I/O模型
    前面说到过select/poll/epoll这三个系统调用,我们都知道,Unix/Linux下把所有的设备都当成文件来进行I/O,所以,那三个操作更应该算是I/O相关的系统调用。说到  I/O模型,这对于我们的I/O性能相当重要,我们知道,Unix/Linux经典的I/O方式是(关于Linux下的I/O模型,大家可以读一下这篇文章《使用异步I/O大大提高性能》):
    第一种,同步阻塞式I/O,这个不说了。
    第二种,同步无阻塞方式。其通过fctnl设置 O_NONBLOCK 来完成。
    第三种,对于select/poll/epoll这三个是I/O不阻塞,但是在事件上阻塞,算是:I/O异步,事件同步的调用。
    第四种,AIO方式。这种I/O 模型是一种处理与 I/O 并行的模型。I/O请求会立即返回,说明请求已经成功发起了。在后台完成I/O操作时,向应用程序发起通知,通知有两种方式:一种是产生一个信号,另一种是执行一个基于线程的回调函数来完成这次 I/O 处理过程。
    第四种因为没有任何的阻塞,无论是I/O上,还是事件通知上,所以,其可以让你充分地利用CPU,比起第二种同步无阻塞好处就是,第二种要你一遍一遍地去轮询。Nginx之所所以高效,是其使用了epoll和AIO的方式来进行I/O的。
    再说一下Windows下的I/O模型,
    a)一个是WriteFile系统调用,这个系统调用可以是同步阻塞的,也可以是同步无阻塞的,关于看文件是不是以Overlapped打开的。关于同步无阻塞,需要设置其最后一个参数Overlapped,微软叫Overlapped I/O,你需要WaitForSingleObject才能知道有没有写完成。这个系统调用的性能可想而知。
    b)另一个叫WriteFileEx的系统调用,其可以实现异步I/O,并可以让你传入一个callback函数,等I/O结束后回调之, 但是这个回调的过程Windows是把callback函数放到了APC(Asynchronous Procedure Calls)的队列中,然后,只用当应用程序当前线程成为可被通知状态(Alterable)时,才会被回调。只有当你的线程使用了这几个函数时WaitForSingleObjectEx,WaitForMultipleObjectsExMsgWaitForMultipleObjectsExSignalObjectAndWait 和 SleepEx,线程才会成为Alterable状态。可见,这个模型,还是有wait,所以性能也不高。
    c)然后是IOCP – IO Completion Port,IOCP会把I/O的结果放在一个队列中,但是,侦听这个队列的不是主线程,而是专门来干这个事的一个或多个线程去干(老的平台要你自己创建线程,新的平台是你可以创建一个线程池)。IOCP是一个线程池模型。这个和Linux下的AIO模型比较相似,但是实现方式和使用方式完全不一样。
    当然,真正提高I/O性能方式是把和外设的I/O的次数降到最低,最好没有,所以,对于读来说,内存cache通常可以从质上提升性能,因为内存比外设快太多了。对于写来说,cache住要写的数据,少写几次,但是cache带来的问题就是实时性的问题,也就是latency会变大,我们需要在写的次数上和相应上做权衡。
    B)多核CPU调优
    关于CPU的多核技术,我们知道,CPU0是很关键的,如果0号CPU被用得过狠的话,别的CPU性能也会下降,因为CPU0是有调整功能的,所以,我们不能任由操作系统负载均衡,因为我们自己更了解自己的程序,所以,我们可以手动地为其分配CPU核,而不会过多地占用CPU0,或是让我们关键进程和一堆别的进程挤在一起。
    • 对于Windows来说,我们可以通过“任务管理器”中的“进程”而中右键菜单中的“设置相关性……”(Set Affinity…)来设置并限制这个进程能被运行在哪些核上。
    • 对于Linux来说,可以使用taskset命令来设置(你可以通过安装schedutils来安装这个命令:apt-get install schedutils)
    多核CPU还有一个技术叫NUMA技术(Non-Uniform. Memory Access)。传统的多核运算是使用SMP(Symmetric Multi-Processor )模式,多个处理器共享一个集中的存储器和I/O总线。于是就会出现一致存储器访问的问题,一致性通常意味着性能问题。NUMA模式下,处理器被划分成多个node, 每个node有自己的本地存储器空间。关于NUMA的一些技术细节,你可以查看一下这篇文章《Linux 的 NUMA 技术》,在Linux下,对NUMA调优的命令是:numactl 。如下面的命令:(指定命令“myprogram arg1 arg2”运行在node 0 上,其内存分配在node 0 和 1上)
    1
    numactl --cpubind=0 --membind=0,1 myprogram arg1 arg2



    当然,上面这个命令并不好,因为内存跨越了两个node,这非常不好。最好的方式是只让程序访问和自己运行一样的node,如:
    1
    $ numactl --membind 1 --cpunodebind 1 --localalloc myapplication



    C)文件系统调优
    关于文件系统,因为文件系统也是有cache的,所以,为了让文件系统有最大的性能。首要的事情就是分配足够大的内存,这个非常关键,在Linux下可以使用free命令来查看 free/used/buffers/cached,理想来说,buffers和cached应该有40%左右。然后是一个快速的硬盘控制器,SCSI会好很多。最快的是Intel SSD 固态硬盘,速度超快,但是写次数有限。
    接下来,我们就可以调优文件系统配置了,对于Linux的Ext3/4来说,几乎在所有情况下都有所帮助的一个参数是关闭文件系统访问时间,在/etc/fstab下看看你的文件系统 有没有noatime参数(一般来说应该有),还有一个是dealloc,它可以让系统在最后时刻决定写入文件发生时使用哪个块,可优化这个写入程序。还要注间一下三种日志模式:data=journal、data=ordered和data=writeback。默认设置data=ordered提供性能和防护之间的最佳平衡。
    当然,对于这些来说,ext4的默认设置基本上是最佳优化了。
    这里介绍一个Linux下的查看I/O的命令—— iotop,可以让你看到各进程的磁盘读写的负载情况。
    其它还有一些关于NFS、XFS的调优,大家可以上google搜索一些相关优化的文章看看。关于各文件系统,大家可以看一下这篇文章——《Linux日志文件系统及性能分析
    4.5)数据库调优
    数据库调优并不是我的强项,我就仅用我非常有限的知识说上一些吧。注意,下面的这些东西并不一定正确,因为在不同的业务场景,不同的数据库设计下可能会得到完全相反的结论,所以,我仅在这里做一些一般性的说明,具体问题还要具体分析。
  • 乐观人群的10个好习惯

    2013-08-28 17:42:16

     

    2012-08-30 10:15:35|  分类: 心情 |  标签: |字号 订阅

    乐观人群的10个好习惯
    第八号当铺  2012-08-22 阅读848 评论3条 [网页划词启用]  [object Object]
    乐观人群的10个好习惯 - Jo Jo - 萧厢阁本文属阅读资料
    乐观人群的10个好习惯 - Jo Jo - 萧厢阁
    期待事业更上一层楼?从此沟通更轻松! 助你熟练掌握商务英语交流术。www.englishtown.com/EF

      Are you waiting for life events to turn out the way you want so that you can feel more positive about your life? Do you find yourself having pre-conditions to your sense of well-being, thinking that certain things must happen for you to be happier? Do you think there is no way that your life stresses can make you anything other than “stressed out” and that other people just don’t understand? If your answer is “yes” to any of these questions, you might find yourself lingering in the land of negativity for too long!


      你是否在等待足以改变命运的大事件并以此过上自己想要的生活,这样你才可以更积极地对待生活?你是否发现自己的幸福感是有条件的,而且认为必须发生某些事才能让你更快乐?你是否认为自己的生活压力过大,而其他人都无法理解?如果以上任何一个问题你回答了“是”,你可能已经在消极情绪中沉溺很久了。


      The following are some tips to keep positive no matter what comes your way. This post will help you stop looking for what psychologists call “positivity” in all the wrong places! Here are the ten essential habits of positive people.


      下面是一些遇事保持乐观的小窍门。它们可以帮你避免不恰当地盲目寻找心理学家所说的“正能量”。我们来看看乐观人群的10个好习惯。


      1. Positive people don’t confuse quitting with letting go.


      乐观人群懂得放弃和顺其自然的区别


      Instead of hanging on to ideas, beliefs, and even people that are no longer healthy for them, they trust their judgement to let go of negative forces in their lives. Especially in terms of relationships, they subscribe to The Relationship Prayer which goes:


      乐观人群不会纠结于理念、信仰和那些会给他们带来负面情绪的人。他们会相信自己的判断,让生活中的负面压力顺其自然。尤其在人际关系方面,他们信奉这样几句话:


      I will grant myself the ability to trust the healthy people in my life …


      对于给我的生活带来积极影响的人,我会尽我所能去信任他们,


      To set limits with, or let go of, the negative ones …


      对于给我带来消极影响的人,我会保持距离、或者由他们去,


      And to have the wisdom to know the DIFFERENCE!


      而且我有智慧分辨这两种人的不同!


      2. Positive people don’t just have a good day – they make a good day.


      乐观人群不仅会享受美好的一天,他们还会创造美好的一天


      Waiting, hoping and wishing seldom have a place in the vocabulary of positive individuals. Rather, they use strong words that are pro-active and not reactive. Passivity leads to a lack of involvement, while positive people get very involved in constructing their lives. They work to make changes to feel better in tough times rather than wish their feelings away.


      乐观人群的字典里从来没有“等待”“希望”“盼望”这些词。他们总是用那些强有力、而且积极主动的字眼,绝不会用那种被动的字眼。被动会让人缺乏参与精神,而乐观人群会积极参与到自己的人生规划中。在困境中他们会用行动来改善自己的感受,而不是指望坏情绪快消失。


      3. For the positive person, the past stays in the past.


      对于乐观人群来说,过去只停留在过去


      Good and bad memories alike stay where they belong – in the past where they happened. They don’t spend much time pining for the good ol’ days because they are too busy making new memories now. The negative pulls from the past are used not for self-flagellation or unproductive regret, but rather productive regret where they use lessons learned as stepping stones towards a better future.


      回忆,无论好坏,都应该留在原地 —— 也就是事情发生的过去。乐观人群不会过分怀念美好的旧时光,因为他们正忙着创造新的回忆。而过去那些负面回忆的作用不是让你自怨自艾,也不是让你毫无意义地后悔,而是让你在后悔过后从中吸取教训,然后让其成为通向更美好未来的垫脚石。


      4. Show me a positive person and I can show you a grateful person.


      乐观人群都懂得感恩


      The most positive people are the most grateful people. They do not focus on the potholes of their lives. They focus on the pot of gold that awaits them every day, with new smells, sights, feelings and experiences. They see life as a treasure chest full of wonder.


      最乐观的人往往也是最懂得感恩的人。他们不会纠结于生活中的坎坷,而会用全新的感官和体验,去关注生活中每一天等待着他们的宝藏。在他们眼中,生活就是一个充满了传奇的宝库。


      5. Rather than being stuck in their limitations, positive people are energized by their possibilities.


      乐观人群不会为自己的局限所困,而会被自己的潜能所激励


      Optimistic people focus on what they can do, not what they can’t do. They are not fooled to think that there is a perfect solution to every problem, and are confident that there are many solutions and possibilities. They are not afraid to attempt new solutions to old problems, rather than spin their wheels expecting things to be different this time. They refuse to be like Charlie Brown expecting that this time Lucy will not pull the football from him!


      乐观人群会关注自己能做什么,而不是不能做什么。他们不会天真地相信凡事都有完美的解决办法,他们认为每个问题都有许多解决办法和可能性。他们绝不会原地祈祷事情出现转机,而会无所畏惧地为老问题尝试新的解决办法。他们不会像查理布朗那样,每次只是期待露西不会把球从他手里抢走。


      6. Positive people do not let their fears interfere with their lives!


      乐观人群不会让恐惧打乱自己的生活


      Positive people have observed that those who are defined and pulled back by their fears never really truly live a full life. While proceeding with appropriate caution, they do not let fear keep them from trying new things. They realize that even failures are necessary steps for a successful life. They have confidence that they can get back up when they are knocked down by life events or their own mistakes, due to a strong belief in their personal resilience.


      乐观人群明白,那些被恐惧所左右和束缚的人永远无法真正活出自己。他们也会保持适度的谨慎,但绝不会因为恐惧而放弃对新事物的尝试。他们深知,失败也是通向成功的必经之路。他们坚信,哪怕被生活中的挫折或自己犯下的错误所打倒,他们也可以重新站起来,因为他们对于自己的抗击打能力有着强大的信念。


      7. Positive people smile a lot!


      乐观人群常常微笑


      When you feel positive on the inside it is like you are smiling from within, and these smiles are contagious. Furthermore, the more others are with positive people, the more they tend to smile too! They see the lightness in life, and have a sense of humor even when it is about themselves. Positive people have a high degree of self-respect, but refuse to take themselves too seriously!


      如果你感到乐观向上,你也会发自内心地微笑,而且这种微笑是可以感染他人的。和乐观人群相处越久的人也越容易微笑!乐观人群善于发现生活的闪光点,而且富有幽默感,也不介意拿自己开玩笑。他们也有很强的自尊,但不会太把自己当回事儿!


      8. People who are positive are great communicators.


      乐观人群善于交流


      They realize that assertive, confident communication is the only way to connect with others in everyday life. They avoid judgmental, angry interchanges, and do not let someone else’s blow up give them a reason to react in kind. Rather, they express themselves with tact and finesse. They also refuse to be non-assertive and let people push them around. They refuse to own problems that belong to someone else.


      乐观人群明白,自信的交流是日常生活中和他人沟通的唯一途径。他们会避免批判性的、愤怒的交谈,也不会因为他人出言不逊就以牙还牙。相反地,他们在自我表达时善于运用机智和策略。他们还充满自信,绝不会人云亦云,也不会亦步亦趋跟着别人犯错误。


      9. Positive people realize that if you live long enough, there are times for great pain and sadness.


      乐观人群明白,你活得越长,痛苦和悲伤也越多。


      One of the most common misperceptions about positive people is that to be positive, you must always be happy. This can not be further from the truth. Anyone who has any depth at all is certainly not happy all the time. Being sad, angry, disappointed are all essential emotions in life. How else would you ever develop empathy for others if you lived a life of denial and shallow emotions? Positive people do not run from the gamut of emotions, and accept that part of the healing process is to allow themselves to experience all types of feelings, not only the happy ones. A positive person always holds the hope that there is light at the end of the darkness。


      对乐观人群一个最普遍的误解就是,他们每时每刻都很快乐。这简直大错特错。任何一个头脑正常的人都不可能永远保持快乐。悲伤、愤怒和失望也是生命中不可缺少的情绪。如果你只拥有一些简单肤浅的情绪,如何能做到对他人感同身受呢?乐观人群在面对各种情绪时不会逃避,他们认为情绪上的治愈过程有助于他们体验多种情感,而不仅仅是“快乐”这一种。他们总是相信,黑暗的尽头必定有光明。


      10. Positive person are empowered people – they refuse to blame others and are not victims in life.


      乐观人群善于掌控自己的人生,他们不会责怪他人,也不会做生活的受害者。


      Positive people seek the help and support of others who are supportive and safe. They have identified their own basic human rights, and they respect themselves too much to play the part of a victim. There is no place for holding grudges with a positive mindset. Forgiveness helps positive people become better, not bitter.


      乐观人群会向有能力而且可靠的人寻求帮助和支持。他们很明确自己的基本人权,而且非常维护自己的尊严,因此绝不会扮演受害者的角色。乐观人群有着积极的心态,绝不会心存怨恨。宽容有助于乐观人群抛弃愁苦,使他们的生活更美好。

  • 8种方法打败生活中的敌人

    2013-08-28 17:40:47

     

    2012-09-04 14:25:26|  分类: 心情 |  标签: |字号 订阅

    8种方法打败生活中的敌人 - Jo Jo - 萧厢阁


    We all face ill-wishers, when we set goals and begin to reach them, no matter at what stage we are now: sceptics, critics, people who taunt us or say that we won't succeed in what we do.


    当我们设定了目标并开始去实现的时候,不论我们目前处于哪个阶段,我们都会遇到幸灾乐祸的人:有的人持怀疑态度,有的大肆批评,有的则奚落我们,或者预言我们在所做的事情上不会成功。
    Such people are a very powerful force, because even with "innocent" jokes and comments they can make you slow down or even stop moving towards your goals.
    此类人具有超强的影响力,因为即便说了些"毫无恶意的"玩笑和话语,他们就能让你放慢甚至停下向目标前进的脚步。
    How to deal with ill-wishers? Of course, they are all different, but here are a few good general tips:
    如何应对幸灾乐祸的人呢?当然,他们各不相同,但是我们总结了以下几条应对一般情况的建议:
    1.First, learn to identify them.
    1.首先,学会认清他们。

    Sometimes we just do not realize that someone is our ill-wisher. They can be close friends or family members, so when they say negative things, we often believe them and take them to heart. You should remember that there is a big difference between realists and sceptics. Learn to listen to what others say, and note your reaction. If that upsets you and makes you feel depressed, then probably these people are your ill-wishers.
    有时我们只是意识不到某个人是希望我们不幸的人。他们可能是我们的挚友或家人,所以当他们说一些消极的话语时,我们通常会相信他们,把他们的话放在心上。你应该记住,现实主义者和怀疑论者是有很大区别的。学会倾听他人的话语,并注意你自己的反应。如果他们的话让你生气,让你感到沮丧,那么大概这些人就是希望你不幸的人。
    2.Think maybe they are right.
    2.思考一下或许他们是对的。

    As was mentioned above, sometimes they are just trying to be realistic. They may have good reasons for their negative attitude. Take a step back and think objectively why they have doubts and see a real obstacle, and if so, then try to figure out how to overcome it. If you really want to reach your goal, you will find a solution. If your ill-wishers are certainly wrong, just move on.
    如上所述,有时他们只不过试图现实一些。他们或许有很好的理由来说明自己消极的态度。退一步,客观地思考一下为什么他们有疑虑,认清真正的阻碍。如果真是如此,那么努力找到战胜阻碍的方法。如果你真的想实现你的目标,那么你就会找到解决办法。如果幸灾乐祸的人确实是错了,那你就继续前进吧。
    3.Reject any negative thoughts they bring.
    3.不接受他们带来的任何消极思想。

    Enemies will always try to bring to you their negative thoughts, which can raise doubts about your rightness. Then it can grow and affect the way you feel about your goals. Stop these negative thoughts as soon as possible! Replace them with positive beliefs. Do not let them beat you!
    敌人总是会试图将他们的消极思想带给你,这些思想会让你怀疑自己是否正确,然后会慢慢影响你对自己的目标的感觉。尽快摆脱这些消极的思想吧!让积极的信念取而代之。不要让它们打败你!
    4.Understand that you will always have enemies, and don't take them to heart.
    4.懂得你总是会有敌人,不要把他们放在心上。

    In everyone's life there is at least one enemy. You cannot avoid seeing them but you can avoid listening to them. Just smile and do not pay attention to their words. They will not be able to affect you if you ignore their words.
    在每个人的一生中,至少会有一个敌人出现。你不可避免会看到他们,但是你可以避免听信他们。只用微笑面对,不要在意他们的话语。如果你忽略他们的话,他们就不会影响到你。
    5.Try to win them over.
    5.努力把敌人争取过来。

    Sometimes ill-wishers are your close people and you can't ignore them. If so, it is better to enlist the help of these people, rather than fight them. Try to do it as soon as possible. Tell them that it is very important to you, and you need their help. Tell them that you understand their concerns, but you really need a positive attitude and support. If they are your close people who care about you, they will become your best allies.
    有时候,幸灾乐祸的人就是跟你很亲密的人,你不能忽视他们。如果是这样,最好就是谋取这些人的帮助,而不是同他们斗争。尽快去争取他们。告诉他们这对你很重要,你需要他们的帮助。告诉他们你了解他们的担忧,但是你真的需要积极的态度和支持。如果他们是和你关系亲密、关心你的人,他们会变成你最好的盟友。
    6.Laugh with them.
    6.跟他们一起笑。

    Sometimes people feel uncomfortable when you take some changes and in order to get rid of this discomfort, they come up with different jokes and begin to taunt you. They just do not know how else to react. Be aware of this and just laugh. If you take their words as nothing more but just a good joke, it disarms them. They can continue making jokes at you, but it won't longer affect you if you'll just laugh at them.
    当你做出一些改变时,有时人们会感到不安。为了消除这种不安,他们会讲许多笑话开始奚落你。他们只是不知道其他人会是如何反应。要注意这一点,而且只管笑吧。他们会继续拿你开玩笑,但是如果你只是随着他们一起笑的话,这将不再影响你。
    7.Have ready-made counter-arguments and use them.
    7.用现成的论点反驳他们。

    Sometimes people are just misinformed about what is happening. They may misunderstand what you are doing. Think on all their arguments and prepare your counter-arguments. Conduct your small research and justify the correctness of your actions. Then try to "enlighten" your ill-wishers. If you do it correctly, with a positive and sincere attitude, you can manage to make a person listen to you, and perhaps even change his opinion. If you fail, then at least you will be much better informed about their arguments and won't let them give birth to doubts in your head.
    有时候,人们只不过是被误传了正在发生的事情。他们可能误解了你当前做的事情。思量一下他们的所有论点,准备好反驳的话语。小范围地进行一下研究,证明你的行为是恰当的。然后努力"开导"那些幸灾乐祸的人。如果你的做法恰当,带着积极、诚恳的态度,你就能成功地让人听信你,甚至能改变他的观点。如果你失败了,那么至少你更好地了解了他们的观点,不会让他们使你的大脑再生疑虑。
    8.Be sure that you are doing something good.
    8.肯定你做的事情是好事。

    Sometimes there is nothing you can do about it. You can't convince them, you can't avoid them, you can't laugh with them… Therefore, you should just ignore them and continue telling yourself that when you reach your goal, it will be a reward for enduring these people.
    有时候你对敌人也是束手无策。你不能说服他们,不能躲避他们,不能跟他们一起笑……因此,你应该忽视他们,不断地告诉自己当你实现了自己的目标,这将是对忍耐这些人的回报。
    Remember that enemies will always exist in your life. But they are just an additional obstacle on the way towards your goal. If you look for solutions, you can defeat them or make them your allies.
    记住,敌人总是存在于你的生活中。但是他们只不过是你实现目标的道路上的额外障碍。如果你去寻找解决方法,你就能打败他们,或者让他们成为你的盟友。  

  • 测试管理者需要具备的能力

    2013-08-28 17:37:57

     

    2011-11-08 17:22:11|  分类: 测试 |  标签: |字号 订阅


    一、类测试项是管理者需要的通用能力

            这里面可以分成很多小类,很难写全,管理学是一门学问,只能随便列几个:
            1、 是否善于带领团队
            a、是否善于利用团队里不同能力和性格的人合理分工,人尽其用
            b、是否能产生凝聚力让大家力量往一处使
            c、能否协调好上下关系,既不能让上层无休止的压任务而不吭声,也不能放任属下消极工作带来的效率低下。
            d、是否有较强责任感,管理者不能像普通员工一样,任务来了就做,做完了等下一个任务,这样的管理者的手下就更加会混事了。
            e、是否能尽量不在工作中掺杂个人感情。

            2、 是否善于制定和展开计划
            a、拿到一个项目首先就是制定计划,计划的制定并不是写几条就可以的,一般需要有一定经验,同时利用线表日报等工具辅助完成,善于统计和整理也非常重要
            b、计划展开过程中要能根据实际情况提前调整计划,把握好进度

      3、 是否能培养人才
            a、能带一个团队打好仗还不是最好的管理者,能把手下带出一帮精兵强将才是更加珍贵的管理者,他们堪称是公司的发动机。     
            b、建立完善的交流培训机制,使得新人培养和老员工交流都体制化

      4、 当然了必不可少的必须善于人际关系处理。

    二、测试项是软件测试管理者特殊的能力

            1、 是否有足够的软件测试经验,接到一个项目知道如何展开,熟知测试与bug的生命周期,熟悉统计数据的制作和分析,能从 统计数据中看出目前项目状况问题所在,知道哪里有问题需要改进。

            2、 是否有较强学习能力一直能保持先进性,作为管理者,个人以为不提倡去一线继续作技术,但是一定要保持关注测试 领域技术动态知道同行们都在做什么,怎么做,这样自己虽然未必会做,但是可以带领团队技术骨干去做。另外较强学习能力还在于领导者虽然未必去执行测试,但 是一定要能透彻理解要测试的东西。

  • LoadRunner脚本编写(6)— 数据类型转换和字符串操作

    2013-08-27 16:37:16

    一,数据类型转换51Testing软件测试网Z_.AW+A)D7H0c

    没有使用过C编程的LoadRunner脚本编写者会发现在数据类型转化方面比较困难。下面介绍这方面的知识。

    iL {&L S/C%MQ241266

    1. 相似函数的输出在不同的位置51Testing软件测试网;X6w/h(r D

    象很多C函数一样,使用atoi函数的结果即为返回值

    a}~G:Ji t3LDl241266

    intResult = atoi( charY );51Testing软件测试网5M4Prp0@y.v,R*yQ

    而:itoa的返回结果为第二个参数。

    }cu {(r4G241266

    itoa( intX, charY, 10);51Testing软件测试网/SB#XI,l$T

      第一个参数是需要转换的数字,第二个参数是转换后存储的字符数组,需要注意的是数组必须定义为固定的长度,如:char chary[20]51Testing软件测试网7MC-Y4ZUiBWf+[f)D

    数组的最大长度为3206432K),否则会出现“too many variables”编译错误。

    1EA1N!In'M/QVM241266

    如果定义为变长的字符串如char *charY,则程序会出错。

    V)?_b2C%S241266

      第三个参数不是数组的长度,而是数字的基数,10进制是最常用的,其他还有二进制,八进制,十六进制。51Testing软件测试网Cz3`:WU |

    2. 有一些函数实现了同样的功能

    P,I?u| dk_;s241266

    itoa不是一个标准的ANSI C函数但是是Cstdlib.h中的一个函数。所以它不被包括在unix机器上的LibC中。我们可以使用标准的sprintf函数来代替:51Testing软件测试网Efkd.f

    sprintfcharY,“%d”,intX);

    ?(?xsh$l241266

    3. 是用%X来转换一个十六进制数51Testing软件测试网3E6w cp5h1~q8^

    int intNum51Testing软件测试网L;F#S!xK9c

    sscanf(“ffff”,“%X”,&Num;51Testing软件测试网}aPYx5^

    lr_output_message(“%d”,intNum); //打印65535 ,ffff的整数值

    KU%W cK[3R,Dm241266

    4. 从文本中提取数字的规则51Testing软件测试网aQY!S xy7`8d3A-D c

    如果第一个字符不是数字或者为空,atoi返回0,即“e24”会返回051Testing软件测试网l&_0H&q4kk

    atoi转换一个非数字的字符会返回组成这个字符的数字,如“-3.2返回-3.0。“123XXX345”返回12351Testing软件测试网3JeG4Jy_ y ^5VyM

    5. LoadRunner脚本中的参数必须转换成C字符串。有两种方式来转化LR的参数为C语言的数字。

    sOI3m0Q3X A;o;\$@:w241266

     i = atoi( lr_eval_string("{pX}") );51Testing软件测试网RKh*P6j.K

    sprintf( intX, "%d", lr_eval_string("{pX}") );51Testing软件测试网x E(^/N^2[0IX

    6. 参数的算术运算

    H~r1c^0a9ij241266

    LoadRunner没有提供对参数的算术运算的函数。所以LR的参数必须:51Testing软件测试网 e)v!D"P6T K^

    1) 转换成C的整数

    ](LpZpq jw241266

    2) 使用C的函数来运算最后返回一个C的字符串51Testing软件测试网mHjc jj

    3) 把返回的字符串保存成参数51Testing软件测试网WYCg^c8S[b

    char cBuf[10];51Testing软件测试网'e s&[&\7@3Q~`

    int i;51Testing软件测试网0tN N?&_.H@

    // 1. Evaluate parameter into a C integer:

    +UkM*m&c#J jh2C2fW241266

    i = atoi( lr_eval_string("{pNum_in}") );51Testing软件测试网 iy N{r$L

    // 2. Do the math and output the result to a C string:

    ~R$W? r l2v241266

    sprintf( cBuf, "%d", i+1);

    5r4P!z5L0h%w241266

    // 3. Save the string as a parameter to be passed on:

    3^'zM)M(C{z5j/bN7B241266

    lr_save_string( cBuf, "pNum_out");51Testing软件测试网(x1D ]`"}M

    //Print out the parameter value after incrementing it.51Testing软件测试网}!xQ+hl1weW

    lr_message("**** Parameter from %s to %s",

    4Lg}rf7dM[c241266

        lr_eval_string("{pNum_in}"));

    M3xE`*U*VMM Q zL241266

        lr_eval_string("{pNum_out}"));51Testing软件测试网qFP1Z/O1M

    zibeike注:除了对于数字类型的参数的运算之外,对于文本形式的参数的操作,可以参考我的另一篇文章的内容:http://www.51testing.com/?34866/action_viewspace_itemid_75592.html51Testing软件测试网Axy ?7}:l1~

    二.字符串操作51Testing软件测试网.`-t a9OS

    C语言中,字符串是固定长度的,因为他们本身由独立的字符组成的字符数组。数组是只读的。任何修改字符串长度的函数调用都会报错:51Testing软件测试网f { ~*Z`g!\%V*G

    )gdP9k&a241266Error: "C interpreter runtime error - memory violation error during replay.51Testing软件测试网%Zp6zT%x Ol2N*W

    LoadRunneras_web.h库中的字符串函数可以使用“prototyping”声明的方式读写内存:

    G9}(w6z7V:pDr8M241266
    char *strtok(char *, char *); // tokenizer prototype
    char *strstr(char *, char *); // substring prototype
    char *strdup(char *); // String duplication prototype
    float atof(); // alpha to return float datatype
    #include "as_web.h"
    char *strtok(char *, char *); // prototype function call.
     
    ActionX()
    {
      char aBuffer[256]; // input string to be parsed.
      char *cToken; // individual token from strtok.
      char cSeparator[] = " "; // blank separator.
      int i; // incrementer
      char val[3][20]; // output array of strings.
      char modified_val[20];
        
      // Create a parameter named pDate:
      lr_save_string("January 2, 2001", "pDate");
     
      // Put parameter into a string buffer:
      strcpy( aBuffer,lr_eval_string("{pDate}"));
     
      // Show the buffer for debugging:
      lr_output_message("%s\n",aBuffer);
     
      // get first word (to the first blank):
      cToken = strtok( aBuffer,cSeparator);
      i = 1;
     
      if(!token) { // first token was not found:
              lr_output_message("No tokens found in string!");
              return( -1 );
      } else {
              while( cToken != NULL) { // tokens are not NULL:
                     lr_output_message("Token=%s", cToken);
     
                      // Stuff in another array:
                      strcpy( val[i], cToken );
     
                      // Get next token:
                      cToken =strtok( NULL, cSeparator);
                      i++; // increment
              }
              lr_output_message("Val #1 is: %s", val[1]);
              lr_output_message("Val #2 is: %s", val[2]);
              lr_output_message("Val #2 is: %s", val[3]);
     
              strncpy( modified_val, val[2], 1 );
              modified_val[2] = '\0';
              while (modified_val[2] != NULL) {
                      lr_output_message("===>%s", modified_val);
                      modified_val[2] = strtok(NULL, " ");
              }
      }
      return 0;
    }

    strcat连接两个字符串

    7@%J#b{gJ^}241266

    strchr返回指向第一个要查找的字符出现的位置的指针

    _K^/d;W0q ?r241266

    strcmp比较两个字符

    5e;TFHc241266

    strcpy复制字符串到另一个

    #s \~%]7nrjPl241266

    stricmp执行一个大小写敏感的比较

    0scWEkh ?,KRc241266

    其他还有strdupstrncatstrncpystrnicmpstrrchrstrsetstrspnstrstr等字符串操作的函数。

  • 给刚刚从测试工程师晋升为管理人员的测试管理者一些建议吧。

    2013-08-27 16:26:17

    1、测试管理者需要做到管理与技术并重。作为测试管理者,必须具备扎实的技术功底,同时具有良好的沟通协调能力。目前国内的很多小的测试团队技术实力偏弱,这就需要测试管理人员在测试策略等大方向的把握能力。

    2、在团队相对成熟的情况下,测试管理者不要管的太细,大方向把握好了,大局观有了,剩下的就应该放手让大家去做。这样一方面表达了你对下属的信任,另一方面能够充分发挥下属的主观能动性。

    3、作为测试管理者,必须勇于担当,敢于承担责任。如果做不到这一点,我个人认为就不是一个合格的管理者。

    4、在软件质量等原则性问题上,能够做到坚持自己的主见,敢于坚持原则。

    5、就测试项目而言,能够较好地把握软件质量和进度压力的平衡。

    6、做好团队氛围建设,创建积极的、对测试工作充满激情的团队,保持团队的交流,关心下属,共享成长的机会。

  • 近几个月测试的思考与反思

    2013-08-27 16:17:05

    1.针对一个页面,从页面的完整性(包括字段、输入框、功能点)出发

      2.对于分页,考虑未在首页的时候的测试,末页的情况。

      3.对条件的查询来说,要针对于单个输入框的测试、交叉输入框的测试

      4.对于删除、修改等,要考虑你删除完、修改完等测试用例的执行,往返测试

      5.访问的渠道,通过搜索引擎、浏览器、收藏夹等通道进入。

      6.先测什么而后测什么,不放过任何软件的死角。在测试中,一定要系统的看待问题,功能模块A的改动会否影响到其他模块的功能,不能想当然,一定要系统性的看待。有时候一个内存地址的改变,都有可能引起整个软件的崩溃

      7.针对性能这块,应该采取什么手段进行操作,以便更全面去覆盖所有的点。性能通常进行负载测试、压力测试、安全性测试来校验。但如何入手得经过实践出真知。

      8.针对于测试数据准备,我理解的数据准备原则应该是对web网站还是客户端来对于需要填写的数据进行验证,但有的数据是系统本身自带,需公司提供数据进行测试。但具体的数据需要多少还是很迷茫,数据来源从哪方面入手。执行是应该怎么执行

      9.通过冒烟测试与第一轮迭代测试,发现许多不足的问题。1.不管你在进行什么样的测试,你必须依托于测试用例来执行,但对于一些用力不足的地方,可以不用依托于测试用例,如数据验证、随机测试等。在执行测试发现BUG了,要记录到缺陷管理系统,并记录BUG摘要、BUG的描述和步骤,这样不但可以节省测试人员与开发人员之间交流BUG的时间,还可以加速开发人员解决BUG的进度。

      10.当提交BUG完,需开发人员去修复,并且发布,发布之后,测试人员在重新执行已发布的BUG,看是否解决,对于已解决选择关闭,对于未解决提出反馈。对全部已发布的BUG执行完,召开剩下未解决和已反馈BUG会议,会议主要针对于开发这边是什么问题导致这个BUG未解决还是遇到什么瓶颈,需要提供帮助。

      11.测试人员和开发人员之间的协调能力很重要,遇到BUG或在规定时间BUG没解决,容易造成双方有争执现象,在开发和测试感觉必须要搭一个桥梁来使双方都能更好的处理之间产生的问题。

      12.在研究一个BUG时,应考虑其类型、是否重复、哪种等级等,当我们在某种环境下发现BUG时,不是盲目的去登记,应考虑在多种环境下是否重现。

      13.近阶段的执行测试,发现测试不是单纯的发现BUG,而是应该去协调一些未实现的功能更多去详细解释,以便开发更快的去实现其功能。

      14.当我写入之前那么多BUG时,我发现并不是我想要,得不到那么多快感,我只是想说赶紧把未实现功能开发出来,不要总是在一直累积BUG,永远停留在那边,采取对开发人员去培训需求以便能够少出现更多的BUG。

      15.安装在不同分辨率,不同操作系统环境下测试看是否出现问题

      16.卸载后,是否出现桌面快捷方式、根目录、应用程序生成的文件夹是否还在残留着

      17.在磁盘空间不足的情况下去安装、保存、导出,是否会出现问题

      18.在测试时,注意操作上会因为失误而造成判断不精确

  • 软件测试面试 (二) 如何测试网页的登录页面

    2013-08-27 16:09:13

    字体:        | 上一篇 下一篇 | 打印  | 我要投稿  | 推荐标签: 面试 软件测试

      这个面试题碰到过很多次, 再次总结下来。

      具体需求: 有一个登陆页面, 上面有2个textbox, 一个提交按钮。  请针对这个页面设计30个以上的test case.

      此题的考察目的: 面试者是否熟悉各种测试方法,是否有丰富的Web测试经验, 是否了解Web开发,以及设计Test case的能力

      这个题目还是相当有难度的, 一般的人很难把这个题目回答好。

      阅读目录

      功能测试(Function test)

      1.输入正确的用户名和密码,点击提交按钮,验证是否能正确登录。

      2.输入错误的用户名或者密码,  验证登录会失败,并且提示相应的错误信息。

      3.登录成功后能否能否跳转到正确的页面

      4.用户名和密码,如果太短或者太长,应该怎么处理

      5.用户名和密码,中有特殊字符,和其他非英文的情况

      6.记住用户名的功能

      7.登陆失败后,不能记录密码的功能

      8.用户名和密码前后有空格的处理

      9.密码是否以星号显示

      界面测试(UI Test)

      1.布局是否合理,2个testbox 和一个按钮是否对齐

      2.testbox和按钮的长度,高度是否复合要求

      性能测试(performance test)

      1.打开登录页面,需要几秒

      2.输入正确的用户名和密码后,登录成功跳转到新页面,不超过5秒

      安全性测试(Security test)

      1.登录成功后生成的Cookie,是否是httponly (否则容易被脚本盗取)

      2.用户名和密码是否通过加密的方式,发送给Web服务器

      3.用户名和密码的验证,应该是用服务器端验证, 而不能单单是在客户端用javascript验证

      4.用户名和密码的输入框,应该屏蔽SQL 注入攻击

      5.用户名和密码的的输入框,应该禁止输入脚本 (防止XSS攻击)

      6.错误登陆的次数限制(防止暴力破解)

      可用性测试(Usability Test)

      1. 是否可以全用键盘操作,是否有快捷键

      2.输入用户名,密码后按回车,是否可以登陆

      兼容性测试(Compatibility Test)

      1.主流的浏览器下能否显示正常已经功能正常(IE,6,7,8,9, Firefox, Chrome, Safari,等)

      2.不同的平台是否能正常工作,比如Windows, Mac

      3.移动设备上是否正常工作,比如Iphone, Andriod

      4.不同的分辨率

      软件辅助性测试 (Accessibility test)

      软件辅助功能测试是指测试软件是否向残疾用户提供足够的辅助功能

      1. 高对比度下能否显示正常 (视力不好的人使用)

  • QC前台...“业务组件”模块的用法

    2012-03-27 11:49:04


    BPT(业务组件)是QC9.0主推的一个概念,它的本意是希望通过业务组件,将业务的用例设计(业务人员设计)和测试用例设计(测试人员设计)分离开,通过业务组件模块,我们可以设计手动测试用例,可以做些自动化测试用例的手动版(呵呵,有点乱用词了)。因为真正的业务人员可能对于设计测试用例很擅长,但是对于自动化测试工具就非常的不熟悉了。业务组件模块就是为了实现这个目的而存在的,我们也可以看到,其实业务组件里面大部分功能都是和测试计划模块相类似的,QC是慢慢希望将写测试用例的一部分工作(甚至是大部分工作)往业务组件模块迁移的。业务组件模块可以实现和QTP的联动,其中的application area是要在QTP中创建的,但是其深意我还没有完全参透。

    引入"业务组件"的概念,有助于我们实现业务流程之间的组合,组合不同的组件实现不同的流程测试,规范业务流程,提高测试的覆盖率,这是个扩展应用,但是我们暂时用不到这个功能,所以将之屏蔽掉
    屏蔽的方法,管理员进入qcbin之后-》自定义-》用户访问模块-》将业务组件对于相应的组进行关闭即可。


    注:
    Business Process Testing(业务组件测试)需要Mercury Quality Center与QuickTest Professional配合才能运作。同时测试团队中也需要二种角色,一是熟悉QuickTest Professional测试工具的人员(Automation Engineer),负责建立并维护Application Area、物件库(object repository)、library files、recovery scenarios,另外也需要负责对Business Component进行除错的工作;另一是非常熟悉业务流程的人员(Subject Matter Expert),透过Quality Center介面,设计Business Component以及Business Process Test并运用Application Area将其自动化。
    其实qc的业务组件模块功能与测试计划模块功能类似,一般企业不适合用业务组件这个功能,因为他需要业务人员参与到测试的整个流程中,而实际一般的公司这不存在这个情况。
    业务组件的操作流程,业务组件中的组件可以等同于测试计划中的测试用例。
    业务人员组织开发业务的测试流程(非脚本,仅限操作步骤)-》测试人员开发qtp的脚本与维护-》测试人员在测试计划中将业务组件(也就是测试用例)添加到测试计划中来,后面的流程与qc的基本测试流程是一致的。

  • aaa

    2012-03-27 11:44:15

  • QC9.0兼容IE8.0的解决方法

    2012-03-27 11:34:20

    QC9.0默认支持IE 6,不支持IE 7和IE 8的,一打开IE 7和IE 8的浏览器,输入qc网址,会出现提示:“Microsoft Internet Explorer : 4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) 不受支持!”

     

    但是随着公司里使用IE 7和IE 8的人越来越多,希望QC9.0支持IE 7和IE 8的呼声越来越高。网上google了一下有现成的解决方案,只要修改一下服务器端相关设置就可以了,这里我就直接粘贴上来了:

    解决QC对IE7,IE8的支持现在普遍的做法是直接在服务端安装目录下搜索start_a.htm这个文件,文件默认路径是: C:/Program Files/Mercury/Quality Center/jboss/server/default/deploy然后在该页面搜索msie,加入ie7.0的支持|| (ua.lastIndexOf(’MSIE 7.0′) != -1)|| (ua.lastIndexOf(’MSIE 8.0′) != -1)  增加这句即可。

    但是现在碰到的问题是每次重启QC服务器,会发现之前的设置没有生效,这是因为我们修改的是临时文件夹下的文件配置导致的。所以要一次性解决QC对ie7和ie8的支持,我们需要修改系统文件。方法如下:

    1. 在服务端QC的安装目录下jboss/server/default/deploy目录下找到20qcbin.war这个war包。

    2. 用winrar打开这个目录,可以看到start_a.htm这个文件。

    3. 把start_a.htm这个文件copy出来修改添加|| (ua.lastIndexOf(’MSIE 7.0′) != -1)|| (ua.lastIndexOf(’MSIE 8.0′) != -1)后替换  war包中的start_a.htm文件。这里也可以直接在原文件修改。

    修改配置成功后,下次重启QC服务也不会有问题。原因是重启服务器的过程中会把20qcbin.war中的内容解压出来到临时目录下的。

    这里注重:改完上面的配置假如不想重启服务器,就需要把temp中的start_a.htm这个文件也增加ie7,ie8的支持。只改系统文件是需要重启QC服务的~

    ps:这个方法源于在修改QC数据库的ip地址时关联想到的,修改ip地址是修改10sabin.war包中的文件。

    参照这个方法服务器端就改好了,但是我在用IE 7和IE 8的客户端浏览器打开qc的时候却发现仍然无法正常显示,页面出现提示信息,这是因为IE 8的安全性设置造成的,稍微改一下就好了:

    客户端配置:打开IE8,然后选择 工具-Internet选项-高级-安全,找到“启用内存保护帮助减少联机攻击”,把前面的勾去掉,点应用。就可以用IE8了。

  • 转载:怎样做一个让领导和开发人员认可的测试人员

    2011-08-15 16:08:37

    怎样做一个让领导和开发人员认可的测试人员

    字体:        | 上一篇 下一篇 | 打印  | 我要投稿  | 推荐标签: 软件测试

      -------------根据测试经验,个人理解!

      自己在测试这个行业多少也呆了近3年了的,在这3年中也接触了不少的测试项目,所以在测试过程中也遇到了不少的测试插曲,直到今天总算静下心来做个自我总结,也给测试同行们一起探讨我们测试人员在测试项目过程中与不同的人员的事情处理能力。

      在国内的测试人员在IT中现在也还是处于不是很主要的地位,作为我们测试人员怎样才能在公司中占有一席之地,这个是靠我们测试人员自己去争取的。

      对于我们测试人员,在测试过程中根据不同的公司和项目组织架构,我们经常与其打交到和相处的是:开发人员、项目经理或领导等等;可以说我们测试人员是夹在这2层关系之间的,做的不好就2面都不讨好的,所以我们测试人员除了要有过硬的测试技术之外,交际、处事、沟通能力也是我们作为测试人员必不可少的基本素质!

      1、作为领导认可的测试人员

      1)测试技术

      被测试完的项目交给客户使用或者客户测试后,被返回的好坏意见应该是领导最先知道的。所以如果返回的意见越少或者没有意见那当然是领导最想的,同时也是对我们测试人员的能力证明.(记得自己在测试某个项目的时候,测试完后交给QA、QC、监理进行测试没有找到一个缺陷,那领导的高兴劲;这个同时也给自己测试以后的项目增加了不少的信心)

      之外,我们测试人员在做项目测试的同时,也不能忘了学习,学习流行和先进的测试技术;把先进的测试技术引入到公司中(在现在的公司就先后给公司引入了TD和QTP并做过简单的培训)。这些都会使领导对我们测试人员的能力做出一个判断,至少对自己作为一个测试人员在测试技术上的一个肯定吧。

      2)办事能力

      办事能力主要包括我们的效率和质量。如果我们测试人员能在规定的时间或提前完成测试项目,而且测试的质量很高,那领导肯定是很满意的。

      3)主动沟通

      在测试过程中遇到需求不确定或者不明白,或者技术上有难题要主动与领导沟通,至少的要让领导知道这存在多大风险的,好让领导做出一些评估或做出一些技术上的支持等等,以免造成不必要的风险(如时间延后不能按时提交给用户;或者一些遗漏问题在交给用户后被用户发现);如果在测试过程中出现需求的理解与开发人员不一致时,要主动与领导讨论,不能一味的归结为开发人员的理解出错,然后3者讨论确定最后的结果。

     2、作为开发人员认可的测试人员

      1)首先还是谈技术吧;对于开发人员,关键是能找出一些实质的BUG,让开发人员首先对我们测试人员的能力是一种肯定,如果一个测试人员的能力首先都得不到开发人员的认可,那么你在测试过程中一定会回到很多的问题(如:开发人员对你测试的结果怀疑等等),所以对于我们测试人员,技术坚实是第一步的。

      即我们在繁忙的测试工作中,还得抽时间学习流行的、先进的测试以补充自己,使自己得到及时的充电,以最先进的技术去测试现有的项目(如使用自动化测试工具代替传统的收到测试)。

      2)其次谈表达能力;在我们找到BUG之后,这只是完成一名测试人员寻找BUG的第一个步骤,接下来的对BUG的描述也是很重要的。作为一名优秀的测试人员,不但技术得过硬,其表达能力也是不可忽视的。如果我们找到一个项目致命的BUG,但是由于我们的描述不清楚导致开发人员不明白我们所表达的意思,就有可能导致该BUG不能及时的修改;以至于可能导致该BUG在发布后才可能被发现或者项目延期等等。

      对于优秀的测试人员,本人觉得就是得为开发人员尽可能的节约时间(比如在BUG描述上尽可能的有简单明了的语言),因为在项目紧的时候开发人员的时间已经很紧张了,如果还得花费开发人员大量的时间去研究测试人员的BUG描述,开发人员可能会做的就是“该BUG能重现暂不修改

      等等的批准”;如果你的描述很清楚明了开发人员一看就知道,即使在开发的本机不能重现该BUG,开发人员也会找你和你讨论,并让你重现该BUG。

      3)主动与开发人员沟通;当在测试过程中,如果发现开发人员提交的测试程序与设计文档中有不一致的地方,我们就得主动与开发人员沟通,了解为什么会做这样的变动?是否得到了领导的批准等等?这样我们缺陷修复表中才能清楚的填写。

      在与开发人员沟通的时候也的找好时间,下面说下我所选择的时间:1、在上班、下班前一个小时不找开发人员谈论项目的有关事情,除非项目很紧或者是加班时间2、首先问开发人员忙不?是否有时间?免得打断开发人员的思维3、不在大家休息的时候谈论工作的(包括在办公室大家小聊的时候)

      在我们与开发人员沟通的时候,最主要的一点是不能带有个人情绪(比如与某某以前在谈论某个BUG的时候吵架过,在讨论的时候就带有情绪或者很有针对性的),这个是大忌!

      在讨论的时候,还是以谦虚为准,不要处处说是开发人员怎么怎么的,这会使得讨论陷入僵局,可能无法继续的。

      我们测试人员在测试不同的项目过程中,肯定会与不同的人交往的,我这里只是针对其中2个不变的角色进行了分析,当然这个也只是我的个人经验,若有不同的想法,欢迎大家提出!

     

  • 转载:如何写好测试用例

    2011-08-15 16:06:36

    如何写好测试用例

    字体:        | 上一篇 下一篇 | 打印  | 我要投稿  | 推荐标签: 软件测试 用例设计 测试用例

      面对这个题目,其实我并不想写,因为去网络上搜索“测试用例”为关健字的东东,出来的太多太多,各个凡有关能涉及或不涉及到的测试有关的都会有很多东西出来。如果大家仔细研究一下,其实内容大致差不多,只不过看自己是否能消化而已。

      在测试几年的过程中,打交道最多的是测试用例,从需求开始到方案,到形成用例,执行过程中与实际的出入,测试完成后用例的修改,维护等,没有一个过程可以说不需要测试用例之说。但我今天还是写了关于测试用例的,不是写如何设计编写,而是如何写“好”。让人看了一目了然,就看有新人拿到这个用例,能对程序有一点点基本的了解,就可以按照用例完完整整的执行下去。

      在短信回执的测试用例里,我没有修改过的用例是很少的,在组员编写测试用例过程中我总会强调简单明了,其实就是精华。我认为有以下几点要关注:

      1、对功能的理解。这个是最重要的,也是能反映出每个人对同一功能描述而有不同的理解方式,故一定要深刻理解功能。

      2、编写用例永远要考虑两面性。事物都是两面的,只有一面的事物那是“怪物”,所以在编写测试用例时先要心中有数。

      3、确定测试用例的目的。如果不了解为何要写这个用例,那你达到的目的就是按需求或者按任务来完成而已,这样的用例是否适用还有待于商榷;只有了解这个功能的来源,为什么要做这样的功能,希望最后的结果是什么,这些通通考虑清楚了,就不会为了完成任务而去编写出“普通”的测试用例,而是一份优秀合格的测试用例,这样会大大提高工作效率及审核打回的次数。

      4、测试用例所包含的内容:最基本最简单的测试用例应该包含四项内容,即描述、预置条件、操作步骤、预期结果。一般为更好的管理及维护测试用例,我们会增加测试用例的编号及功能。

      1)测试用例的描述项,一般人在写的时候根本不去关心这到底有何用,有的甚至为空,更有甚者把需求中的几个字直接复制过来,不管是否通顺与否都放在那里认为就可以了,预置条件可以说是一个总结语,即你要明白这个用例是要验证什么的,因为一个功能有很多用例,你不可能每个描述都是一样的,那这样还不如不要描述。

      2)预置条件项,任何一个事务都有起源,有始有终才是一个完整的过程,预置条件也可以说是一个基础,基础打好了,一切才能顺利动工。预置条件是为操作步骤服务的,当然有些可能说不需要预置条件,其实任何用例都是有预置条件的,我们说没有预置条件只是隐藏了本身的特点而已。简单来说,发送一条命令测试用例,前期不需要预置条件,但其隐藏的就是有号,且通信正常,还要有MONEY用来发送短信;但实际中我们并不需要写这些预置条件,因为是这是本身特点决定的。

      3)操作步骤是非常重要的一环,与预期结果是等同的地位。测试用例设计是否高效,由预置条件及操作步骤决定,在操作步骤中,按正常步骤来测试,好像都不会出问题,但真正出问题的就是你想不到的,不是按常规则出牌的才会发现真正有价值的缺陷,所以在设计测试用例时,不要嫌麻烦,认为那一项就好了,别的都应该能检测到,认为写某一项是不必要的,多余的,其实这些想法是错误的,问题就往往出现在你认为这无关功能上。

      设计操作步骤还依赖于测试经验是否丰富,有些经验丰富的人员设计的测试用例往往会出乎意料,也是在测试阶段最容易发现问题的用例。比如很简单的一个编辑功能,要求其内容不能重复,一般人在写用例的时候都在编辑中去修改成别的名字,而有经验的测试人员会直接编辑一下而不改变内容,一般的程序员是不会考虑到此问题的,如果说出现提示错误一般都是程序逻辑问题。

      4)预期结果,此项是验证所写用例是结果如何,所以如果没有预期结果,在测试时则无任何可参照的,预期结果与操作步骤的关系相当大,一般来说,不同的操作步骤能生成不同的预期结果,因此在测试测试用例的时候,尽可能的考虑不同的操作步骤,是否会产生同一个结果,所有有时在设定测试用例的时候,根据结果来推断操作步骤,这也应该是设计用例时的一种参照方法。在测试时,预期结果直接导致着测试是否通过。

      以上仅是我对设计测试用例的一些观点,完全是自己本人的经验总结,而没有去抄写任何书上写的如何设计测试用例的观点,设计测试用例的过程就是对需求的深入了解,也能反映出一个人对需求的理解程度如何,达到一个什么程度,也可能反映出一个是否有较强的总结能力,每次用例设计完,是否较上次有进步等。

      测试用例作为测试的一个总纲及指导作用,故,对于测试用例的设计是不能马虎,不能省略的一个步骤,产品是否上线,测试用例是否通过起着决定性的作用。

      设计测试用例一般还包括性能测试用例,但对于性能测试用例,大多情况下,起到一劳永逸的作用。但实际上对于性能测试用例来说,一般只是说并发多少用户,并不会设计具体要如何操作等,所以在此文章中,我就不介绍如何设计好性能测试用例,如果可能,将来再把我的测试想法与经验与大家分享。

    document.write(''.replace(/%url%/,encodeURIComponent(location.href)));
541/3123>
Open Toolbar