qileilove

blog已经转移至github,大家请访问 http://qaseven.github.io/

如何保持在QA这条路上, 而不会想转换到RD去呢?

这个问题, 我想是大多数公司或是QA manager的梦靥. 一方面找不到好人才, 一方面人才也不易留住. 很容易地, QA不是离职就是换跑道到RD去. 让我们来看看Microsoft资深的QA manager如何看待这个问题.
  在某一场合, 作者被问到一个问题: 你如何保持在QA这条路上, 而不会想转换到RD去呢?
  他说他已经听过很多次这样的问题. 许多人把QA视为是RD的一个跳板, 一个先期训练中心. 他说如果是这样也不错, 因为那将会有许多RD知道QA在做什么, 会比较注重质量, 也会比较容易和QA沟通.
  作者也认为并不是因为RD要写code, 所以QA想过去. 其实QA自己也是需要写code, 去做automation或是帮助测试更方面. 他认为QA会想离开是因为太多QA manager无法求新, 只考虑shipment和 schedule, 缺乏有求新求变的环境和心态.
  而至于愿意留下来的QA, 则是因为在team里面, 他们有机会去做invent, investigate and discover, 使得他们有成就感.
  所以如何让你的QA愿意留下来呢? 让他们有机会去创新. 如果他们都只是focus 在test cases execution和ship schedule, 那大家都会想跑的
  以下是一些读者的响应
  ===============================
  calkelpdiver said:
  他提到QA会想换工作的原因
  (1)  lack of credibility & respect, lack of pay, lack of support, insane work schedules, finger pointing
  (2) getting the opportunity to do new and innovate things in this line of work doesn't come often for the average tester in the average company (Microsoft, and other large shops may be different).
  (3) Want to earn more money (RD's pay is higher)
  ===============================
  swn1 said:
  他提出一个可能的改善方法: rotation
  Assign testers to development teams, assign developers to test rotations.
  Developers became very conscious of the need for documentable designs, meaningful messages, and such. And customers were shocked to have the phone answered by someone who understood and could actually fix their problem.  Good for everyone.
  ===============================
  ru_altom said:
  他认为rotation不太可行, 原因如下
  (1) 你需要假设RD是一个好的QA, QA 也是一个好的RD
  (2) RD 和QA的mindset不同, A tester will write code to break someone else's code, while a developer will aim to write unbreakable code.
  所以他赞同JW的作法:
  Innovation is the best way to keep your testers (and developers as well) content and at their best. Give them a chance to invent, to find new ways, to try their ideas - and they won't leave, not for another department and not for another company.

posted @ 2014-09-15 09:33 顺其自然EVO 阅读(193) | 评论 (0)编辑 收藏

自动化测试—想说爱你不容易

  正如许多事情都有其两面性一样,测试方法也是这样。要保证测试方法正确,最简单、最直观地想法就是多写些测试用例,从更多地角度去测试,但这必然增加我们的测试成本。小步快跑要求我们频繁进行测试,假如我们重构的周期是20分钟,但测试却要花掉10分钟,那么这样的成本就实在太大了。假如这种测试还是开发人员手工测试,每天都有对同样的测试反复执行数十遍,那么开发人员估计就要疯掉了。
  你可能立即就想到自动化测试了。是的,在许多重构的书籍中,大师们都建议我们在重构开始前,首先建立自动化测试机制。但遗憾的是,我经过多年的实践总结出来的经验是,这几乎不可能实现。每次重构,我们面临的都是一个个遗留系统。大多数遗留系统都有一些共同的特征:代码凌乱,没有清晰的接口;代码间耦合度高,相互依赖严重;web层、业务层、数据访问层往往没有清晰的界限,代码相互参杂其中。在这样的情况下,编写自动化测试代码是几乎不可完成的任务。当然,这里所说的自动化测试代码,是指那些基于JUnit编写的自动化测试程序
  举一个简单的例子:假如你现在要测试一个开票类,想编写它的测试代码。本来这个开票类并不复杂,业务也很清晰。但是在函数传递参数时,其中一个参数是Web容器中的Request、Response或Session。这下麻烦了,为了测试一个简单的函数,我们必须启动整个Web应用,这是我们不可接受的。
  随后你可能会说了,我们为什么非要传递一个真正地Request、Response或Session呢?我们Mock一个假的嘛!想法不错,但你真正去尝试Mock时你会发现这也是一个不可完成的任务。Request、Response或Session有许多的状态,属性变量中又有对象,又有属性变量。除此还有大量集合变量,集合变量里都有什么对象,天才知道。因此,即使你费尽千辛万苦Mock出来,也可能因某些属性不对而使得测试失败。
  另一个写自动化测试程序比较忌讳的就是访问数据库。比如你这次执行的插入操作成功了,并不意味着下次执行就可以成功。下次执行会报“主键冲突”错误,出现这个错误并不是被测程序错了,而是测试程序错了。上次执行一个查询产生的结果集,不一定就是下一次执行同样一个查询产生的结果。查询结果变了,并不意味着被测程序错了,而是测试程序不对。自动化测试程序之所以能够自动化执行,必须要保证测试过程是可以反复执行的,并且不论什么时候执行都有一个确定的结果。
  总之,自动化测试不是银弹,并不是所有代码都适合自动化测试。与Web容器或其它设备驱动相关的代码是不适合自动化测试的,因为我们在测试的时候不希望去启动Web容器或其它设备。因此,我们在做自动化测试程序前,首先应当确保要测试的程序已经与Web容器或其它设备驱动相关的代码充分解耦。一个比较好的办法就是分离出Web层与BUS层,Web层负责从Web容器中获取数据,并打包传递给BUS层,而BUS层则完成真正需要测试的业务逻辑。
  另一个不适合自动化测试的就是要访问数据库的程序,因为它们执行的结果总是与数据库状态有关,无法获得稳定而可以不断复现的结果。所以,我们解决它的最好办法就是将访问数据库的部分Mock掉。如何Mock呢?你不能Mock一个JDBC,也不能Mock一个Hibernate,因为那都过于复杂了,你唯一可以做的就是将DAO层Mock掉。这就要求我们对系统重构的时候,要将数据库访问的代码从业务代码中脱离出来,写入到DAO层。最后,被Mock的DAO层代码并不真正去访问数据库。每当客户程序传入一个参数时,它首先作为测试程序去验证这个参数是否与预期一致,然后返回一个确定的结果。

posted @ 2014-09-15 09:32 顺其自然EVO 阅读(328) | 评论 (0)编辑 收藏

MariaDB和MySQL性能测试比较

 现在选择继续使用MySQL或抛弃它切换到MariaDB有足够的理由。
  现在把目光移到benchmark上面来,它其实也是由MariaDB团队开发的,并加了一下额外的说明。这篇博客提到了一个有趣的地方:把MYSQL5.6的线程数一直增加到16,性能都很好,但是超过了16的话,尽管性能也有提升一点点,但比较发现,远不如其他版本(包括MairaDB-5.5.28a和MairaDB-10.0.1;参考文章顶部的性能测试图)。这在单核计算机里面试图达到多核多线程的效果的并行程序时,都会有此类的通病。如果算法设计得当,随着CPU核心数的增加,性能也会跟着提升。当然问题是,你必须在并行程序中处理好2个方面:(1)跨多核的多线程问题(2)矢量化。这也是当前面向多核编程的两个方向,你编写的必须能很好的控制这两个方面。
  如果没有正确的编写代码将会得到一个共同的结果,即在用8到16个线程的开始你就想看到好的结果,但在这些线程运行之后你不会看到你期望的结果。你将会看到这个问题,这意味这可能是算法问题。(这也不是超线程或是硬件线程造成的)这就是我们在这里看到MySQL 基准的问题。对于我来说,这就是MySQL规模化产生问题的迹象,这也是令人担心的原因之一。MariaDB在同样的基准中也有一些小问题,但是比MySQL要轻微的多,只能说是勉强吧;我推测这个问题在并行计算中可能不会出现。
  我也不知道在测试中怎样才能很好的根据不同机器指定不同的编译器来与之匹配。当你为Intel编译代码时,你需要为目标机器编译生成合适的SIMD代码;如果不匹配,你将不会得到你所期望执行的矢量代码。为了能正确处理,你需要在代码中插入正确的编译指示代码,然后要写下正确的矢量算法,最后在选择合适的编译器。我知道这样看起来很愚笨,但我看过一个发行产品用错误的编译器所造成的结果是你无法想象的。好歹,很明显,MySQL代码在多核和矢量化中的优化没有MariaDB好。
  (我真正想看到的是,MySQL或MariaDB的一个分支为Intel Xeon Phi处理器核心做一个特别的编译,使代码转移到61 核心协处理器,并且有人能尝试加速所有244个线程。可惜我没有接触过这样的机器。同样的,如果你想学习更多关于向量化和并行方式编写代码方面的知识,检索最近Intel公司 James Jeffers 与 James Reinders写的文章“Intel Xeon Phi 协处理器高性能编程”。)
  很明显,MariaDB的新特性并不是都这么好——你可能需要连接 Cassandra 来获取一些数据,但是我很怀疑你会使用 MySQL 去做这件事情。关于这个平台上提供的其他引擎也有类似的争议。MariaDB的性能看起来在多核环境下表现不错,但是我强烈怀疑其实通过调优,MySQL 也可以做到。
  所以你还应该转移到 MariaDB 吗?
  首先,考虑潜在的风险(高层管理者都喜欢听风险和利益)。如果你迁移到 MariaDB,你可能会使用特定于 MariaDB 的特性(但目前似乎还不可能),然后发现很难再用很小的资源切换回 MySQL 。但是我想说的是,这个并不真的是一个风险,下面从更大的范围里讨论一些问题。
  考虑一下关于 Oracle 以及 Oracle 对 MySQL 授权的问题。免费以及开源的 MySQL 要与 Oracle 极具竞争力的专有软件竞争。那么,Oracle 会做什么事情阻止 MySQL 的开发呢?(一些人可能会说,这样的事情已经发生了)
  那么,MySQL 和 MariaDB 的兼容性如何呢?MariaDB 团队正尽力去保持对 MySQL 的全面兼容,他们继续向源码中提交 bug 修复。但那些新特性(以及版本方案)表明,尽管尽了最大的努力,这两个平台还是会继续分裂。
  如果 Oracle 向 MySQL 添加 MariaDB 不采纳的新特性,这些特性明显不会对你可用。如果你正在使用 MySQL 不具备的 MariaDB 特性,你将不能轻易地切换到 MySQL 。 MariaDB 表示这样的情况很可能存在一段时间,然而你也不能说相同的情况不会在 MySQL 中出现。就是说,即使 MariaDB 的新特性并不那么有用,但是(在我看来)已经有足够的理由从 MySQL 迁移到 MariaDB 了。
  (在结束这篇文章前说一件事:即在 blogosphere 的作者提出过的一个关键问题——服务协议。如果在你的公司总经理疯狂到向 Oracle 购买了服务协议来帮助你开发管理 MySQL 数据库,那么你可能愿意停留在MySQL 以避免因为违反协议而造成的财务和法律上的问题。但除此以外,我看不到什么理由继续使用 MySQL 数据库)

posted @ 2014-09-15 09:32 顺其自然EVO 阅读(312) | 评论 (0)编辑 收藏

测试用例的关键的认知

 无论缺陷预防工作贯彻落实地多好,软件组件总有缺陷。这很明显,因为开发商无法阻止/消除软件开发周期的所有缺陷。因此,软件必须进行彻底的测试,然后才交付给最终用户。测试人员的责任是:设计既可以(ⅰ)找软件缺陷,又能(ii )评估该软件的性能,可用性和可靠性等方面的测试。
  现在,为了实现这些目标,测试人员必须(往往是从一个非常大的执行域中)选择和/或制定测试用例的有限数量。不幸的是,完整的测试通常不是在这个范围,预算和时间的约束内实现和/或执行的。重要的是,当测试开始失控且不按计划地运行时,由于预期无法实际,测试人员往往承受了来自管理层和利益相关者的巨大压力。
  因此,测试人员必须有效地计划测试并制定正确的测试用例,选择并执行合适的用例,监控过程,以确保有效利用工作资源和时间。所以,要列出这些无疑是一项艰巨的任务;要有效地实施,测试人员需要受过适当的教育和培训并拥有赢得管理层支持的能力。
  一般情况下,测试人员会用两种不同的测试方法,其中,使用常规方法,测试人员主要是尝试用所有可能的输入去测试一个模块或组件,用所有可能的软件结构去实践。尽管这种做法仍在使用,测试人员却在慢慢灌输推理软件的一切的价值,最终使他们能够检测出所有可能存在的缺陷。但见多识广且有学问的测试员们都明白,这在现实或经济上是不可行,不可实现的目标。
  现在,另一种方法可能就是让测试员们随机选择测试输入,希望这些测试能将大的缺陷找出来。不过,测试专家认为,随机生成的测试输入在评估系统的质量属性方面表现纪录欠佳。所以,从测试的角度来看,这是一个无休止的争论和悬而未决的问题。尽管如此,我们还是认为,测试员的最终目标是了解测试的功能、输入/输出域和使用环境,等等。
  同样,对于某些特定类型的测试,测试人员也需要详细地了解代码是如何构造的。此外,测试人员也需要利用关于常在软件开发或维护过程中生成的特定缺陷的知识。有了这些信息,测试者就必须明智地选择测试输入的子集,以及被认为最有可能找测试过程中条件和限制内的缺陷的测试输入组合。然而,这个过程需要时间和精力。所以,测试人员知道且赞同:只有开发出基于执行的测试的有效测试用例,才能最大化和/或优化对时间和资源的利用。
  “有效测试用例”我们是指:“一个很可能找出缺陷的测试用例” 。因此,制定有效测试用例的能力对于一个组织迈向一个更高质量的测试过程来说是非常重要的;反过来,一个组织迈向一个更高质量的测试过程对制定有效测试用例的能力也有许多积极影响。
  例如,如果测试用例是有效的,那么:
  检测缺陷的概率更大。
  更有效地利用组织资源。
  测试再用的可能性更高。
  更符合测试、项目进度、预算,更重要地,提供更高质量的软件产品的可能性。
  测试用例设计方法 - 概念化
  上面介绍了有效测试用例的种种好处,但缜密考虑测试人员用来设计这些有效测试用例的方法也同样重要。为了回答这个问题,有必要把软件作为一个精心设计的产品来查看和/或检查。现在,有了这个观念,就有两个基本方法可以用来设计测试用例:
  黑盒(有时也称为功能或规格)测试方法。
  白盒(有时也称为clear或透明盒 )测试方法。
  使用黑盒测试方法,测试人员把SUT (测试中的软件)当作一个不知道其内部结构(即如何运作)的不透明盒子,测试人员只知道它的作用。使用这种方法的SUT的大小可以是一个简单的模块、成员函数、对象群、一个子系统、或一个完整的软件系统。此外, SUT的基础行为或功能的描述可以由正式规格,输入/处理/输出图( IPO),或一套定义明确的先决、后置条件来提供;重要的是,另一个值得一提的信息来源是:需求规格说明文档,通常描述SUT的功能,输入及预期输出。现在,鉴于上述来源,测试员提供指定输入到SUT,进行测试运行,然后确定所产生的输出是否与说明文档中提供的一致。因为黑盒测试方法只考虑了软件的行为和功能,它通常被称为功能测试,或基于规范的测试。这种方法特别有用,极有助于找到要求和规格中的缺陷。
  与此相反,白盒测试方法关注将被测试的软件的内部结构。因此,使用白盒测试方法来设计测试用例,测试人员应该先了解结构,且为了实现这一目标,必须可随时参考和理解代码或适当的类伪代码的要求。一旦对结构有了必要的了解,测试者就可以选择合适的测试用例去实践特定的内部结构要素,并确定它们是否正常工作。例如,测试用例通常被设计来实践所有语句或发生在一个模块或成员函数中的真/假分支。但是,由于白盒测试的设计,执行和结果分析非常耗时,这种方法被限制和/或通常只适用于软件的小部分,如模块或成员函数。然而,白盒测试方法对于找出设计和基于代码的控件的逻辑缺陷和顺序缺陷,初始化缺陷和数据流缺陷等特别有用。
  然而,从测试员的角度来看,要实现向用户提供低缺陷高质量的软件的目标,必须把这两种方法都用来设计测试用例。另外,这两种方法都支持测试员选择有限数量的将被用于测试的测试用例。这两种方法可以相互补充,因为每个都或许有助于找到某些特定类型的缺陷。重要的是,有了使用这两种方法设计出的一组测试用例,测试员找到SUT中各种不同类型缺陷的机会就增加了。
  测试员还有一套有效的可再用的用来进行回归测试(更改后的重新测试),以及软件测试的新版本。
  上面是一份概要:使用任一设计方法制定测试用例的各种可用方法。
  但是,在使用任一设计方法准备测试用例前有一些因素需要考虑清楚。它们分别是:
  测试相关风险。
  预期缺陷类型。
  测试员的知识和经验。
  测试水平和必须进行分组和管理的小组活动。
  用于执行测试用例的工具。
  应用程序,软件和问题域的类型。
  客户要求,等等。
现在除了上述因素,以下几个要点和/或问题在选择正确的测试用例设计技术中发挥了至关重要的作用:
  基于“经验”的测试用例设计
  在基于经验的技术中,是人们的知识,技能和专业知识(关于域,技术等)构成了测试条件和测试用例的基础,且对制定测试条件和测试用例很重要。
  在这儿,人们技术和业务两方面的经验都是绝对必需的,必要的,因为这给测试分析和设计过程提供了不同的角度。
  重要的是,有了他们使用类似系统工作的丰富(前)的经验,他们或许对什么会出错,什么有助于测试有了想法和/或深入的理解。
  因此,基于经验的技术与基于规范既与基于结构的技术偕行,又可用于没有规格,或者规格不足或过时的时候。
  这可能是用于设计测试低风险系统的测试用例的唯一技术,但是这种方法可能在非常紧急的情况下特别有用,事实上,这是导致探索性测试的一个因素。
  “随机”方式—考虑了吗?
  通常,任何软件模块或系统都有输入域,从这个域里选择并使用测试输入数据建和/或执行测试用例。
  现在,如果一个测试人员从必要输入域中随机选择输入,准备测试用例,并用它们来测试应用程序,这种方法被称为“随机测试”。
  例如,如果一个模块的有效输入域是1到100之间所有的正整数,然后用这种方法测试人员会随机或胡乱地从该领域内选择值,如,选15 , 27和33。
  但是,使用这种方法,也有一些一直无解的问题:
  值(上面的例子中三个值)足以表明,执行测试用或运行例测试时,模块符合其规格吗?
  是否有其他输入值,比那些(在本例中)被选中的值,更能找缺陷?
  抑或有效输入域外的任何值应该作为执行测试用例的测试输入?
  这就是说,测试数据应包括大于100的浮点值,负值或整数值?
  因此,上述问题可以立即通过更加结构化的黑盒测试设计方法解决,尽管使用随机测试输入可以节省一些时间和精力,其他测试输入选择方法要求。
  但是,根据许多测试专家,随机选择测试输入会产生一个有效的用于执行测试用例的测试数据集的机会非常小,并且对于一个更结构化的方法,随机方法生成测试输入的相对有效性总成为自省和/或研究的课题。

posted @ 2014-09-15 09:22 顺其自然EVO 阅读(166) | 评论 (0)编辑 收藏

使用Siege测试Web服务器

 好处是可以对一组url进行测试
  参见 http://www.blogjava.net/crespochen/archive/2009/06/02/279573.html 和 http://baike.baidu.com/link?url=Uv0KtwM83hvFTjudQsP37FIfeUDJxMW4Kvodfk6oSTJ4B4ctpr1R6P4CGXdyMExyU7rGL2bold_aGJHwKaV2l_
  郭扬提供了1.73上的应用,拷贝到/guodian/uap2,部署上Weblogic的Server-0(端口号是7010)。uap2依赖于uap_server。通过http访问是
  查询
  http://192.168.1.73:7010/sguap-client/SmallCase/rest/smallCase/
  增加:
  http://192.168.1.73:7010/sguap-client/SmallCase/rest/smallCase/insert?uuid=XXX&name=XXX
  修改:
  http://192.168.1.73:7010/sguap-client/SmallCase/rest/smallCase/update?uuid=XXX&name=XXX
  删除
  http://192.168.1.73:7010/sguap-client/SmallCase/rest/smallCase/delete?uuid=XXX
  我们在1.74上做测试。
  yum -y install siege #安装siege,安装不上的话,就从前面提供的URL上下载siege,再安装。
  据此,写了个shell生成url
#!/bin/bashfunction get_random_name(){MATRIX="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"LENGTH=8while[${n:=1}-le$LENGTH]; doPASS="$PASS${MATRIX:$(($RANDOM%${#MATRIX})):1}"let n+=1doneecho$PASS}function make_link(){act=$1#echo $actfor i in$seqc; do#echo $i
linkarr[$i]="\$link/$act?uuid=${idarr[$i]}&name=$(get_random_name)"echo${linkarr[$i]}>>$outdone}num=$1out=$2[ x$num = x ]&&num=10[ x$out = x ]&&out=link.out
link=http://192.168.1.73:7010/sguap-client/SmallCase/rest/smallCase
declare-a idarr
seqc=`seq$num`for i in$seqc; do
idarr[$i]=$[$RANDOM%1000]doneecholink=$link>$outecho${idarr[@]}declare-a linkarr
$(make_link insert);
echo \$link/>>$outecho>>$out
$(make_link update);
echo \$link/>>$outecho>>$out
$(make_link delete);
echo \$link/>>$outecho>>$out
  测试命令
  siege -c20 -r2 -f link.out
  参数说明:
  -c20 并发20个用户
  -r2 重复循环2次
  -f link.out 任务列表:URL列表
  测试结果:
** SIEGE 3.0.0
** Preparing 20 concurrent users for battle.
The server is now under siege...
HTTP/1.1 200   0.37 secs:     340 bytes ==> GET  /sguap-client/SmallCase/rest/smallCase/insert
HTTP/1.1 200   0.38 secs:     340 bytes ==> GET  /sguap-client/SmallCase/rest/smallCase/insert
...............................................  #代替很多条HTTP/1.1 ...
Transactions:          40 hits
Availability:      100.00 %
Elapsed time:        2.14 secs
Data transferred:        0.01 MB
Response time:        0.21 secs
Transaction rate:       18.69 trans/sec
Throughput:        0.01 MB/sec
Concurrency:        3.87
Successful transactions:          40
Failed transactions:           0
Longest transaction:        0.58
Shortest transaction:        0.00
  Concurrency是并发数
  siege还包含了一些辅助工具:bombardment,是一个辅助工具:用于按照增量用户压力测试。
  bombardment link.out 5 5 10 1
  这样测试,效果也良好,就是费时间。

posted @ 2014-09-12 10:06 顺其自然EVO 阅读(192) | 评论 (0)编辑 收藏

搭建LVS负载均衡测试环境

 实现负载均衡有很多种方式
  土豪直接F5,性能最好,价格最贵
  没钱也可以使用Apache,Nginx 工作在网络的第四层,虽然性能一般,但是很灵活,比如可以将80端口映射到真实服务器的8080端口.
  还有一种选择LVS ,它工作在网络的第三层,性能较好,非常稳定.
  但是它不能实现端口的重新映射.因为在网络的第三层,并不清楚端口的信息。
  下面的实验搭建了一个LVS负载均衡测试环境,采用DR的方式。
  客户端访问LVS前置机
  这个请求如下
  源MAC(client mac) 目标MAC(DR mac) 源IP(client IP) 目标IP(DR IP,VIP)
  LVS前置机会将报文改写之后转发真实的服务器
  改写如下
  源MAC(client mac) 目标MAX(真实服务器MAC) 源IP(client IP) 目标IP(DR IP,VIP)
  因为真实的服务器将VIP绑定到了环回地址,所以会处理这个请求,并返回响应的报文.
  网络层的源目对掉
  源MAC(真实服务器MAC) 目标MAC(client mac) 源IP(DR IP,VIP) 目标IP(client IP)
  所以LVS DR的本质就是网络层的欺骗。
  实验采用VirtualBox虚拟机,并且配置内部网络,关闭SELinux和防火墙
  首先,在LVS DR前置机上安装ipvsadm命令
  yum install ipvsadm -y
  然后配置两台真实服务器(RealServer)的Http服务
  yum install httpd -y
  service httpd start
  chkconfig httpd on
  并分别改写/var/www/html/index.html的内容为"real server 1"和"real server 2"
  然后在两台真实服务器上执行如下的脚本
vim lvs_real.sh
#!/bin/bash
# description: Config realserver lo and apply noarp
SNS_VIP=192.168.16.199
source /etc/rc.d/init.d/functions
case "$1" in
start)
ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
/sbin/route add -host $SNS_VIP dev lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
;;
stop)
ifconfig lo:0 down
route del $SNS_VIP >/dev/null 2>&1
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
 最后,在DR前置机上执行如下脚本
vim lvs_dr.sh
#!/bin/bash
VIP1=192.168.16.199
RIP1=192.168.16.3
RIP2=192.168.16.4
case "$1" in
start)
echo " start LVS of DirectorServer"
/sbin/ifconfig eth1:0 $VIP1 broadcast $VIP1 netmask 255.255.255.255 broadcast $VIP1 up
/sbin/route add -host $VIP1 dev eth1:0
echo "1" >/proc/sys/net/ipv4/ip_forward
/sbin/ipvsadm -C
/sbin/ipvsadm -A -t $VIP1:80 -s rr
/sbin/ipvsadm -a -t $VIP1:80 -r $RIP1:80 -g -w 1
/sbin/ipvsadm -a -t $VIP1:80 -r $RIP2:80 -g -w 1
/sbin/ipvsadm
;;
stop)
echo "close LVS Directorserver"
echo "0" >/proc/sys/net/ipv4/ip_forward
/sbin/ipvsadm -C
/sbin/ifconfig eth1:0 down
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
  通过client访问LVS前置服务器,可以看到已经实现了负载均衡的效果。
  关于LVS的调度算法,转载自张逸群的博客
  http://www.zhangyiqun.net/56.html
  1. 大锅饭调度(Round-Robin Scheduling RR)
  rr – 纯轮询方式,比较垃圾。把每项请求按顺序在真正服务器中分派。
  2. 带权重的大锅饭调度(Weighted Round-Robin Scheduling WRR)
  wrr -带权重轮询方式。把每项请求按顺序在真正服务器中循环分派,但是给能力较大的服务器分派较多的作业。
  3. 谁不干活就给谁分配(Least-Connection LC)
  lc – 根据最小连接数分派
  4. 带权重的谁不干活就给谁分配(Weighted Least-Connections WLC 默认)
  wlc – 带权重的。机器配置好的权重高。
  5. 基于地区的最少连接调度(Locality-Based Least-Connection
  Scheduling LBLC)
  lblc – 缓存服务器集群。基于本地的最小连接。把请求传递到负载小的服务器上。
  6. 带有复制调度的基于地区的最少连接调度(Locality-Based Least-Connection Scheduling with Replication Scheduling LBLCR)
  lblcr – 带复制调度的缓存服务器集群。某页面缓存在服务器A上,被访问次数极高,而其他缓存服务器负载较低,监视是否访问同一页面,如果是访问同一页面则把请求分到其他服务器。
  7. 目标散列调度(Destination Hash Scheduling DH)
  realserver中绑定两个ip。ld判断来者的ISP商,将其转到相应的IP。
  8. 源散列调度(Source Hash Scheduling SH)
  源地址散列。基于client地址的来源区分。(用的很少)
  9. 最短的期望的延迟(Shortest Expected Delay Scheduling SED)
  基于wlc算法。这个必须举例来说了
  ABC三台机器分别权重123 ,连接数也分别是123。那么如果使用WLC算法的话一个新请求进入时它可能会分给ABC中的任意一个。使用sed算法后会进行这样一个运算
  A:(1+1)/1
  B:(1+2)/2
  C:(1+3)/3
  根据运算结果,把连接交给C 。
  10.最少队列调度(Never Queue Scheduling NQ)
  无需队列。如果有台realserver的连接数=0就直接分配过去,不需要在进行sed运算。
  遇到的问题..
  这个实验看着简单,做了足足半个月,但是还有一些不明白的问题,可能和网络知识的匮乏有关系。
  在DR前置机上不能通过VIP访问真实的服务器
  在DR前置机上执行命令,报错如下
  查看ipvsadm,连接状态是SYN_RECV
  一开始我使用了三台虚拟机,卡在这个地方很长时间。
  后来偶然发现,用第四台虚拟机就可以正常访问了..

posted @ 2014-09-12 10:05 顺其自然EVO 阅读(420) | 评论 (0)编辑 收藏

Oracle静态监听注册详解

 网上有很多关于oracle 监听静态注册的文章,但大多都是简单说说,并没有详细的例子,这里,将结合linux as4 下的oracle 10gR2.0.1 举一个具体的例子
  1、在 $ORACLE_HOME/network/admin/listener.ora 文件中加入一个静态注册的节点
[oracle@prudent oracle]$ cd $ORACLE_HOME/network/admin
[oracle@prudent admin]$ vi listener.ora
# listener.ora Network Configuration File: /mydatafile2/app/oracle/oracle/product/11.2.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /mydatafile2/app/oracle/oracle/product/11.2.0/db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(SID_NAME = ORCL)
(ORACLE_HOME = /mydatafile2/app/oracle/oracle/product/11.2.0/db_1)
(GLOBAL_DBNAME=WOO.COM)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
(ADDRESS = (PROTOCOL = TCP)(HOST = prudent)(PORT = 1521))
)
)
  注意这里的GLOBAL_DBNAME=WOO.COM
  SID_NAME=ORCL
  这个SID_NAME 应与你对外提供服务的 $ORACLE_SID 一致
  [oracle@prudent admin]$ echo $ORACLE_SID
  ORCL
  2、配置对应的tnsnames.ora 中的节点
[oracle@prudent admin]$ vi tnsnames.ora
# tnsnames.ora Network Configuration File: /mydatafile2/app/oracle/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
ORCL=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = prudent)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL)
)
)
WOOORCL=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = prudent)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = WOO.COM)
)
)
[oracle@prudent admin]$ vi tnsnames.ora
# tnsnames.ora Network Configuration File: /mydatafile2/app/oracle/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
ORCL=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = prudent)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL)
)
)
WOOORCL=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = prudent)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = WOO.COM)
)
)
tnsname WOOORCL 中的 SERVICE_NAME=WOO.COM
  这里的服务名为 WOO.COM 而不是通常的 ORCL,因为在 listener.ora 中已经注册了 WOO.COM,lsnrctl 启动时会监听 WOO.COM ,并对应到 SID_NAME=ORCL 上。3、启动监听和服务
[oracle@prudent oracle]$ cat dbstart
lsnrctl start
sqlplus /nolog <<EOF
connect /as sysdba
startup
EOF
[oracle@prudent oracle]$ ./dbstart
LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 13-FEB-2011 20:11:15
Copyright (c) 1991, 2005, Oracle.  All rights reserved.
Starting /mydatafile2/app/oracle/oracle/product/11.2.0/db_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 11.2.0.1.0 - Production
System parameter file is /mydatafile2/app/oracle/oracle/product/11.2.0/db_1/network/admin/listener.ora
Log messages written to /mydatafile2/app/oracle/oracle/product/11.2.0/db_1/network/log/listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=prudent)(PORT=1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date                13-FEB-2011 20:11:15
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /mydatafile2/app/oracle/oracle/product/11.2.0/db_1/network/admin/listener.ora
Listener Log File         /mydatafile2/app/oracle/oracle/product/11.2.0/db_1/network/log/listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=prudent)(PORT=1521)))
Services Summary...
Service "WOO.COM" has 1 instance(s).
Instance "ORCL", status UNKNOWN, has 1 handler(s) for this service...
Service "ORCL" has 1 instance(s).
Instance "ORCL", status UNKNOWN, has 1 handler(s) for this service...
Service "PLSExtProc" has 1 instance(s).
Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
SQL*Plus: Release 11.2.0.1.0 - Production on Sun Feb 13 20:11:16 2011
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
SQL> Connected to an idle instance.
SQL> ORA-32004: obsolete and/or deprecated parameter(s) specified
ORACLE instance started.
Total System Global Area  461373440 bytes
Fixed Size                  1220000 bytes
Variable Size              75498080 bytes
Database Buffers          381681664 bytes
Redo Buffers                2973696 bytes
Database mounted.
Database opened.
SQL> Disconnected from Oracle Database 10g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
  可以看到
  Service "WOO.COM" has 1 instance(s).
  Instance "ORCL", status UNKNOWN, has 1 handler(s) for this service...
  正在被监听。
  4、验证该服务可以到达
[oracle@prudent oracle]$ tnsping WOOORCL
TNS Ping Utility for Linux: Version 11.2.0.1.0 - Production on 13-FEB-2011 20:14:59
Copyright (c) 1997, 2005, Oracle.  All rights reserved.
Used parameter files:
/mydatafile2/app/oracle/oracle/product/11.2.0/db_1/network/admin/sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = prudent)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = WOO.COM)))
OK (10 msec)
  5、利用静态注册的服务登入oracle
[oracle@prudent oracle]$ sqlplus system@oracleWOOORCL
SQL*Plus: Release 11.2.0.1.0 - Production on Sun Feb 13 20:17:27 2011
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> select count(*) from date_log;
COUNT(*)
----------
SQL>
  至此:已验证该静态注册可以成功的被解析,监听,连接。

posted @ 2014-09-12 10:04 顺其自然EVO 阅读(3035) | 评论 (0)编辑 收藏

Java学习之反射机制

java语言区别于C,C++等准静态语言的最大特点就是java的反射机制。静态语言的最直接定义就是不能在运行时改变程序结构或变量的类型.按照这样的定义,python,ruby是动态语言,C,C++,Java不是动态语言。虽然在这样的定义下java不是动态语言,但java的反射机制(Reflection)却是可实现动态的相关机制。java反射机制的作用有
  1、在运行时判断任意一个类所具有的成员变量和方法
  2、在运行时构造任意一个类的对象
  3、在运行时判断任意一个对象所属的类
  4、在运行时调用任意一个对象的方法
  在java的jdk中,有java.lang.reflect包,在该包中有5个比较重要的类,
  1、Class类:代表一个类。
  2、Constructor类:表示类的构造方法,通过该类来操作构造方法
  3、Field类:代表类的成员变量(属性)。
  4、Method类:代表类的方法。通过该类可操作方法。
  5、Array类:提供了动态创建数组,以及访问数组的元素的静态方法。
  Class 类十分特殊。它和一般类一样继承自Object,当一个class被加载,或当加载器(class loader)的defineClass()被JVM调用,JVM 便自动产生一个Class 对象。Class并没有构造方法,不能人为生成。
  要想使用java的反射,首先要获得类的Class,而获得的方法有以下几种
  String str = "CIACs";
  1、Class c1 = str.getClass();
  2、Class c2 = Class.forName("java.lang.String");//调用Class的静态方法
  3、Class c3 = String.class;//每个包装类都有自身的class
  获得Class后,就可以生成对象了,对象的构造方法有带参数的和不带参数的,当通过不带参数的构造方法来生成对象时有以下两种方式
  1、通过newInstance()方法生成
  Class<?> classType = str.getClass();
  Object obj = classType.newInstance();
  2、通过构造方法实现
  Class<?> classType = str.getClass();
  Constructor con = classType.getConstructor(new Class[]{});
  Object obj = con.newInstance(new Object[]{});
  若要通过带参数的构造方法生成对象实例,就只能使用如下方法
  Class<?> classType = str.getClass();
  Constructor con = classType.getConstructor(new Class[]{String.class});
  Object obj = con.newInstance(new Object[]{"CIACs"});
 获得类的对象实例后就可以操作对象的方法和属性了。以下是一个例子
1packagereflection;
2
3importjava.lang.reflect.InvocationTargetException;
4importjava.lang.reflect.Method;
5
6publicclassTestClass{
7
8publicintadd(inta,intb)
9{
10returna+b;
11}
12
13publicStringecho(Stringstr)
14{
15returnstr;
16}
17
18publicstaticvoidmain(String[]args)throwsException{
19Class<?>classType=TestClass.class;//获得Class
20
21ObjectTest=classType.newInstance();//通过classType获得对象实例
22
23MethodaddMethod=classType.getMethod("add",newClass[]{int.class,int.class});//运行中获得add方法
24
25Objectresult=addMethod.invoke(Test,newObject[]{1,2});//传入参数调用add方法
26
27System.out.println((Integer)result);
28
29MethodechoMethod=classType.getMethod("echo",newClass[]{String.class});
30
31Objectresult2=echoMethod.invoke(Test,newObject[]{"http://www.cnblogs.com/zhi-hao/"});
32
33System.out.println(result2);
34
35}
36
37}
  运行结果:
  java学习中反射机制跟动态代理相关,动态代理也是java中的重要知识。

posted @ 2014-09-12 09:56 顺其自然EVO 阅读(184) | 评论 (0)编辑 收藏

关于线上与线下性能测试结果的差异

 有几个学员经常会对线上与线下测试结果不一样的问题产生纠结...所以还是统一写一篇这样的文章
  其实这个问题本身不用纠结,就好比再牛逼的双胞胎还是有他们不一样的地方。本身性能测试就是一个预估风险、排查瓶颈、了解系统现有性能的一个手段。就好比小时候你是个好孩子,但不意味这你长大了也是一个好孩子,也许你会像海波兄那样的...so,性能测试只是一种手段,减小风险的方法而已。
  再者,本身线上和线下的测试结果就不太具有可比性,原因为:
  1、线下与线上机器环境配置的差异
  2、线下和线上业务数据的差异,虽然我们线下要最大可能的模拟用户行为,但你不能拿保证100%的模拟啊,那么多用户你都能兼顾到?
  3、线下和线上产生压力时间的差异,线下是模拟高压力大并发的情况,而线上通常压力不大,大并发主要集中在某几个特殊时段。
  说道这里,又会有童鞋继续纠结了,那为毛还做测试啊,都不准确,做个毛毛?好吧,那我想反问你一句,一辆汽车开的人不同,开车的习惯不同,会对车造成不同程度的影响,既然我们没法100%测试模拟,那我们干脆就产出汽车后直接卖给你好了,做个什么测试和路测,多tmd费劲。对吧?这时候你不干了,你说那多危险,万一有大问题呢,不就要了我的命了吗?呃...这时候你明白了?那换到性能测试中就不明白了?
  我们做性能测试的意义其实很简单:
  1、预防、评估风险,如果有大问题可以早点发现,减小风险。这里理解极其简单,你程序存在内存泄漏的问题,难道线下2g和线上4g这个内存差异就不会有内存泄漏了?这就好比,你不会骑永久牌自行车,难道给你换个小强牌(瞎编的...)自行车你就瞬间会骑了?
  2、前端性能测试。可以通过前端性能测试保证页面性能,给用户带来较好的用户体验。
  3、单接口性能调优。主要目的是优化接口性能,排查接口性能问题,及应用内存隐患。
  比如,我们会准备几种业务场景,比如全走DB和全走缓存,分别得到这几种场景下,应用最佳处理能力情况下,在测试中排查是否存在性能提升的地方,及代码问题导致的内存泄露等。
  4、容量评估。可以根据线上机器比例,线下模拟配比来估算。

posted @ 2014-09-12 09:55 顺其自然EVO 阅读(206) | 评论 (0)编辑 收藏

软件测试面试题答案整理

  1、你的测试职业发展是什么?
  测试经验越多,测试能力越高。所以我的职业发展是需要时间积累的,一步步向着高级测试工程师奔去。而且我也有初步的职业规划,前3年积累测试经验,按如何做好测试工程师的要点去要求自己,不断更新自己改正自己,做好测试任务。
  2、你认为测试人员需要具备哪些素质
  做测试应该要有一定的协调能力,因为测试人员经常要与开发接触处理一些问题,如果处理不好的话会引起一些冲突,这样的话工作上就会不好做。还有测试人员要有一定的耐心,有的时候做测试很枯燥乏味。除了耐心,测试人员不能放过每一个可能的错误。
  3、你为什么能够做测试这一行
  虽然我的测试技术还不是很成熟,但是我觉得我还是可以胜任软件测试这个工作的,因为做软件测试不仅是要求技术好,还有有一定的沟通能力,耐心、细心等外在因素。综合起来看我认为我是胜任这个工作的。
  4、测试的目的是什么?
  测试的目的是找出软件产品中的错误,是软件尽可能的符合用户的要求。当然软件测试是不可能找出全部错误的。
  5、测试分为哪几个阶段?
  一般来说分为5个阶段:单元测试、集成测试、确认测试、系统测试、验收测试
  6、单元测试的测试对象、目的、测试依据、测试方法?
  测试对象是模块内部的程序错误,目的是消除局部模块逻辑和功能上的错误和缺陷。测试依据是模块的详细设计,测试方法是采用白盒测试
  7、怎样看待加班问题
  加班的话我没有太多意见,但是我还是觉得如果能够合理安排时间的话,不会有太多时候加班的。
  8、结合你以前的学习和工作经验,你认为如何做好测试。
  根据我以前的工作和学习经验,我认为做好工作首先要有一个良好的沟通,只有沟通无障碍了,才会有好的协作,才会有更好的效率,再一个就是技术一定要过关,做测试要有足够的耐心,和一个良好的工作习惯,不懂的就要问,实时与同事沟通这样的话才能做好测试工作。
  9、你为什么选择软件测试行业
  因为之前了解软件测试这个行业,觉得他的发展前景很好。
  10、根据你以前的工作或学习经验描述一下软件开发、测试过程,由哪些角色负责,你做什么
  要有架构师、开发经理、测试经理、程序员、测试员。我在里面主要是负责所分到的模块执行测试用例
  11、根据你的经验说说你对软件测试/质量保证的理解
  软件质量保证与测试是根据软件开发阶段的规格说明和程序的内部结构而精心设计的一批测试用例(即输入数据和预期的输出结果),并根据这些测试用例去运行程序,以发现错误的过程。它是对应用程序的各个方面进行测试以检查其功能、语言有效性及其外观排布。
  12、软件测试的流程是什么?
  需求调查:全面了解系统概况、应用领域、软件开发周期、软件开发环境、开发组织、时间安排、功能需求、性能需求、质量需求及测试要求等。根据系统概况进行项目所需的人员、时间和工作量估计以及项目报价。
  制定初步的项目计划。
  测试准备:组织测试团队、培训、建立测试和管理环境等。
  测试设计:按照测试要求进行每个测试项的测试设计,包括测试用例的设计和测试脚本的开发等。
  测试实施:按照测试计划实施测试。
  测试评估:根据测试的结果,出具测试评估报告。
  13、你对SQA的职责和工作活动(如软件度量)的理解?
  SQA就是独立于软件开发的项目组,通过对软件开发过程的监控,来保证软件的开发流程按照指定的CMM规程(如果有相应的CMM规程),对于不符合项及时提出建议和改进方案,必要时可以向高层经理汇报以求问题的解决。通过这样的途径来预防缺陷的引入,从而减少后期软件的维护成本。SQA主要的工作活动包括制定SQA工作计划,参与阶段产物的评审,进行过程质量、功能配置及物理配置的审计等;对项目开发过程中产生的数据进行度量等等。
  14、说说你对软件配置管理的理解
  项目在开发过程中要用相应的配置管理工具对配置项(包括各个阶段的产物)进行变更控制,配置管理的使用取决于项目规模和复杂性及风险的水平。软件的规模越大,配置管理就越显得重要。还有在配置管理中,有一个很重要的概念,那就是基线,是在一定阶段各个配置项的组合,一个基线就提供了一个正式的标准,随后的工作便基于此标准,并只有经过授权后才能变更这个标准。配置管理工具主要有CC,VSS,CVS,SVN等,我只用过SVN,对其他的工具不是很熟悉。
  15、怎样写测试计划和测试用例
  简单点,测试计划里应有详细的测试策略和测试方法,合理详尽的资源安排等,至于测试用例,那是依赖于需求(包括功能与非功能需求)是否细化到功能点,是否可测试等。
  16、说说主流的软件工程思想(如CMM、CMMI、RUP,XP,PSP,TSP等)的大致情况及对他们的理解
  CMM:SW Capability Maturity Model软件能力成熟度模型,其作用是软件过程的改进、评估及软件能力的评鉴。
  CMMI:Capability Maturity Model Integration能力成熟度模型集成 CMMI融入了大部分最新的软件管理实践,同时弥补了SW-CMM模型中的缺陷。
  RUP:rational unified process是软件工程话过程。
  XP:extreme program,即极限编程的意思,适用于小型团队的软件开发,像上面第三个问题就可以结合原型法采用这样的开发流程。要明白测试对于xp开发的重要性,强调测试(重点是单元测试)先行的理念。编程可以明显提高代码的质量,持续集成对于快速定位问题有好处。
  PSP,TSP分别是个体软件过程和群体软件过程。大家都知道,CMM只是告诉你做什么但并没有告诉你如何做,所以PSP/TSP就是告诉你企业在实施CMM的过程中如何做,PSP强调建立个人技能(如何制定计划、控制质量及如何与其他人相互协作等等)。而TSP着重于生产并交付高质量的软件产品(如何有效的规划和管理所面临的项目开发任务等等)。总之,实施CMM,永远不能真正做到能力成熟度的提升,只有将实施CMM与实施PSP和TSP有机结合起来,才能发挥最大的效力。因此,软件过程框架应该是CMM/PSP/TSP的有机集成。
  17、你是怎样保证软件质量的,也就是说你觉得怎样才能最大限度的保证软件的质量?
  测试并不能够最大限度的保证软件的质量,软件的高质量是开发和设计出来的,而不是测试出来的,它不仅要通过对软件开发流程的监控,使得软件开发的各个阶段都要按照指定的规程进行,通过对各个阶段产物的评审,QA对流程的监控,对功能及配置的审计来达到开发的最优化。当然测试也是保证软件质量的一个重要方式,是软件质量保证工程的一个重要组成部分。
  18、基于目前中国的国情,大多数公司的项目进度紧张、人员较少、需求文档根本没有或者很不规范,你认为在这种情况下怎样保证软件的质量?(大多数公司最想知道的就是在这种困难面前你该怎么保证软件的质量,因为这些公司一般就是这种情况--既不想投入过多又想保证质量)
  出现以上的情况,如果仅仅想通过测试来提高软件质量,那几乎是不可能的,原因是没有足够的时间让你去测试,少而不规范的文档导致测试需求无法细化到足够且有针对行的测试。所以,作为公司质量保证的因该和项目经理确定符合项目本身是和的软件生命周期模型(比如RUP的建材,原型法),明确项目的开发流程并督促项目组按照此流程开展工作,所有项目组成员(项目经理更加重要)都要制定出合理的工作计划,加强代码的单元测试,在客户既定的产品交付日期范围内,进行产品的持续集成等等,如果时间允许可以再配合客户进行必要的系统功能测试。
  19、一个测试工程师应该具备哪些素质和技能?
  1-掌握基本的测试基础理论
  2-本着找出软件存在的问题的态度进行测试,不要以挑刺的形象出现
  3-可熟练阅读需求规格说明书等文档
  4-以用户的观点看问题
  5-有强烈的质量意识
  6-细心和责任心
  7-良好的有效的沟通方式(与开发人员及客户)
  8-具有以往的测试经验能够及时准确的判断出高危险区在何处
  20、做好软件测试的一些关键点
  1-测试人员必须经过测试基础知识和理论的相关培训
  2-测试人员必须熟悉系统功能和业务
  3-测试要有计划,而且测试方案要和整个项目计划协调好
  4-必须实现编写测试用例,测试执行阶段必须根据测试用例进行
  5-易用性,功能,分支,边界,性能等功能行和非功能性需求都要进行测试
  6-对于复杂的流程一定要进行流程分支,组合条件分析,再进行等价类划分准备相关测试数据
  7-测试设计的一个重要内容是要准备好具体的测试数据,清楚这个测试数据是测试那个场景或分支的。
  8-个人任务平均每三个测试用例至少应该发现一个BUG,否则只能说明测试用例质量不好
  9-除了每天构建的重复测试可以考虑测试自动化外,其他暂时都不要考虑去自动话
  21、软件测试员自身素质培养
  1-首先,应对软件测试感兴趣和对自己有自信,如果具备了这两点,那么在开发过程中不管遇到什么样的困难,相信一定能克服
  2-善于怀疑,实际上没有绝对正确的,总有错误的地方,具有叛逆心理,别人认为不可能发生的事情,我却认为可能发生,别人认为是对的,我却认为不是对的。
  3-打破沙锅问到底的精神,对于只出现过一次的BUG一定要找出原因,不解决誓不罢休。
  4-保持一个良好的心情,否则可能无法把测试做好。不要把生活中的不愉快的情绪带到工作中来。
  5-做测试时要细心,不是所有的BUG都能很容易找出,一定要细心才能找到这些BUG。
  6-灵活一些,聪明一点,多造一些容易产生BUG的例子。
  7-在有条件的情况下,多和客户沟通,他们身上有你所需要的。
  8-设身处地为客户着想,从他们的角度去测试系统。
  9-不要让程序员,以“这种情况不可能发生”这句话说服你,相反,你应该去说服他,告诉他在客户心理,并不是这样的
  10-考虑问题要全面,结合客户的需求,业务流程和系统的架构等多方面考虑问题。
  11-提出问题不要复杂化,这点和前面矛盾,如果你是一个新手,暂时不要管这点,因为最终将有你的小组成员讨论解决。
  12-追求完美,对于新测试员来说,努力追求完美,这对你很好,尽管有些事情无法做到,但你应该尝试。
  13-幽默感,能和开发小组很好的沟通是关键,试着给你的开发小组找一个BUG杀手,或对他们说“我简直不敢相信,你写的程序居然到现在没有找到BUG”。
  22、为什要在一个团队中开展测试工作?
  因为没有经过测试的软件很难在发布之前知道该软件的质量,就好比ISO质量认证一样,测试同样也需要质量认证,这个时候就需要在团队中开展软件测试的工作。在测试的过程中发现软件中存在的问题,及时让开发人员得知并修改问题,在即将发布时,从测试报告中得出软件的质量情况。
  23、你所熟悉的软件测试类型有哪些?
  测试类型有:功能测试、性能测试、界面测试
  功能测试在测试工作中占有比例最大,功能测试也叫黑盒测试。
  性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。负载测试和压力测试都属于性能测试,两者可以结合进行。
  界面测试,界面是软件与用户交互的最直接的层,界面的好坏决定用户对软件的第一印象。
  区别在于,功能测试关注产品的所有功能,要考虑到每个细节功能,每个可能存在的功能问题。性能测试主要关注产品整体的多用户并发下的稳定性和健壮性。界面测试则关注与用户体验相关内容,用户使用该产品的时候是否已用,是否易懂,是否规范(用户无意输入无效的数据,当然考虑到体验性,不能太粗鲁的弹出警告)。做某个性能测试的时候,首先它可能是个功能点,首先要保证她的功能是没有问题的,然后再考虑性能的问题。
  24、你认为做好测试用例设计工作的关键是什么
  白盒测试用例设计的关键是以较少的用例覆盖尽可能多的内部程序逻辑结构。黑盒测试用例设计的关键同样也是以较少的用例覆盖模块输出和输入接口。不可能做到完全测试,以最少的用例在合理的时间内发现最多的问题。软件的黑盒测试意味着测试要在软件的接口处进行,这种方法是把测试对象看作是一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。因此黑盒测试又叫功能测试或者数据驱动测试。黑盒测试主要是为了发现以下几类错误:、
  1-是否有不正确或遗漏的功能
  2-在接口上,输入是否能正确的接受?能否输出正确的结果。
  3-是否有数据结构错误或外部信息(例如数据文件)访问错误
  4-性能上是否能够满足要求
  5-是否有初始化或终止性错误
  软件的白盒测试是对软件的过程性细节做细致的检查。这种方法是把测试对象看作一个打开的盒子,它允许测试人员利用程序内部的逻辑结构和有关信息,设计或者选择测试用例,对程序所有逻辑路径进行测试。通过在不同点检查程序状态,确定实际状态是否与预期的状态一直。因此白盒测试又称为结合测试或逻辑驱动测试。白盒测试主要是想对程序模块进行如下检查:
  1-对程序模块的所有独立的执行路径至少测试一遍。
  2-对所有的逻辑判定,取“真”与取“假”的两种情况都能至少测一遍。
  3-在循环的边界和运行的界限内执行循环体。
  4-测试内部数据结构的有效性,等等。
  25、请详细介绍一下各种测试类型的含义
  1-单元测试(模块测试)是开发者编写的一小段代码,用于检验被测试代码的一个很小的、很明确的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。单元测试是由程序员自己来完成,最终受益的也是程序员自己。可以这么说,程序员有责任编写功能代码,同时也就有责任为自己的代码编写单元测试。执行单元测试,就是为了证明这段代码的行为和我们期望的一致。
  2-集成测试(也叫组装测试、联合测试)是单元测试的逻辑扩展。它最简单的形式是:两个已经经过测试的单元组合成一个组件,并且测试它们之间的接口。从这一层上讲,组件是指多个单元的集成聚合。在现实方案中,许多单元组合成组件,而这些组件又聚合成程序的更大部分。方法是测试片段的组合,并最终扩展进程,将您的模块与其他组的模块一起测试。最后,将构成进程的所有模块一起测试。
  3-系统测试是将经过测试的子系统装配成一个完整系统来测试。它是检验系统是否确实能提供系统方案说明书中制定功能的有效方法。(常见的联调测试)。系统测试的目的是对最终软件系统进行全面的测试,确保最终软件系统满足产品需求而遵循系统设计。
  4-验收测试是部署软件之前的最后一个测试操作。验收测试的目的是确保软件准备就绪,并且可以让用户将其执行软件的既定功能和任务。验收测试是向未来的用户表明系统能够像预订要求那样工作。经集成测试后,已经按照设计把所有的模块组装成一个完整的软件系统,接口错误也已经基本排除了,接着就应该进一步验证软件的有效性,这就是验收测试的任务,即软件的功能和性能如同用户所合理期待的那样。
  26、测试计划工作的目的是什么?测试计划工作的内容都包括什么?其中哪些是最重要的?
  软件测试计划是知道测试过程的纲领性文件,包含了产品概述、测试策略、测试方法、测试区域、测试配置、测试周期、测试资源、测试交流、风险分析等内容。借助软件测试计划,参与测试的项目成员,尤其是测试管理人员,可以明确测试任务和测试方法,保持测试实施过程的顺畅沟通,跟踪和控制测试进度,应对测试过程中的各种变更。
  测试计划和测试详细规格、测试用例之间是战略和战术的关系,测试计划主要从宏观上规划测试活动的范围、方法和资源配置,而测试详细规格、测试用例是完成测试任务的具体战术。所以其中最重要的是测试策略和测试方法(最好能先评审)。
 27、您认为做好测试计划工作的关键是什么?
  1-明确测试的目标,增强测试计划的实用性
  编写软件测试计划的重要目的就是使测试过程能够发现更多的软件缺陷,因此软件测试计划的价值取决于它对帮助管理测试项目,并且找出软件潜在的缺陷。因此,软件测试计划中的测试范围必须高度覆盖功能需求,测试方法必须切实可行,测试工具并且具有较高的实用性,便于使用,生成的测试结果准确
  2-坚持“5W”规则,明确内容与过程
  “5W”规则指的是“WHAT(做什么)”、“WHY(为什么做)”、"WHEN(何时做)"、"WHERE(在哪里)"、"HOW(如何做)"。利用“5W"规则创建软件测试计划,可以帮助测试团队理解测试的目的(WHY),明确测试的范围和内容(WHAT),确定测试的开始和结束日期(WHEN),指出测试的方法和工具(HOW),给出测试文档和软件存放的位置(WHERE)。
  3-采用评审和更新机制,保证测试计划满足实际需求
  测试计划完成后,如果没有经过评审,直接发送给测试团队,测试计划内容的可能不准确或遗漏测试内容,或者软件需求变更引起测试范围的增减,而测试计划的内容没有及时更新,误导测试执行人员。
  4-分别创建测试计划与测试详细规格、测试用例
  应把详细的测试技术指标包含到独立创建的测试详细规格文档,把用于指导测试小组执行过程的测试用例放到独立创建的测试用例文档或测试用例管理数据库中。测试计划和测试详细规格、测试用例之间是战略和战术的关系,测试计划主要从宏观上规划测试活动的范围、方法和资源配置,而测试详细规格、测试用例是完成测试任务的具体战术。
  28、当开发人员说不是BUG时,你如何应付?
  开发人员说不是BUG,有2种情况,一是需求没有确定,所以我可以这么做,这个时候可以找来产品经理进行确认,需不需要改动。3方商量确定好后再看要不要改。二是这种情况不可能发生,所以不需要修改,这个时候,我可以先尽可能的说出是BUG的一句是什么?如果被用户发现或出了问题,会有什么不良结果?程序员可能会给你很多理由,你可以对他的解释进行反驳。如果还是不行,那我可以给这个问题提出来,跟开发经理和测试经理进行确认,如果要修改就改,如果不要修改就不改。其实有些真的不是BUG,我也只是建议的方式写进测试文档中,如果开发人员不修改也没有大问题。如果不是BUG的话,一定要坚持自己的立场,让问题得到最后的确认。
  29、你自认为测试的优势在哪里?
  优势在于我对测试坚定不移的信心和热情,虽然经验还不足,但测试需要的基本技能我有信心在工作中得以发挥。
  30、什么是系统瓶颈?
  瓶颈主要是指整个软硬件构成的软件系统某一方面或者几个方面能力不能满足用户的特定业务要求,“特定”是指瓶颈会在某些条件下会出现,因为毕竟大多数系统在投入前。
  严格的从技术角度讲,所有的系统都会有瓶颈,因为大多数系统的资源配置不是协调的,例如CPU使用率刚好达到100%时,内存也正好耗尽的系统不是很多见。因此我们讨论系统瓶颈要从应用的角度讨论:关键是看系统能否满足用户需求。在用户极限使用系统的情况下,系统的响应仍然正常,我们可以认为改系统没有瓶颈或者瓶颈不会影响用户工作。
  因此我们测试系统瓶颈主要是实现下面两个目的:
  -发现“表面”的瓶颈。主要是模拟用户的操作,找出用户极限使用系统时的瓶颈,然后解决瓶颈,这是性能测试的基本目标。
  -发现潜在的瓶颈并解决,保证系统的长期稳定性。主要是考虑用户在将来扩展系统或者业务发生变化时,系统能够适应变化。满足用户目前需求的系统不是最好的,我们设计系统的目标是在保证系统整个软件生命周期能够不断适应用户的变化,或者通过简单扩展系统就可以适应新的变化。
  31、文档测试主要包含什么内容?
  在国内软件开发管理中,文档管理几乎是最弱的一项,因而在测试工作中特别容易忽略文档测试也就不足为奇了。要想给用户提供完整的产品,文档测试是必不可少的。文档测试一般注重下面几个方面:
  文档的完整性:主要是测试文档内容的全面性与完整性,从总体上把握文档的质量。例如用户手册应该包括软件的所有功能模块。
  描述与软件实际情况的一致性:主要测试软件文档与软件实际的一致程度。例如用户手册基本完整后,我们还要注意用户手册与实际功能描述是否一致。因为文档往往跟不上软件版本的更新速度。
  易理解性:主要是检查文档对关键、重要的操作有无图文说明,文字、图表是否易于理解。对于关键、重要的操作仅仅只有文字说明肯定是不够的,应该附有图表使说明更为直观和明了。
  文档中提供操作的实例:这项检查内容主要针对用户手册。对主要功能和关键操作提供的应用实例是否丰富,提供的实例描述是否详细。只有简单的图文说明,而无实例的用户手册看起来就像是软件界面的简单拷贝,对于用户来说,实际上没有什么帮助。
  印刷与包装质量:主要是检查软件文档的商品化程度。有些用户手册是简单打印、装订而成,过于粗糙,不易于用户保存。优秀的文档例如用户手册和技术白皮书,应提供商品化包装,并且印刷精美。
  32、功能测试用例需要详细到什么程度才是合格的?
  这个问题也是测试工程师经常问的问题。有人主张测试用例详细到每个步骤执行什么都要写出来,目的是即使一个不了解系统的新手都可以按照测试用例来执行工作。主张这类写法的人还可以举出例子:欧美、日本等软件外包文档都是这样做的。
  另外一种观点就是主张写的粗些,类似于编写测试大纲。主张这种观点的人是因为软件开发需求管理不规范,变动十分频繁,因而不能按照欧美的高标准来编写测试用例。这样的测试用例容易维护,可以让测试执行人员有更大的发挥空间。
  实际上,软件测试用例的详细程度首先要以覆盖到测试点为基本要求。举个例子:“用户登陆系统”的测试用例可以不写出具体的执行数据,但是至少要写出五种以上情况(),如果只用一句话覆盖了这个功能是不合格的测试用例。覆盖功能点不是指列出功能点,而是要写出功能点的各个方面(如果组合情况较多时可以采用等价划分)。
  另一个影响测试用例的就是组织的开发能力和测试对象特点。如果开发力量比较落后,编写较详细的测试用例是不现实的,因为根本没有那么大的资源投入,当然这种情况很随着团队的发展而逐渐有所改善。测试对象特点重点是指测试对象在进度、成本等方面的要求,如果进度较紧张的情况下,是根本没有时间写出高质量的测试用例的,甚至有些时候测试工作只是一种辅助工作,因而不编写测试用例。
  因此,测试用例的编写要根据测试对象特点、团队的执行能力等各个方面综合起来决定编写策略。最后要注意的是测试人员一定不能抱怨,力争在不断提高测试用例编写水平的同时,不断地提高自身能力。
  33、配置和兼容性测试的区别是什么?
  配置测试的目的是保证软件在其相关的硬件上能够正常运行,而兼容性测试主要是测试软件能否与不同的软件正确协作。
  配置测试的核心内容就是使用各种硬件来测试软件的运行情况,一般包括:
  (1)软件在不同的主机上的运行情况,例如Dell和Apple;
  (2)软件在不同的组件上的运行情况,例如开发的拨号程序要测试在不同厂商生产的Modem上的运行情况;
  (3)不同的外设;
  (4)不同的接口;
  (5)不同的可选项,例如不同的内存大小;
  兼容性测试的核心内容:
  (1)测试软件是否能在不同的操作系统平台上兼容;
  (2)测试软件是否能在同一操作系统平台的不同版本上兼容;
  (3)软件本身能否向前或者向后兼容;
  (4)测试软件能否与其它相关的软件兼容;
  (5)数据兼容性测试,主要是指数据能否共享;
  配置和兼容性测试通称对开发系统类软件比较重要,例如驱动程序、操作系统、数据库管理系统等。具体进行时仍然按照测试用例来执行。
  34、软件文档测试主要包含什么?
  随着软件文档系统日益庞大,文档测试已经成为软件测试的重要内容。文档测试对象主要如下:
  -包装文字和图形;
  -市场宣传材料、广告以及其它插页;
  -授权、注册登记表;
  -最终用户许可协议;
  -安装和设置向导;
  -用户手册;
  -联机帮助;
  -样例、示范例子和模板;
  -……
  文档测试的目的是提高易用性和可靠性,降低支持费用,因为用户通过文档就可以自己解决问题。因文档测试的检查内容主要如下:
  -读者对象——主要是文档的内容是否能让该级别的读者理解;
  -术语——主要是检查术语是否适合读者;
  -内容和主题——检查主题是否合适、是否丢失、格式是否规范等;
  -图标和屏幕抓图——检查图表的准确度和精确度;
  -样例和示例——是否与软件功能一致;
  -拼写和语法;
  -文档的关联性——是否与其它相关文档的内容一致,例如与广告信息是否一致;
  文档测试是相当重要的一项测试工作,不但要给予充分的重视,更要要认真的完成,象做功能测试一样来对待文档测试。
  35、没有产品说明书和需求文档地情况下能够进行黑盒测试吗?
  这个问题是国内测试工程师经常遇到的问题,根源就是国内软件开发文档管理不规范,对变更的管理方法就更不合理了。实际上没有任何文档的时候,测试人员是能够进行黑盒测试的,这种测试方式我们可以称之为探索测试,具体做法就是测试工程师根据自己的专业技能、领域知识等不断的深入了解测试对象、理解软件功能,进而发现缺陷。
  在这种做法基本上把软件当成了产品说明书,测试过程中要和开发人员不断的进行交流。尤其在作项目的时候,进度压力比较大,可以作为加急测试方案。最大的风险是不知道有些特性是否被遗漏。
  36、测试中的“杀虫剂怪事”是指什么?
  “杀虫剂怪事”一词由BorisBeizer在其编著的《软件测试技术》第二版中提出。用于描述测试人员对同一测试对象进行的测试次数越多,发现的缺陷就会越来越少的现象。就像老用一种农药,害虫就会有免疫力,农药发挥不了效力。这种现象的根本原因就是测试人员对测试软件过于熟悉,形成思维定势。
  为了克服这种现象,测试人员需要不断编写新的测试程序或者测试用例,对程序的不同部分进行测试,以发现更多的缺陷。也可以引用新人来测试软件,刚刚进来的新手往往能发现一些意想不到的问题。
  37、在配置测试中,如何判断发现的缺陷是普通问题还是特定的配置问题?
  在进行配置测试时,测试工程师仍然会发现一些普通的缺陷,也就是与配置环境无关的缺陷。因此判断新发现的问题,需要在不同的配置中重新执行发现软件缺陷的步骤,如果软件缺陷不出现了,就可能是配置缺陷;如果在所有的配置中都出现,就可能是普通缺陷。
  需要注意的是,配置问题可以在一大类配置中出现。例如,拨号程序可能在所有的外置Modem中都存在问题,而内置的Modem不会有任何问题。
  38、为什么尽量不要让时间有富裕的员工去做一些测试?
  表面上看这体现了管理的效率和灵活性,但实际上也体现了管理者对测试的轻视。测试和测试的人有很大关系。测试工作人员应该是勤奋并富有耐心,善于学习、思考和发现问题,细心有条理,总结问题,如果具备这样的优点,做其它工作同样也会很出色,因此这里还有一个要求,就是要喜欢测试这项工作。如果他是专职的,那么肯定更有经验和信心。国内的小伙子好象都喜欢做程序员,两者工作性质不同,待遇不同,地位不同,对自我实现的价值的认识也不同,这是行业的一个需要改善的问题。如果只是为了完成任务而完成任务,或者发现了几个问题就觉得满意了,这在任何其它工作中都是不行的。
  39、完全测试程序是可能的吗?
  软件测试初学者可能认为拿到软件后需要进行完全测试,找到全部的软件缺陷,使软件“零缺陷”发布。实际上完全测试是不可能的。主要有以下一个原因:
  -完全测试比较耗时,时间上不允许;
  -完全测试通常意味着较多资源投入,这在现实中往往是行不通的;
  -输入量太大,不能一一进行测试;
  -输出结果太多,只能分类进行验证;
  -软件实现途径太多;
  -软件产品说明书没有客观标准,从不同的角度看,软件缺陷的标准不同;
  因此测试的程度要根据实际情况确定。
  40、软件测试的风险主要体现在哪里?
  我们没有对软件进行完全测试,实际就是选择了风险,因为缺陷极有可能存在没有进行测试的部分。举个例子,程序员为了方便,在调试程序时会弹出一些提示信息框,而这些提示只在某种条件下会弹出,碰巧程序发布前这些代码中的一些没有被注释掉。在测试时测试工程师又没有对其进行测试。如果客户碰到它,这将是代价昂贵的缺陷,因为交付后才被客户发现。
  因此,我们要尽可能的选择最合适的测试量,把风险降低到最小。

posted @ 2014-09-12 09:48 顺其自然EVO 阅读(806) | 评论 (0)编辑 收藏

仅列出标题
共394页: First 上一页 48 49 50 51 52 53 54 55 56 下一页 Last 
<2025年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜