简单+勤奋,把测试当做一番事业去奋斗!

发布新日志

  • [论坛] 软件测试中需求不明确的测试方法(转)

    2009-06-18 21:11:22

     软件生命周期中,需求是整个周期的源头。良好的开端,是成功的一半。需求的重要性自然不言而喻。但是,在很多企业中,并没有对需求引起足够的重视。原因并不是PM们不知道需求的重要性,而是商业竞争中不得不裁剪某些看似不能获得很大利益的步骤。
      什么是需求?很多PM和开发人员都未必真正考虑过这个问题。IEEE对需求有以下两种定义的方式。
      1. 解决用户问题或达到用户目标需要具备的条件或能力
      2. 遵守合同、协议、规范或其他要求
      然后用规范的文档描述出来,就成了我们熟悉的SRS。
      我们常说的需求,其实并不是我们认为的SRS。SRS应该叫做需求规格说明书。那需求是什么呢?与需求规格有什么区别?
      需求:对要实现的功能的粗略描述
      需求规格:对需求的精确定义
      我们知道,在软件开发过程中,只有得知了需求的精确定义,才能开展工作。比如功能方面,编辑框能支持多少位字符。性能方面,时间和容量规定等。当然还包含其他非功能,性能方面的定义。
      除了以上所说的需求,对于测试人员,还必须有测试需求。这个环节,很少有企业会重视。测试需求分为2方面:
      需要测试哪些方面
      软件是否可测,需要增加哪些开发需求
      其中第一条,很多企业都列到了测试计划中,这也可以,没有规定一定要放到哪个文档里。但是对于第二条,可以说几乎没有多少企业去做。
      接下来,在没有明确需求,需求规格,测试需求的情况下,我们怎么去做测试呢?现在很多企业,其实就是在这种情况下做项目的。
      当测试人员接手一个项目后,第一件事情一定是想了解这个系统的功能,背景,架构。于是,马上就会想得到需求文档。但结果往往是失望的,根本没有文档,或者文档根本不具备参考价值。此时不必太失望,因为这种情况实在是太常见啦。这时,请试着从以下几个步骤着手。
      查阅文档:文档是最具权威的,也是记忆最长久的。有时,我们的项目可能是在原有产品的基础上,进行版本升级。这时,先去找找,有没有原有版本留下的需求,或者是用户手册等文档。从这些文档中,了解项目的背景,系统的基本功能。这对了解新项目是有很大好处的。并且,在产品升级的项目中,验证老版本的功能在新版本中是否正常,也是一个必要的工作。可以先参考老版本的相关文档,设计新版本中的用例。
      也有时,我们的项目是一个行业项目,比如金融项目。我们可以参考一些行业知识的书籍,文档。这对理解系统也有很大的好处。
       实在没有文档,那只好暂时跳过这一步骤了。
      在进入下一步骤之前,你可能得到了一些相关文档,也可能什么也没得到。无论如何,你可能对系统已经有了一些了解。这时,请记录下来,写成文档。无论是对自己,还是对别人,在以后都可能极有参考价值。试想一下,如果前人已经给你留下了这些文档,你是否可以轻松很多?还要注意及时更新你的文档。因为你对系统的理解,随时都在变化着,一定要保证你的文档和当前你对系统的理解是一致的。
    试着使用系统,根据经验和常识猜测:既然没有需求,那可以推测,该项目的管理一定是很糟糕的,对软件测试也不会投入很大的成本。因此,测试人员一般都是在编码完成后才进入项目。这时,应该已经可以看到成型的系统了。在没有需求的情况下,试着先“玩”一下系统吧。在这过程中,你应该对系统有可更深入的认识,在上一阶段中,你可能留下很多疑惑或是猜测,这时应该能排除一部分了。
      使用系统的同时,你应该具备行业知识。系统可能是针对某个专业领域设计的。例如一个期货交易系统。你没有基本的期货知识,比如什么是持仓,什么是平仓。那么你如何能真正理解这个系统呢?当你有了业务知识以后,你会进行更深入的思考,来全面测试系统。
      你还需要具备良好的软件知识。比如某些控件的特性。单选框只能单选,不能多选。日历控件是否可以手工输入非法格式等。这些都是应具备的意识。
      最后加上你的主观判断,你对系统的整体感觉怎么样?是否越用越厌烦,为什么厌烦。系统的反应速度是否可以容忍,细节处理是否圆滑,等等。
      在你认识系统的时候,可以使用一些方法,来帮助你更有效率地学习。比如可以画一些流程图。一图胜万语。同时,你也留下宝贵的文档。当然,这个步骤中,你也要随时注意保留和更新文档,以备后用。
      沟通:需求规格不一定非要以文档的形式表现出来。软件既然能做出来,那肯定是有需求的。而最清除需求的,一定是软件的直接制造者,开发人员。开发人员自己知道需求,但一般不会主动和测试人员沟通。因此,测试一定要主动和开发人员沟通。可以安排会议,让开发人员给测试人员介绍系统,并演示系统。让测试人员对系统有一个整体了解。然后测试人员能进行更细致的测试。在进行细致测试的时候,一定会有更多不明确的地方。这时就需要利用自己的行业知识,计算机知识等,猜测一部分。不需要每个细节都去询问开发人员。因为开发人员也有自己的工作,他们不希望花太多时间来给你解释。
      有些项目中,客户会直接参与到项目组来。这时,测试人员在权限允许的情况下,可以和客户进行沟通。客户那得来的需求,是最原始的需求。但是,客户未必有良好的表达能力来描述希望的功能,也未必有计算机知识,因此不能描述出一些隐式的需求。在被允许的情况下,测试人员可以和客户进行交流,不仅可以帮助客户正确描述出真实需求,测试人员也能详细了解需求。但是项目是要考虑成本的,客户的期望是无限制的。在客户提出需求以后,测试人员要先和PM或其他相关负责人协商后,才能将与客户交流得来的需求,作为测试的依据。同事,第一时间告知相关开发人员最新的信息,也记录成文档。这时,你就将非文档形式的需求,转换为文档形式了。至于文档的格式,不一定要按照标准SRS的格式。因为它本身就不是个规范的SRS。以任何容易理解的方式,组织你的文档。
      有时候,会根本找不到可以沟通的人。不要奇怪,确实就是有这种时候。比如:
    1. 测试一个开源软件
      2.  接到一个测试外包,但又没有得到相关文档,为了追求利益,还是接下了
      3.  软件项目组的部分人员已经联系不上等等
      这时候,一方面需要PM协调获取相关资料,联络相关人员。另一方面,测试人员也可组织头脑风暴,利用集体的智慧,共同探讨和猜测软件中的各个环节。也可以安排Bug Bash,让尽可能多的人员参与随机测试。一定会有人提出具有创造性的意见的。
      在进行以上步骤的时候,利用良好的工具,能让你事半功倍。我经常在使用的一个工具,就是Mindjet MindManager。这是一个很好的,帮助扩展思维的工具。它以分支的形式,来表现你的思维层次。你可以先列出个最基本的系统整体结构,然后逐步细化,增加分支。不要急于一次就将真个系统分析透彻,这是不可能的。你在进行以上步骤的时候,随时会细化这个结构。当项目结束后,看看这个结构图,简直可以当作SRS来参考了

  • [论坛] 曝光腾讯面试全记录(转)

    2009-06-18 20:52:59

    大概在四月份的时候去腾讯(成都)参加了面试,整个面试过程有很多东西值得推敲,一直有想要写出来和大家分享,但是一直觉得没有足够的沉淀或者是没有办法写出自己想要表达的东西,在这里需要感谢小白羊同学的鼎力推荐和支持,感谢腾讯成都的黄MM,感谢Gloria给我面试的机会,感谢负责我二面的两位腾讯HR。

      因为腾讯在2009年加快了在成都地区的扩张速度,所以我偶尔也会有去关注腾讯的招聘信息。我当时比较关注的职位是,我的理解会像是“雅虎搜索质量监控小组”差不多的工作内容,因为事实上我之前有仔细对比过多个搜索引擎的搜索结果,虽然腾讯旗下搜搜号称搜索数据来自Google,但是仍然会对排名进行微调,这部分的工作应该就是由他们招聘的这个职位来做,工作会有点枯燥,但是仍然不失为一个好的锻炼机会。

      尽管如此,我当时仍然仅仅是关注而已,因为个人感觉腾讯发布的招聘信息多半是竞争激烈,巧的是之前的同事小白羊同学现在蹦达到了腾讯,而且恰好也在这个部门,问我需不需要内部推荐。有机会当然不要放过,在把简历发出去之后等面试通知的同时开始作一些准备。

      Tips:互联网企业的招聘通常内部推荐的成功率比较高,一般能够能够直接得到面试机会,避开了淘汰率最高的简历初选。

      复习一些关于搜索引擎的一些常识,同时仔细了解腾讯旗下搜索品牌搜搜的产品布局,了解产品的近况。

      简历精简到一页纸以内,剪了头发让自己看起来更精神,同时最重要的一点是去了解腾讯的面试流程和常见的一些问题,这些大家可以在网上搜索一下,了解下别人的面试经历,对自己也会比较有启发。

      Tips:面试前的准备很重要,不仅包括硬实力(简历、仪容),还包括软实力(公司职位信息、产品信息、面试流程和常见问题的回答)的提升。

      四月一号,发放简历
      发出了简历,因为是直接发给部门主管,所以在邮件里面阐述了一些对于腾讯产品的看法以及自己为什么想要进入腾讯和得到这份工作,邮件的内容可以诚恳一点的基础上适当表达自己的想法。

      四月二号,收到面试通知
      第二天就收到了HR发来的短信通知我四月八号下午面试,没有同时也用邮件通知。感觉他们这点做得有点问题,假设我恰好那天手机停机,那不就收不到消息,囧。短信内容还算是详细,面试时间、地点、注意事项、公交换乘信息一应俱全。

      根据从小白羊同学处刺探到的信息,一面的主要是笔试和一些简单的问答,自己选择性地进行了一些准备,这个部分其实没有太多东西需要做的,因为本身个人就比较关注业界和搜索引擎比较多,大家在面试前可以有选择性地进行强化。


    四月八号,面试
      因为今天是一面的关系,提前请了一天假,虽然面试是在下午,但是还是很早就起来了,把简历、口香糖一些有的没有的东西都准备完毕,查了详细的公交换乘线路。

      另外绿箭绝对是面试的好搭档,除了可以让你保持口气清新外,脸部肌肉的咀嚼可以充分舒缓自己紧张的情绪。

      我到达腾讯的时候是下午两点,面试通知的时间是两点半。一走到门口,帅气高达的保安哥哥就把我引到前台MM那边签到,腾讯成都的前台MM个子好像都不矮的样子,蛮PP。

      因为约定的时间还没有到,所以前台MM把我带到背后的休息区,已经有一个MM已经先我到了。反正没事儿就随便攀谈了几句,后面又陆陆续续来了几位一起来面试的朋友,看我和那MM谈的火热还以为我们俩是认识,笑。

      过了一会儿,HR MM把我们带到三楼的会议室,开始一个小时的笔试。之前有了解过腾讯的笔试题一部分和公务员的行政能力测试有点类似。

        笔试的内容主要包括三个部分:一个部分是逻辑思维能力测试,主要是一些数字找规律的题,大家可以针对性地找行政能力测试的题瞅瞅,不会有差很多;一个部分是搜索引擎优化的常识,都不太复杂,一些简单的常识;最后一个部分可能是与工作相关度比较高的,主要是关于搜索引擎分词、分类以及一些通配符,都不太难,只是理解上会花一定的时间。

      我大概四十分钟做完,必须要承认的是逻辑思维能力部分的题有一部分是想不出来胡乱猜的,其他两个部分的题难度都还好,不过事后小白羊帮我问的笔试成绩是不太好,不知道是不是自我感觉太良好,囧。

      因为还有一段时间的空闲,所以我就中途出去上厕所,腾讯的厕所墙壁上面都会有贴一些短小的笑话,让人心情愉快,这也算是腾讯文化中的一部分吧。回来的时候我看一认真工作的MM,以为是小白羊同学,所以敲了一下桌子,一抬头就发现认错人,只好说了声Sorry落荒而逃,我在这里对打搅那位MM的工作真诚地说声对不起。

      回来会议室不长的时间里大家都完成了,这时候Gloria也进来了,先提了一个问题:大家有谁知道我们这个职位是做什么的?

      其实这个问题算是蛮简单的,不过另外一个MM让我大跌眼镜,她回答是网站内容编辑,估计这个MM功课有做比较少,可能都不知道腾讯旗下有个搜索品牌叫做搜搜,我的回答是这个职位是致力于腾讯旗下搜搜的搜索结果的评测和改进,看起来Gloria好像还算满意。

      一面的第二个部分就是让大家十分钟集体讨论,主题是一个博客怎样进行搜索引擎优化可以获取更好的排名。

      这个部分的状况比较混乱,实际的状况就是都比较想要表现自己,但是又提不出太实质性的东西。我提了独立空间、Wordpress、独立域名、站内链接、付费链接、站群,如果要我给自己打分的话只能够打到50分,主要是临时team的协作能力不够,而这个讨论的重点就是看大家的协作能力。一个MM主动做笔记,这种情况如果你不是很突出,甘当绿叶是一种不错的选择。

      最后就是收了大家的简历让大家回去等通知,顺便说下Gloria是一个很亲和的人,下电梯的时候遇见小白羊同学,她还是一如既往地瘦(应该多多滋补下)。这时候我才知道那个做笔记的MM也是她朋友,大家交谈了一下就各自回家。那个MM是乐山的,需要当天赶回去加班,我还害别人公交坐过站(囧)。

      一面的总结个人感觉是还好,过得希望比较大,在下一周收到了四月十七号进行二面的通知,二面是我难以忘记的伤痛,一面奇好,二面奇差是我个人对这次面试的总结。

      Tips:尽量把时间掐算好,最好是提前二十分钟到会比较好,不会让别人觉得比较窘迫,你也会有足够的时间适应环境和调适心情;准备多条公交换乘线路和多种后备方案,有备无患;如果有机会可以和一起面试的朋友交谈一下,可以有效舒缓压力。

     


     四月十七号。复试
      轻敌是我二面失利的重要原因,在我的潜意识里会认为说一面是主要的,HR面可能只是作为参考意见,尽管事前知道是北京成都两地HR联合面试这种想法依然没有太大的改观。

      我还是在差不多的时间到达腾讯,我没有做到很好的审时度势,事实上的状况是面试已经开始,就在距离我不远的一个小间,我都可以听到问答的声音。但是我没有联想到那里就是我进行HR面的地方,并且我也完全没有发现HR面随时可能开始,这为后面的惊慌失措埋下伏笔。

      过了一会儿前台MM带我过去那个小间,两位HR一男一女正襟危坐,会给人点压力。他们先作了自我介绍,然后我把简历交给他们,他们问了几个问题,而且都是步步紧逼那种。

      先大概问了下我离开之前公司的原因和现在的状况,然后问到你从一个副理的到腾讯做一个普通的搜索引擎评测专员,能不能向我们说一下原因,我的回答大概就是因为之前的工作也是与搜索引擎有关的,并且腾讯的一些工作流程和企业文化是值得我来学习的。

      说实话这样的回答连我自己都不满意,不过这还不算糟糕的,只是噩梦的开始而已。

      他们问说你毕业应该不久,假设你寝室的室友有ABCDE,请分别表述你对他们的评价。听到这个问题我就懵了,因为确实没有想到会是这样的问题,就算是平时我们也会很难去一个个表述清楚吧,这个问题对个人的口头表达能力和思维反应能力是很大考验。我的回答超级含糊的,我自己都可以感觉这份offer正在逐渐离我远去。什么?你觉得这样已经够了?不对还没完,下一个问题会更让你崩溃的。

      他们后续的一个问题就是,假设你寝室的室友有ABCDE,请分别表述他们对你的评价。My God!我的脑袋瞬间脱线,怎么回答的都不知道,肯定超级糟糕。

      然后是我有没有什么需要问他们的,我询问了一些关于腾讯怎样应对低龄化的问题,以及腾讯最近的口碑产品战略。他们进行了一个简单的回答,很官方的回答。

      后面的就很简单了,感谢我参加这次面试,脑袋昏昏沉沉的,只有出来的时候风吹过才有让我更清醒一点。

      面试终结,我自己大概都可以猜到结果,后面小白羊帮我问的结果就是被Fire,简历进入人才库。

      这次面试的体会更多是千万不要轻视HR面,越是大公司越是如此,他们的思维是选择优秀的人,但是优秀的人和技术优秀是两个概念,他们有一套完善的人事模型。大概看了一下,写了三千多字,很久没有写这么长的东西了,希望大家会有借鉴的地方。

      另外最后要和Gloria说声Sorry,我在四月二十六号的时候才想起写感谢信,也许她自己并不在意,但是我个人会感觉这是一种很失礼的行为,So terrible,再次感谢她给我这次面试机会。

    来源:世界经理人

  • 编程对测试人员意味着什么?(转)

    2009-06-11 22:59:52

    说说“编程对测试人员意味着什么?” 

    首先要说,我并不是狭隘的“QA主义“者,也并不反对测试人员学习编程,提高编程能力。而是我们要对编程对测试人员的作用有一个清晰的认识。

    从我个人来说,可以说我一直以来就是编程能力的受益者。

    我这6年的工作中,从职位来说5年是在做QA,只有最开始的一年在做Dev,但一直以来我就没有停止过编程的工作。开始是用c/c++,然后是javaruby,现在用得比较多的是bash。我做过c51单片机程序,j2ee项目,用pythonruby开发过比较复杂的自动化测试系统。商业测试软件使用过robotqaload,等等。我写的代码质量丝毫不比一个普通的开发人员差。

    但是我并不打算学好编程技术而转行去做Dev,也并不是为了做自动化测试而学习编程。大部分的时候我的职位是一名黑盒测试工程师,我热爱这个工作,并且一直干得也很出色。只有一段短暂的3个月我是全职的性能测试工程师,但当回到黑盒测试的时候,我发现我依旧非常享受发现bug的过程。

    最开始的时候,我只是因为喜欢编程而编程,就像我喜欢测试而去做测试一样。所以我把大量自己的业余时间花在学习编程和软件设计开发上,后来我渐渐发现,编程能力也是软件测试的能力的一个重要方面,因为编程能力能让你更高效的测试

    即使你不是自动化测试工程师,也并不打算去做白盒测试,我仍旧强烈建议你学习一门通用的脚本语言,在ruby/python/perl中选一种,如果还有时间和经历,再学习一门通用的编译语言在c/java/c#中选一种。

    举一个例子,我现在测试的系统在安装好之后需要在命令行进行一些繁琐的配置工作,这些工作是重复而且容易出错的(我的记忆力不好)。后来我写了一个expect脚本来帮我完成所有这些工作,一个命令就搞定了。所以不但我节约了时间,而且我可以以最好的状态去开始真正的测试。

    这样的例子,太多了。毕竟,我们工作的对象和环境就是程序和程序构成环境,很多地方都有程序的用武之地。比如测试中需要一个包含100000个文件的目录。几行代码就能完成手工不可能完成的任务。

    追求更高效的测试是一个测试人员不断提高自己水平的动力之一,在这一点上编程能力真的有意想不到的作用哦。

    作为总结,我想说我对编程能力对测试工程师的作用的看法是,它很重要,但并不是核心的能力。它,是为了让我们更高效的发现bug,那才是测试工程师最核心的能力。

  • JDK配置环境变量

    2009-06-10 21:52:29

          下载好的JDK是一个可执行安装程序,双击安装。记录安装路径:C:\Program Files\Java\jdk1.6.0_13\

     

       

         JDK安装完成之后我们来设置环境变量:

     

          我的电脑点右键,选择属性,选择高级标签,进入环境变量设置,在系统变量栏分别设置如下三个环境变量: 

         1、 JAVA_HOME

          设置JAVA_HOME有三点好处,

        (1)方便引用,比如,JDK安装在C:\Program Files\Java\jdk1.6.0_13\目录里,则设置JAVA_HOME为该目录路径那么以后要使用这个路径的时候只需输入%JAVA_HOME%即可避免每次引用都输入很长的路径串

         (2)JDK路径改变的时候仅需更改JAVA_HOME的变量值即可

         (3)第三方软件会引用约定好的JAVA_HOME变量不然你不能正常使用该软件

        系统变量中没有此变量,所以需要新建

           变量名: JAVA_HOME 

           变量值: C:\Program Files\Java\jdk1.6.0_13\

     

           2、Path

     

            设置好path变量,使得我们能够在系统中的任何地方运行java应用程序,JDK安装在C:\Program Files\Java\jdk1.6.0_13\目录下,那么在C:\Program Files\Java\jdk1.6.0_13\目录下就是我们常用的java应用程序,我们就需要把C:\Program Files\Java\jdk1.6.0_13\这个目录加到path环境变量里面。我们已经设置了JAVA_HOME,所以可以使用%JAVA_HOME%代替目录,

           变量名: path 

           变量值: %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

         

           3、CLASSPATH

          

            classpath环境变量,在开发java程序时需要引用别人写好的类时,要让java解释器知道到哪里去找这个类。通常,sun为我们 提供了一些额外的丰富的类包,一个是dt.jar,一个是tools.jar,这两个jar包都位于C:\Program Files\Java\jdk1.6.0_13\目录下,所以通常我们 都会把这两个jar包加到我们的classpath环境变量中

     

         变量名: classpath 

             变量值: .;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar

            

             CLASSPATH最前面是有个 “.”的,表示当前目录,这样当我们运行java AClass的时候,系统就会先在当前目录寻找AClass文件了。

  • 如何进行Socket编程(转)

    2009-06-09 22:55:23

    进程通信的概念最初来源于单机系统,由于每个进程都在各自的地址范围内运行,为了保证两个相互通信的进程之间既不互相干扰,又协调一致的工作,操作系统为进程通信提供了相应设施,如UNIX BSD中的管道(pipe),有名管道(named pipe)和软中断信号(singal),UNIX system V的消息(message)、共享存储区(shared memory)和信号量(semaphore)等,但都局限于用在本机进程之间通信。网间进程通信要解决的是不同主机进程间的通信问题(可把同机进程通信看作其中的特例)。为此,首先要解决的是网间进程标识问题。同一主机上,不同进程可以用进程号(pid)唯一标识。但在网络环境下,各主机独立分配的进程号不能唯一标识该进程。例如主机A赋予某进程号5,在B主机也可以存在5号进程,因此5号进程这句话就没有意义了。其次,操作系统支持的网络协议众多,不同协议的工作方式不同,地址格式也不同。因此,网间进程通信还要解决多重协议的识别问题。为了解决上述问题,TCP/IP协议引入了下列几个概念。  

    端口  

        网络中可以被命名和寻址的通信端口是操作系统可分配的一种资源。按照OSI七层协议的描述,传输层与网络层最大的区别是传输层提供进程通信能力。从这个意义上讲,网络通信的最终地址就不仅是主机地址了,还包括可以描述进程的某种标识符。为此TCP/IP协议提出了协议端口的概念,用于标识通信的进程。  

        端口是一种抽象的软件结构,包括一些数据结构和I/O缓冲区。应用程序即进程通过系统调用与某端口建立连接(binding)后,传输层传给该端口的数据都被相应的进程所接收,相应进程发给传输层的数据都从该端口输出。在TCP/IP协议的实现中,端口操作类似于一般的I/O操作,进程获取一个端口,相当于获取本地唯一的I/O文件,可以用一般的读写原语访问。  

        类似于文件描述符,每个端口都拥有一个叫端口号的整数描述符,以区别不同端口。由于TCP/IP传输层的两个协议TCP和UDP是两个完全独立的软件模块,因此各自的端口号也相互独立。如TCP有一个255号端口,UDP也可以有一个255号端口,两者并不冲突。  

        端口号的分配是一个重要问题,有两种基本分配方式:第一种叫全局分配这是一种集中分配方式,由一个公认的中央机构根据用户需要尽行统一分配,并将结果公布于众,第二种是本地分配,又称动态连接,即进程需要访问传输层服务时,向本地操作系统提出申请,操作系统返回本地唯一的端口号,进程再通过合适的系统调用,将自己和该端口连接起来(绑定)。TCP/IP端口号的分配综合了两种方式。TCP/IP将端口号分为两部分,少量的作为保留端口,以全局方式分配给服务进程。因此,每一个标准服务器都拥有一个全局公认的端口叫周知口,即使在不同的机器上,其端口号也相同。剩余的为自由端口,以本地方式进行分配。TCP和UDP规定,小于256的端口才能作为保留端口。  

    地址  

        网络通信中的两个进程分别在两个不同的机器上。在互连网络中,两台机器可以位于不同的网络,这些网络通过网际互连设备(网关,网桥,路由器)连接。因此需要三级寻址。  

        1。某一主机与多个网络相连,必须指定一特定网络地址;  

        2。网络上美一台主机应有其唯一的地址;  

        3。美一主机上的每一进程应有在该主机上的唯一标识。  

        主机地址就是IP啦,不必多说。进程唯一标识符是十六位整数端口号。  

    网络字节顺序  

        不同的计算机存放多字节值的顺序不同,有的机器在起始地址存放低位字节,有的则相反。为保证数据的正确性,在网络协议中需指定网络字节顺序。TCP/IP协议使用16位整数和32位整数的高价先存格式,他们均含在协议的头文件中。  

    连接  

        两个进程间的通信链路称为连接。连接在内部表现为一些缓冲区和一组协议机制,在外部表现出比无连接高的可靠性。  

    半相关  

        综上所述,网络中用一个三元组可以在全局中唯一标是一个进程:(协议,本机地址,本地端口号)这样一个三元组,叫做一个半相关,他指定连接的每半部分。  

    全相关  

        一个完整的网间进程通信需要有两个进程组成,并且只能使用同一种高层协议。也就是说TCP和UDP没法通信。因此一个完整的网间进程通信需要一个五元组来标识:  

        (协议,本机地址,本地端口号,远地地址,远地端口号)这样一个五元组叫做一个全相关。  

        在TCP/IP网络应用中,通信的两个进程相互作用的主要模式是客户机/服务器模式,即客户端向服务器发出请求,服务器接收到请求后提供相应的服务客户机/服务器模式的建立基于以下两点:首先,建立网络的起因是网络中软、硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用。其次,网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立一种联系,为二者的数据交换提供同步,这就是基于客户机/服务器模式的TCP/IP。  

        客户机/服务器模式在操作过程中采取的是主动请求方式:  

        首先服务器方要启动,并根据请求提供相应服务:  

        1。打开一通信通道并告知本地主机,它愿意在某一公认地址端口上(周知口,如http为80)接受客户请求。  

        2。等待客户请求到达该端口。  

        3。接收到重复服务请求,处理该请求并发送应答信号。接收并发服务请求,要激活一新进程来处理这个客户请求。新进程处理此客户请求,并不需要对其他请求做出应答。服务完成后,关闭此新进程与客户的通信链路,并终止。  

        4。返回第二步,等待另外的客户请求  

        5。关闭服务器。  

        客户方:  

        1。打开一通信通道,并连接到服务器所在主机的特定端口。  

        2。向服务器发出服务请求报文,等待并接收应答;继续提出请求。  

        3。请求结束后关闭通信通道并终止。  

        从上面的描述过程可知:  

        1。客户与服务器进程的作用是非对称的。因此编码不同。  

        2。服务进程一般是先于客户请求启动的。只要系统运行,该进程一直存在,直到正常终止或者强迫终止。 

        在UNIX世界中,网络应用编程界面有两类:BSD的套接字SOCKET和SYSTEM V的TLI.由于Sun公司采用了支持TCP/IP的BSD系统,TCP/IP的应用有了更大发展其网络应用编程界面Socket在网络编程中已成为标准。并且也早已经进入了MS的世界。  

        TCP/IP的Socket提供下列三种类型的套接字  

        1。流式套接字(SOCKET_STREAM)  

        提供了一个面向连接,可靠的数据传输服务,数据无差错,无重复的发送且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。FTP协议即采用流式套接字。  

        2。数据报式套接字(SOCKET_DGRAM)  

        提供了一个无连接服务。数据包以独立包形式被发送,不提供无错保证,数据可能丢失或重复,并且接收顺序无序。网络文件系统NFS使用数据报式套接字。  

        3。原始式套接字(SOCKET_RAW)  

        该接口允许对较低层次协议,如IP、ICMP直接访问。常用于检验新的协议实现或访问现有服务中配置的新设备。  

    基本套接字调用  

        创建套接字--socket();  

        绑定本机端口--bind();  

        建立连接--connect(),accept();  

        侦听端口--listen();  

        数据传输--send(),recv();  

        输入/输出多路复用--select();  

        关闭套接字--closesocket();  

          

        不论何种语言,和socket打交道都是这一组调用只是在格式上有一点点差别。我只使用过c和perl,再加上这里又不让出现与perl无关的东西,那下面就主要讨论PERL的socket编程啦:  

    创建建套接字:  

    socket(SOC_VARIABLE,DOMAIN_FLAG,connectType,num)  #相应的C语言调用为sockid=socket(af,type,protocol)  

    参数含义如下:  

    SOC_VARIABLE是用于建立套接的句柄,相当于c里面的sockid号;DOMAIN_FLAG叫域标记,在C里相当于af--address family,地址族。地址族和域是一个概念,其实就是平常所说的域。UNIX支持的域类型有 

       AF-UNIX;      UNIX内部地址  

       AF-INET;      TCP/IP地址  

       AF-NS;        Xerox NS地址  

       AF-APPLETALK; Apple的Appletalk地址  

    而dos/windows支持的域地址族只有AF-INET.所以大部分的socket编程都只用到它。  

    connectType(c里的type)就是前面所说的三种socket类型。num相当于c里面的protocol那大家一看就明白了这是协议号,用来指定SOCKET请求所希望的协议,这个参数不一定起作用,当前两个参数可以确定协议时可以取值为零。  

    所以,一个完整的PERL的建立socket如下  

    socket(THESCK,AF-INET,SOCKET_STREAM,getprotocolbyname('tcp'));  

    #c语言: int sockid;  

    #        sockid = socket(AF-INET,SOCKET_STREAM,0);  

    第二步了:bind()--绑定到本地地址。  

        第一步socket()调用只是指定了相关五元组的协议元。其他四元需要别的调用来补充。socket的创建可以认为创建了一个名字空间(地址族),但他没有被命名。bind()将套接字地址与本机创建的套接字句柄(c里面的套接字号)绑定,即将名字赋予套接字(句柄),以指定本地半相关。按照标准的socket来说(在UNIX世界里所谓编程的"标准接口"就和说"c的编程接口"没啥区别),套接字地址是一个描述socket地址的数据结构。其中描述TCP/IP协议地址(AF_INET)的结构为:  

    struct sockaddr_in{  

       short sin_family; //AF_INET  

       u_short sin_port; //16位端口号,网络字节顺序  

       struct in_addr sin_addr; //32位IP地址,网络字节顺序  

       char sin_zero[8]; //保留  

    }  

    其他的结构还有 sockaddr_ns,sockaddr_un等,是用在其他协议地址的。基本上我们用不到。于是一个标准绑定为:  

    bind(SOCKET sockid,struct * localaddr_name,int addrlen);  

    //sockid是一个未命名套接字的socket号  

    //localaddr_name是用来命名sockid的指向sockaddr_in结构的指针  

    //addrlen是localaddr_name的字节长度  

    使用perl的bind()时先要调用inet_aton('localhost');或函数 INADDR_ANY 取得ip地址字符串,然后调用  

    $localaddr_port = sockaddr_in($port,inet_aton('localhost')); #$port是端口号  

    或者是 $localaddr_port = sockaddr_in($port,INADDR_ANY); 获得TCP/IP的地址,最后bind(SERVER,$localaddr_port);  

    完成绑定!在这里不用指定$localaddr_port的字节长度,这就是perl的好处。  

        这两个系统调用用于完成一个全相关的建立,其中connect()用于建立连接。accept()使服务器等待来自某客户进程的实际连接。其调用格式如下  

     connect(SOCKET sockid,struct sockaddr* destaddr,int addrlen);  

     //sockid是欲建立连接的本地socket号  

     //destaddr是一个指向对方socket地址(信宿地址)结构的指针  

     //addrlen是对方socket地址长度  

       

    perl语言的connect()调用格式为:  

    connect(SOC_VARIABLE,NAME_VARIABLE)  

    具体的调用过程如下  

    $remoteaddr_port = sockaddr_in($port,inet_aton('abc.efg.com'));  

    connect(CLIENT,$remoteaddr_port); #半相关三元组(协议,远地地址,远地端口号)。 

    可以发现connect()和bind()调用如出一辙,只是SERVER换成CLIENT,local换成remote,没错,他们的道理是一样的,作用是互补的。他们各自建立了服务器和客户机方面的半相关。这时就要accept()来掺和一下一个完整的网间进程通信的全相关就可以建立啦!(其实标准connect()还可以用于无连接的socket调用。但这个用法比较左道,常把人搞晕点,所以就不说了)  

    标准accept()调用:  

    SOCKET newsock = accept(SOCKET sockid,struct sockaddr* clientaddr,int  addlen)  

      //sockid ,服务器本地的socket号  

      //clientaddr ,指向客户socket结构的指针。它的初始值为空  

      //addlen ,客户socket结构的字节长度,它的初始值为0  

      //newsock ,accept()的返回值,为一个新的socket号,可用于服务器  //处理并发请求。服务器fork一个子服务器进程,利用此socket号回 

      //答accept()所接收的客户请求  

    可以看出,accept()是面向连接的服务器端的调用。他还将客户端的socket地址及其字节长度放在clientaddr和addlen以便为其他无连接的调用指定信宿地址。但是,那些比较灵活但没有原则的无连接用法在perl里是没有的,perl的用法认为socket必须是面向连接的,请看perl里的accept():  

      accept(NEW_SOC_VARIABLE,CURRENT_SOC_VARIABLE);  

        可以看到accept()从当前的socket句柄上连接出一个客户端到新的socket句柄。而它的返回值客户端的地址(信宿地址)。其实连接一旦建立,服务方无须知道信宿地址,只要向套口里灌输比特流就行了。这样做的好处是使协议对于应用程序更加透明,易于理解。  

    在调用accept()之前还应该先调用listen(),listen()的作用是侦听端口,接收连接。如果不调用listen()的话,accept()将无法从当前socket"接"回与客户端的连接。标准listen():  

        listen(sockid,quelen);  

        //socket号,服务器愿意从它上面接收请求  

        //quelen,请求队列长度,listen()以此限制排队请求的个数  

          

    perl的listen():  

        listen(SOC_VARIABLE,num);#和C语言的版本很像哦  

          

        SOC_VARIABLE是socket句柄,num是请求队列长度.  

        到这里为止,一个连接的五元组都齐了。

  • [论坛] 测试的五个阶段

    2009-06-09 22:46:02

    阶段0:测试和调试并无区别。除了对调试的支持,测试并无其它目的。 
    阶段1:测试的目的是显示软件是可工作的。 
    阶段2:测试的目的是为了显示软件是不能工作的。 
    阶段3:测试的目的不是去证明任何东西,而是把软件可能不工作的预知风险制约到一个可以接受的范围内。 
    阶段4:测试不是一种行动而是一种心智训练,其结果是无需很多测试的低风险软件。 
    前两个阶段一般被认为是在不成熟的软件实践和过程情况下,个人和团队的荒唐想法。 
    达到阶段2是目前可以发现很多重要缺陷,并且不费太多代价,在一些组织中,这样就可以了。 
    在阶段3中,测试是整个风险管理的一部分,测试聚焦于风险,测试生成风险相关信息。 
    在阶段4更多表现的是一个公司组织的思维方式而非一个测试者的思维方式。当测试在公司组织深入人心,在运行一项测试之前,每个人都会按照降低缺陷产生的方式来行动。

  • 人的差异在于业余时间(转贴)

    2009-06-07 21:30:28

    科学大师爱因斯坦说过这样一句话:“人的差异在于业余时间”。我们总认为,人与人不同,这里面有环境、有机缘、有能力、也有性格的差异。怎么在于“业余时间”呢?业余时间对我们每个人意味着休息和充电。

      2000年8月20日《新华周末》报道,中国人民大学教授王琪延博士带领他的课题组对全国城市居民的生活时间进行抽样调查发现,我国城市居民一周平均每日工作时间为5小时1分,个人生活必需时间10小时42分,家务劳动时间2小时21分,闲暇时间6小时6分。四类活动时间分别占总时间的21%、44%、10%、25%。每一天,城市人就是这样度过。10年来,人的闲暇时间增加了69分钟,闲暇时间占人生命的1/3。而我国居民在电视机前每天是3小时38分,打发掉自己一半的闲暇时光。日本、美国人每天看电视的时间分别为1小时37分和2小时14分。

      调查结果还显示,本科以上高学历者的终生工作时间是低学历者的4倍,收入是其7倍以上。学历越高,越重视终生学习,平均日学习时间为61分钟。

      每个人的业余时间有多少?业余时间如何用?这里大有讲究。当你业余时间比较多时,而且把如此多的业余时间用于打牌、跳舞、闲扯、看电视时,你的收入就像翘翘板,这一头就会低下去。反之收入就会高起来。收入是社会对你的报酬,也是一个人的价值物化形式。当你的收入渐渐趋于牛市或熊市时,你的生活方式和生活内容也就趋于变化,你的理想和追求与人就大大不同了,这时你自觉不自觉地与他人出现了差异。“人的差异在于业余时间”。这也许是爱因斯坦关于人与时间的又一种表述方式,也是一种深刻的耐人寻味的表述方式。


      列宁说过,不会休息,就不会工作。现在该是赋予它时代的新义了。步入信息化社会,拥抱知识经济时代,也必然地要求我们压缩以至挤占业余时间。市场竞争无孔不入。在业余时间,我们都能嗅到一股知识和金钱的气息。曾被美国《时代周刊》评为全球“数字英雄”的搜狐总裁张朝阳博士说:“我就是平凡人,我没有发现自己与别人有什么大的不同。如果说有不同,那就是我每天平均除了7个小时睡觉外,其他时间都在工作(思考)”。

      据说,成功地研究了第三种血细胞(现称血小板)及其他成就的加拿大医学教育家奥斯勒,为了从繁忙的工作中挤出时间读书,他为自己定下一个制度,睡觉之前必须读15分钟的书。不管忙碌到多晚进卧室,就是清晨两三点钟,他也一定要读15分钟的书才入睡。这个制度他整整坚持了半个世纪之久,共读了8235万字、1098本书,医学专家成了文学研究家。奥斯勒赋予业余时间以生命的神奇。

      你要显示存在的价值吗?你要与人有所差异吗?那么,用好你的业余时间吧!




    出处:心擎网
  • 送书啦!《嵌入式软件测试》中文版电子书

    2009-06-07 00:31:22

        极少数针对嵌入式软件测试的著作,好东西当然要分享啦!由于无法上传,需要的请留邮箱!另,不能保证及时送上,请见谅!

       “捕虫者”换了新帐号“愚人”,博客重新开张,呵呵,需要的朋友请到此贴留言!

     

483/3<123
Open Toolbar