Hi, 如果有任何想法与我沟通, 请用: lifr_nj 在 msn.com

发布新日志

  • 自动化测试一个比较通用的架构

    2009-06-15 17:32:09

    如果选定了要自动化的目标,--通常来说是一个data-drivencase集合,下一步就是要考虑如何实现的问题。

    首先从软件架构来说,自动化测试项目不算复杂,对于大多数情况,一个自动化测试项目的实现由三个主要部分构成

    • 自动化测试框架
    • TA testcase
    • Library

     

    自动化测试框架

    测试框架提供了testcase的管理,测试任务的管理,测试报告的生成等内容。取决于自动化测试项目的大小,可以从提供最简单的testcase管理和运行的小框架,到基于数据库,包含内容丰富的报表的大框架。

    可以看到,测试框架提供的功能和具体的testcase无关。所以,寻找/提供一个通用的测试框架是可能的,用这个框架来管理某一个产品所有的自动化测试用例。

     

    Test Automation TestCase

    自动化测试用例(TA testcase)包含了实现测试逻辑的代码。

    在实现测试用例的时候,有一个技巧。那就是自动化测试用例的抽象层次和datadriven testcase的抽象层次保持一致。首先试图用关键词加相应的数据来描述一个testcase,然后在testcase里提供一个能够解释这些关键词和数据的“解释器”。

    在实现测试用例的时候,我个人的经验是要尽量维持testcase这一层的代码比较“薄”。最好只有描述了测试逻辑本身的代码,减少访问实际的底层设施的代码。这样的好处

        1)是提高了底层代码的通用性,

        2)是在测试逻辑不变的情况下,访问GUI的代码在未来变化的可能性比较大,把访问GUI的代码放在Library层,可以维持testcase代码的稳定性

     

    Library

    library提供了访问测试产品本身,或者其他一些基础设施的API,比如访问DBremote server, etc.

  • 推荐:infoQ: 动态函数是语言精粹

    2009-05-18 14:14:45

    可以从这里下载免费电子版: http://www.infoq.com/cn/minibooks/javascript-practise

    强烈推荐给编程语言爱好者,但对编程语言的本质理解并不是很透彻,不是计算机科班出身的人,比如像我这样的。

    把以前很多关于“编程语言”里不很明确的东西都厘清楚了。
  • TAS: A Data-driven Test Framework 一个数据驱动测试的自动化框架

    2009-05-17 11:59:19

    Data-driven test has two major parts, one is a number of sets of data, and the other,  a test logic. One set of data here is called a test case, and all the test cases form. a test suite.

    Data-Driven test are considered one kind of the most suitable test to be automated. This is because Data-driven test have two special characteristics, which make it able to achieve a high mark in terms of input-output ratio, relative to none-data-driven test.

    The first one is that all the test cases can be automated once the test logic has been implemented and at least one test case is able to run with it, because one test logic serves for all test cases.

    The second one is, the execution of one test case is absolutely independent to another. That is to say, theoretically, if running a test case multiple times, the test result of a test case is always the same no matter in what a order it is executed..

    As nearly all datat-driven testcaes shares those characteristics, to implement a framework to deal with the common things is meaningful. This is exactly why TAS(TestAutomationSystem) is invented. 

    ====================================================
    数据驱动测试有两个主要部分构成,一个是一套数据集,另外就是测试逻辑。一套数据在这里叫做一个testcase,而所有的数据一起构成一个testsuite。

    数据驱动测试被认为是最适合自动化的测试之一,这是因为数据驱动测试有两个重要特性,使得它能具有较高的 投入产出比。

    第一个特点是,一旦成功自动化一个testcae,那么所有的testcae都能被自动化起来。因为所有的testcae都使用同一个测试测试逻辑。

    第二个特点是,每一个testcase的执行是和另外的testcae完全独立的。理论上,在多次运行同一个testcaes,无论它是以什么样的顺序运行,结果都应该是一样的。

    因为几乎所有数据驱动的测试都具有这样的性质,实现一个自动化框架来处理这些公共部分是有意义的。这也就是TAS产生的原因。

    ========================================
    tas 1.1 released.

    1. simplify create_everything.py
    2. more robust in executing testtask, adding exception handling
    3. other improvements

  • 自动化测试,从哪里开始?

    2009-04-12 22:37:14

    自动化测试,从哪里开始?

    对于刚开始做自动化测试的新手,一个很大的烦恼就是如何开始的问题。面对心中澎湃的激情和老板殷切的希望,很容易陷入两个极端。

    第一个极端是“over design”,就是试图在一个framework里解决所有的问题。这样的后果一是framework必然要引入更多的抽象层导致framework变得复杂而丑陋,第二个是前期工作量非常大,可能很长时间连一个可以跑的demo都拿不出来。

    另一个极端是不讲设计,没有任何framework,一个script就是一个case。这样快倒是快,但很多重复的代码分布在各个script里完成类似的功能,后期维护简直就是灾难。。

    这里问题的核心是,你如何来界定一个自动化测试程序的范围呢?一个程序解决所有case不行,一个case一个程序也不行。你必须要确定一个自动化测试程序要解决的范围。在这个范围里,既能设计一个framework能兼容所有的testcase,取得最大的代码重用效果,又不至于把framework搞成一个复杂难懂的怪物。

    其实这里有一个很简单好用又有效的方法。那就是根据“数据驱动”的testcase来定义你的自动化测试程序。如果你发现了一套testcase可以用,或者已经用,数据驱动的形式定义的,那么就把它作为你自动化的对象。

    说这个方法简单好用是因为它一点也不复杂,testcase是已经现成设计好的,不用花心思来决定“留”和“舍“那些testcase的问题。说它有效是因为

    1)  一套testcase既然能设计成使用数据驱动的形式,那么他们必然有类似的测试逻辑。因此framework也不会很复杂,那么做出来第一个能跑demo也相应会比较快。

    2)  第二个好处是有大量的testcase能自动化起来。因为有类似的测试逻辑,如果自动化了1case,那么剩下的9case差别相当小。自动化10case显然比自动化1case更能获得老板的认可。。。

    3)  第三个好处是,一般来说越是核心的功能,测试越彻底,那么数据驱动集也会越大。如果你首先挑上这样的一套testcase,那么自动化程序的价值也相应的更大。

    不仅仅是对于新手。任何时候当出现“狗咬乌龟,无从下口“的时候,都可以应用这个方法。 我在前段时间做的一个项目,也采用了这种方法。原因是测试的需求不清楚。我得到的任务是对某个包含多个子功能的功能开发自动化测试程序,但具体要自动化哪些case,有什么样的milestone根本不清楚。这个时候,我就选择了一个用data driven的最大的一个testcase集合。我能确定这一套testcase肯定是要自动化的,所以我不会花时间在错误的地方;然后我能很快拿出一个可以跑的demo给客户看看,让他对自动化测试的效果有了实际的认识,帮助他更好的提出自己的需求。
  • 用事前沟通来减少duplicated bug不是好主意

    2009-03-30 14:19:45

    (这还是以前写的一篇发牢骚的文章)

    印象很深,以前在webex的时候,这里的VP特别强调"沟通",几乎每次会议都会强调两三次. 不过他说的"沟通"是从管理角度来说的. 希望大家对某个制度,目标,任务能达成共同的认识.

    现在在AR,manager也在强调"沟通",这里说的是QADev的沟通.比如在file一个bug之前,dev沟通一下,看是不是duplicated bug,或者有没有异议.

    这种沟通我看是不应该提倡的.

    首先来说,沟通是需要成本的,那就是时间.A去找B,B会丢下手里的工作来处理,导致AB的工作都不连贯.一个人工作最有效率的也就一两个小时,打断后重新回到先前的工作需要时间.

    第二, 一个组织,最有效率的是, 每个人都只干他本质的那一部分工作.沟通显然不应该是QA/Dev的本质工作.沟通是为了消除歧义,达成共识.但有没有更好的方式来达到这个目标呢?那就是通过一套良好的问题处理机制.

    如关于duplicated defect的问题.这点是很难避免的.因为已经抱的bug成千上万,一个QA不可能也没有必要熟悉所有的bug.怎么办,首先是报出来.一般来说Dev 会更清楚是不是已知的问题.然后Devbug的状态转违duplicated. 根本不用耽误大家的时间.

    有些问题是QADEv对一个bug 有不同的意见这个时候两个人据理力争是没有任何意义的, 因为这个问题根本就不是他们能解决的是不是一个bug应该有更上一层的人,比如manager来确定所以, defect标记为Need Confirm,Manager就会处理这样的问题.

    我个人的认为是QADEV没有必要互相串门"沟通"是否一个bug真的是一个bug.  当然前提是有一个很好的defect管理系统.DEv,QA,Manager三者在这个系统下各尽其责,实现最高效率的工作

  • QA is the king ---QA 为王

    2009-03-30 14:10:13

    (好久好久以前写的工作中的感悟,现在看看还是很有道理哦 *_~)

    QA is the King, QA 为王.
    说这句话不是因为我是QA,所以我为自己说话.而是想表达一个观点,永远不要限制QA报Bug,甚至,即使是很可笑的bug.
    做企业软件,软件质量提高到了一个非常高的地位.而QA正是保证质量的最关键的一环.
    在webex,我的team learder经常告诉我, 我们是代表用户测试产品, 我们把最后一关.所以,如果在客户那里出问题,承受压力的是QA不是DEV. 所以,把一切bug都在product deliver给客户之前报出来.
    所以,在webex从来没有听说过,你不应该报某个bug的言论.QA也暗暗的在每天的report中比较自己和别人的bug数量.
    因为如此,所以会有很多"invlid"的bug进入bug 管理系统, but so what? QA is the king!


  • Backup strategies of Rainfinity QA team

    2009-03-23 15:47:18

    Problem statement
    Raininity QA team puts all important stuffs on a Linux file server. With the data volume increasing over time, to ensure the safety of these data is becoming a big concern.

    How it works
    There are three backup strategies designed to respectively apply for three different kinds of data.

    1) Personal data files
    Personal data files always are small in size and tend to change frequently.
    In this case, files will be packaged and compressed to a tgz file and copied to backup server once per week. In addition, an incremental backup will be taking place every night to backup only those changed in daytime.

    2) Product build files.
    Product build files are downloaded from build server located in US. Generally, QA engineers are likely to install the product of the latest a few builds.
    In this case, files will be copied directly to backup server as they have been compressed already. Another task is maintaining only a certain number of build on either file server or backup server. For example the latest 10 builds on file server, and the latest 50 builds on backup server. This can meet almost all product installation requirements.

    3) Software repository
    In software repository, OS installers, Vmware images, and test tools are preserved. Software repository includes a huge amount of files and quite a few of them are big files (over 100m in size). Files are rarely changed, but new files are added from time to time.
    In this case, mirror is the best backup strategy. The software repository folder will be scanned once per day to find out newly added files and mirror them to backup server.

    The backup strategies are implemented in SHELL script. In nearly one year of running, it is considered a simple but effective solution meeting backup requirements of Rainfinity QA team.
  • How to Be a Qualified QA Engineer

    2009-03-22 14:22:27

    Have your manager or HR told you directly or indirectly that your performance has problem? That really is a bad news, which I hope will never happen to me. But if it unfortunately happened, please take it very seriously as you were being viewed as unqualified to your position.

    Maybe things are not going that bad. Let’s say there is an interview you are to participate. Of course, you want to win out from all the competitors, so it will definitely help if you know how HR evaluates a candidate.

    Both stories are leading to one same question. What are the key factors that affect people’s performance?

    I had thought into this question, and from my experiences in software testing I got to a conclusion that there are 3 factors: attitude, knowledge and skill. To my surprise, I found by chance that the 3 factors are commonly used by HR to analyze people performance as well.

    Attitude

    Attitude is everything.

    Basically, software testing is not a job only genius can apply for, nor only Doctor or Master. So with a right attitude in work, very possibly the performance will never be a problem of you. Try answering questions below.

    1.         Do you show your passion in work?

    2.         Are you self-motivated most of the time?

    3.         What’s your reaction when meeting with problems?

    4.         Do you run a case at the N time with same patience as the first time you see it?

    5.        

    The saying “Attitude is everything” cannot be emphasized too much for a QA engineer, especially for juniors.

    Knowledge

    Better you understand a product, better you can test it.

    Try to understand the feature and technologies related to the feature before you start testing it. This not only benefits your current testing, but also benefits your career as your knowledge base is hence strengthened and enlarged.

    In terms of personal knowledge base, I think the key point is you have to form. a habit of documenting any valuable thing into somewhere you can easily look up later, and with your own words. A wiki system is the best tool you can leverage.

    Skill

    In my opinion, for software testing, skills are not essential, that means it’s better to have them so that you can do faster, but if you haven’t, you can still get your job done. For example, scripting skill can reduce the time creating 1000 files significantly, but if you don’t know it, you can still get it done with copy+paste.

    To me, the main part of QA engineer’s skill set is utilizing tools. Shell is a great tool you can utilize if you are doing testing under linux/unix. Mastering an advanced editor, Vim, Emacs or UE, sometimes may speed up the operation 10 times over with only pool Notepad. Believe me, any time you think a tool should be invented to release you out from a boring work, the exact tool must have been invented out there. All you need to do is to find it.

     

  • recognize your manager

    2009-03-19 23:17:47

    As a hard working engineer, have you ever raised a question that why your manager earns so much more money than you? It seems it is individual engineers who deliver all the valuable things, they coding, they testing, they listening to customers’ complains and so on.

    Yet it’s not necessary that a manager should earn more money than an engineer, being a manager truly requires a set of totally different competencies/skills from being an engineer, and honestly speaking, this kind of competency/skill is not that easy to acquired and thus, may be worthy of the money.

    I have had similar questions before, but had my mind changed after participating a training session called “transition to leader” today.

    There is no another word than “brainwashing” better describing the impact of the training on my way to look at the manager role. Not going deep into many details, I would like to mention only one fact impressing me most in the session.

    Charles Fan, general manager of EMC China COE, shared with us at the session beginning his thoughts about being a manager.

    You should “让你的队员happy”, “代表你的team去争取利益”, “好的事情,让你的队员去领功,不好的事情,你要扛下来”, …

    “As a manager, most of the time, you are not ordering your people, but serving your people” I concluded from his speech. This just reminders me of another saying made by Linda (HR manager) not long ago “A good manager should make his/her people succeed”

    As an individual contributor, you deliver products with good quality on time, that’s wonderful. But no matter you are aware of or not, without manager’s efforts, like communicating with global team, coordinating with Dev team, planning the schedule, leveraging the team member capability, and so forth, your achievements are not going to happen.

    One principle of manager is “to recognize your member”, I think this also works for engineer in “to recognize your manager”.

     

  • Test like a Tech Support

    2009-03-03 21:51:56

    Test like a Tech Support

    One day I had a chat with a Tech Support engineer, and she told me she was suffering a customer issue because the debug log was so ugly that she just cannot get meaningful information from it to identify the root cause. “The object I need is printed in only hex format but not human-readable string, hence to track an object are getting extremely difficult.” She complained.

    “I filed a bug, because it significantly slows down the process of working out the final solution”

    This conversation just shocks me a lot, in that it opens a new view to look at the duty of Quality Assurance. Previously, I think the work methods of software testing are just in two ways, one is testing with testcases and another, testing from customer’s view. I have never think of testing like a Tech Support.

    One of the key characteristics of Tech Support working style. is the attempting to track an issue down will never stop until root cause is disclosed. Only by doing in this way, can Tech Support come out a reasonable explanation to customers, and then in turn figure out the final solution to the issue.

    In testing activity, it’s a common case that QA will observe something unexpected but cannot easily get a fixed way to reproduce it. How to deal with this situation? It’s not safe to file a bug as chances are Dev cannot reproduce it. Sometimes, QA just let it go for various reasons, but which will never be reasonable for TS to do so, as Customers will not accept any of them at all.

    It’s necessary for Software testing engineer to work in this way and master this kind of capability.

    Firstly, some issues should be exposed in customer side now can be revealed in advance in testing phases, that’s absolutely good for any one.

    Secondly, the product debugging mechanism could get sharpen as QA becomes its big user and will report all the inconveniences, so very likely in the above example the poor TS will enjoy addressing the problem.

    Last but not least, a QA with positive attitude will see it’s also a chance to improve his competence in terms of problem resolving.

  • Notes of Linda's career talk

    2009-02-28 10:43:57

    This Friday afternoon, I attended a care talk hosted by HR mgr. of EMC China COE, Linda Di(Her Blog).

    Linda has a successful and colorful career path, in 10 years growing from Admin Assistant to HR mgr of China R&D center of a world-class company.

    Others’ success story may not be copied but can be learned. In the talk, Linda shared with us not only some stories but also her feelings, her thoughts and her complains as well. Followings are those impressed me most.

    1)      Influence leadership

    People may have others working for him/her using influence other than authority, as long as others believe you are doing right thing and they can achieve their interests along. And of cause, in a condition of others can accept your style.

    When she talked about influence leadership, I just recalled another note stressed by Robin Ren in his career talk a few months ago, that is “build up your reputation”. I think both notes referring to one point: you need to influence people around you, by showing your support, your capability and personality.

    2)      Make something different

    By making something different, you get a chance to show up yourself, and likely give people/mgr an impression that you are a dynamic, creative guy. But notice that this kind of difference should really bring positive effect.

    3)      Make a success story every year.

    Imagine what you can say when you happen to get a chance to be asked by a very high level mgr about your wok in the company.

    No matter how hard you work in each of the past 365 days, you just cannot tell him about that. All you need is an impressive success story, and then introduce it in 1~2 minutes.

    4)      Manager’s responsibility is to make his people success

    This is the key to a manager I believe, though I’m not a manager yet.

  • Rainfinity ATS成功之道

    2009-02-15 19:01:26


    Rainfinity ATS无疑是一个成功的ATS。它值得学习的地方不在于它的编码,而在于针对ATS这种特定软件,设计师在设计时做出的一些正确的决定对于我具有启发作用。

     

    总的来说,RainfinityATSKISS的又一个例证。 Keep It Simple and Stupid(K.I.S.S)

    1)  只关注系统最核心的功能。但对这个功能做非常充分的测试。RainfinityATS不想做瑞士军刀,而是只专注某一个功能的外科手术刀。设计任何ATS系统的时候我想都要把这个作为一个原则。如果测试的要求比较多,一个测试系统不能满足,那么宁愿另开炉灶,开发一个新的系统,也不要把所有的功能挤在一个系统里。

    2)  强制要求一个特定的环境,而不是让自己聪明来适应环境。RainfinityATS的初始配置工作非常麻烦,因为很多东西都要为它准备好。但好处是一旦配置好了,就能稳定的运行。

    3)  另外一个优点是充分利用了已有的工具,并且通过命令行和这些工具传递控制信息。这种方式是unix下面的惯用方式。它的好处是提高了模块间的独立性,相对于API调用。

     

    即使如此,Rainfinity ATS里面还是有一些失败的设计。这些设计几乎在所有ATS系统中都可见。保持对这些失败之处的警惕对设计人员来说是很重要的。

    1) 在错误的地方实现一个功能

    比如action groupAction group的出发点是好的,把action集合起来,定义为一个named group,然后直接引用此group即可。但是action group的问题是

    action group的功能非常简单,也就是一些action名字的集合。没有必要专门的一个类来处理。而且它导入间接性影响了理解testcase。也就是它的好处并不能抵消它带来的缺点。

    实际上action group的概念是有意义的,但它放在了错误的层内。它完全可以在testcase的层次来处理,而不用在ATS的框架里面。

     

    2)仅仅因为头脑发热而实现一个功能

    RainfinityATS里面还有一些脚本,比如到bugzilla查询bug的脚本。看得出来费了很多精力来开发,但几乎很少使用。因为即使亲自动手做这样的工作也是非常简单的。如果没有迫切的需要人们都懒得学习新的东西,所以使用率不高也在情理之中了。所以开发脚本的时候,如果它的用户是team所有的成员,那么一定不要头脑发热就开发,而是充分了解team成员的需求,在大部分人都有强烈的需求的情况下再动手。特别是这个脚本具有下面的特点的时候。

    1)  开发此脚本需要较大的投入

    2)  开发此脚本需要对已有的系统做一定的修改

     

     

     

     

  • 用一个参数来恒量自动化测试系统成功与否

    2009-02-15 18:48:54


    RainfinityATS是我见过最成功的自动化测试系统。我做出这个结论的依据是基于下面一个事实:

    ATS有超过3ktestcase,部署在超过8testbed上面。每一个testcycle,每一个testbed平均会运行超过2ktestcase。也就是16k testcase被运行。

     

    如果只能用一个参数来恒量自动化测试系统成功与否,我相信,它一定是在一个testcycle中该自动化系统的testcase的运行个数。商业软件的成功体现在它卖出了多少copy,自动化测试软件的成功体现在它运行了多少次testcase

     

    为什么这样说呢?因为如果一个ATS在这一点上得高分,那么就表明了它在下面三个方面做得很好。这一个参数是下面三个参数的综合体现,这三个参数代表了ManagerDevQAATS系统的要求。

    1)  testcase覆盖率。Manager要求覆盖率

    2)  测试运行效率。Dev要求运行效率,因为他们的发布频率加快了。最好每天都能运行一遍。

    3)  测试系统稳定性。QA喜欢运行稳定的系统,他们不想为跑测试过程中各种古怪的问题伤脑筋。

     

    所以,如果仅仅从覆盖性考虑而设计ATS--这也是我以前设计ATS的习惯,那么设计出来的ATS系统并不一定能高效率的运行。最终的效果也不一定好。只有一开始就把这三个因数考虑到,并把它们作为在设计时的做出判断的依据,才能设计出更好的ATS
  • 用好一个技术就要了解其缺点

    2009-02-12 22:05:42


    如果在你对问题的理解中,你想不出至少 3 样可能出错的东西,那么你并没有真正的理解这个问题。

                                                       ---摘自"你的灯亮着吗"


    做的项目越多,越能体会到没有所谓好的技术坏的技术”,只有合适的技术不合适的技术”。


    至少现在,在计算机界还没有通吃的技术. 设计人员应该根据解决的问题的不同,选择不同的技术;在软件的不同的层次,选择不同的技术; 根据对技术的掌握程度,选择不同的技术;

     

    条条道路通罗马,用不同的技术或技术组合都可以实现某一个功能. 最好的实现不是因为使用了最先进的技术”,也不是实现了“最复杂最全面的功能”,而是在功能和简单之间取得平衡的设计


    所以我们要用好技术,那么一定要既看到其优点,又了解其缺点.下面是对我了解比较多,也比较认可的技术的一些分析。这些分析是不全面的,写此文最重要的目的是提醒自己,以后在选择某种技术的时候,一定要分析其优缺点。

     

     

    优点

    缺点

    面向对象

    抽象数据结构(Abstract Data Structure)提供了一种更贴合现实世界的思考方式。

    每一个class有自己的名字空间,避免了面向过程程序的名字冲突。

    并不是所有的问题都是适合面向对象的思考方法。比如一段文本处理过滤程序。

    虽然继承也是面向对象技术里的标准功能,但继承带来的问题是信息被分离(分别在父类和子类中),程序更难理解和掌控。

    接口

    多态特性(动态绑定)提高了抽象的能力。提出了面向接口编程的概念。更好的隐藏了变化。

    增加了接口类的定义。

    面向接口的分析对分析人员的能力有更高的要求。设计不良的面向接口程序增加了系统的复杂性。

    面向接口比面向对象适合更大型的程序,更重型。所以面向过程的系统和小型的面向对象的系统不应该使用。

    增加抽象层

    增加抽象层可以提高灵活性,兼容变化。所谓“任何问题都可以通过增加抽象层来解决。”

    多了一层抽象层,系统的复杂性就增加了。“Unix编程环境“建议不要超过3层。

    模块化

    模块化的目标是只提供接口,而隐藏实现细节。

    模块化通过分而治之而提高了软件处理复杂问题的能力

    因为模块化隐藏了细节,外界没有机会了解其内部结构。所以对模块化的程序的健壮性,日志纪录有更高的要求。否则一旦模块内部出现问题,调用者就只能骂娘了。

    命令行

    相对于通过API调用其他模块的功能,通过命令行调用其他程序的功能实现了更高层次的隔离性。

    命令行的控制参数的传递没有API的函数参数直接,而且调用效率会更低

    管道

    管道通过输入输出链接程序是一个伟大的发明。

    1)使得程序的独立性更强,所以unix下面有很多实现单一任务的小程序。

    2)信息传递的有效性。管道实际上是一种信息处理的模式。而事实证明,有相当多的问题都可以在这种模式下解决,特别是unix下的系统管理。

    3)信息传递的简单性。一个输入一个输出,介质是没有格式的流。

    管道能解决的问题具有明显的特征。所以,不能适用于管道的地方不能也用管道去解决。

    管道之间传递控制参数比较困难。管道不是在同一个shell里运行,所以只能在管道之间共享只读参数。如果管道里面的程序修改了变量,下一个程序并不能看到。

     

  • 自动化不是灵丹妙药

    2009-02-11 22:50:23

    一天和同事聊天,他试图实现一个功能,让一个程序在系统重启后能自动启动,并且加载指定的配置。


    我分析了一下发现实现这个功能会比较复杂,主要是涉及多处配置文件的修改。回头再看看,发现这个系统很少会重启,可能一年就45次。于是我建议他放弃这个想法。因为维护配置文件会成为一个负担,考虑到系统重启的频率,这会是得不偿失。


    但是看来他并不以为然。他说他的目标是这些配置工作完全不用人来参与,“最好是在家里动一个手指所有的配置工作都自动化的为我做好了”。看到他信心满怀的样子,我不愿意扫他兴。但我相信如果即使有一天他真正实现了这个目标,维护这个自动化系统也会让他寝食难安。


    这样悲观的看法,我想在两三年前我肯定没有。那个时候我像他一样对“自动化”抱有无限美好的期望,好像只要测试自动化了,软件测试工作马上变得和“公务员一样轻松”,只需要动一下指头,所有的testcase都自动化得跑起来。


    但随着做了更多的自动化测试项目,也看了更多的成功和失败的案例。对自动化的特点了解得来越多,对自动化的期望也在一直不断的下降。


    这种看法的变化,我倒觉得是越来越贴近真实的“自动化测试”。


    如果要充分利用一个工具,一定要了解其特点。现在在业界,自动化软件测试就像一个人见人爱的香馍馍。自动化测试好像已经和“高科技”,“高测试效率”,“成熟的测试team这些褒义词联系了起来。在这种一边倒的氛围下,自动化程序的缺点和不足和必须要付出的代价被掩盖了起来。


    认识自动化的不足,我觉得首先要转变的一个想法是“自动化测试并不是用来发现bug的”。原因很简单,自动化测试基于testcase,但所有的bug中只有大约1/4是仅仅按照testcase来测试就能发现的,其它的bug,来自于聪明的“人”的经验,分析,发散思维和说不清道不明的“灵光一闪”,而这些特性对于自动化程序来说完全是无能为力。所以,幻想“动一下手指”,所以的bug都被自动化程序发现出来是完全不可能实现的。


    自动化另外一个特点是自动化本身也是程序,也需要投入大量的人力来实现。一个软件买出的copy越多,它的价值越大。对于自动化测试程序来说,它运行的次数越多,它的价值越大。有下面一些原因都可能减少自动化测试程序运行的次数,甚至导致自动化项目的失败。


    1)测试产品功能或界面变化频繁

    2)自动化的case本身不需要频繁的测试,比如安装过程或者一些非核心的功能

    3)自动化程序不稳定,容易跑“死”掉


    看到了一些自动化测试程序因为这些原因而效果大打折扣,我对“自动化一切”的热度慢慢退烧了。


    最后一个需要注意的自动化测试程序的特点是,自动化测试程序不是商业产品,它的用户都是专业人士,所以它不用商业产品那样高的扩展性,灵活性,可配置性,友好的交互性。因为这些特性的得来是要付出高昂的代价的,那就是人力投入和软件的复杂度大大增加。对于设计师来说,如果要在这些特性和简单中选择的话,一定要选择简单。


    1)对于错误处理要简单直接,而不要灵活和聪明。打印错误并直接退出是最好的选择,不要试图猜测错误的根源并试图从错误恢复。这里包括用户输入,环境错误等。

    2)对于环境设置,要求单纯一些,不要去兼容环境变化。一般来说测试环境都是有测试人员在维护。试图兼容环境可能导致代码大大增加。

    3)对于自动化测试的代码来说,也不要用太炫的设计技巧和复杂的设计模式。因为自动化测试的代码最好能被使用它的测试人员读懂,甚至能做简单的修改和排错,这样能提高自动化测试的次数。


    对自动化期望不能太高和自动化程序不要设计得太完美,是我对自动化测试程序设计和使用过程中获得的最深刻的体会。

     

     

  • 过度设计

    2009-02-11 22:47:42


    我觉得我一直都有过度设计的倾向。对面向对象,接口编程,抽象层,设计模式,插件化。。。所有提高软件灵活性,可配置性的技术都乐此不彼。后来发现使用这些技术本身也是有代价的,那就是增加了软件的复杂性。再后来,读了“unix编程艺术“,我发现我的问题不仅仅是没有对技术做全面的评估,而且在解决问题的思路上也是误入歧途。


    不得不承认,所有这些新技术确实能取得“自我欣赏”的效果,但事隔一段时间后再重读代码,也有“摸不着头脑”的效果。如此反复几次,我才发现了是这些抽象的层,数据结构让我难以抓住程序是如何实际解决问题的。


    在以前我认为事情的发展是这样的:软件要解决的问题越来越复杂,所以软件变得越来越复杂,为了降低复杂性,人们发明了新的技术。


    但事情的另一面是,新的技术本身比旧的技术要复杂。也就是新技术本身也引入了复杂性。


    所以要做出正确的设计,需要评估新技术引入的复杂性和降低的复杂性。以前的我,只看到事情的一面而不顾另一面,难免会出现所谓的过度设计。


    另外一个更根本的问题值得我反思,这种复杂性是必需的吗?有些情形,这种复杂性完全是自找的


    1)没有找到解决问题的巧妙的方法

    或许多了解一点,或许转变一下思路,就有非常简单而且巧妙的方法来解决问题。而且以效率最高的方式。

    关于圆珠笔的故事,关于左右手不能同时操纵机器的故事,关于剔除空肥皂盒的故事。这些故事都说明了,一个巧妙的解决问题的方法的令人惊叹的效果和效率。


    2)试图让程序更聪明

    如果你读了unix编程环境,你就会理解KISSkeep it simple and stupid)是一个多么智慧的箴言。与其让程序兼容变化,不如让这个地球上最聪明的人来处理变化。


    我曾经写了一段程序来处理ftp传输文件,后来想到如果能兼容scp会更酷,加入scp的过程中,发现如果加一个抽象层来处理所有能传输文件的协议还会更酷。最后的结果是代码由几行变成了几百行。而且事实是,从来没有用户试图用scp来传输文件。

    所以这种复杂性完全是自找的。也是完全可以避免的。


    现在如果让我在程序的功能和程序的简单直接做出选择,我首先选择简单。

  • 2009的学习计划(不可挽救的技术派?)

    2009-01-03 21:11:00

    在新公司工作了刚好一年多。对自己的看法有了很大的变化。

    进公司之前,以为自己在软件测试这个行业混了快5年,软件开发测试各个方面都略知一二,所以新工作应该是驾轻就熟,不成问题。对长达一个月的上岗培训更是颇有小题大做之感。

    结果,试用期刚开始发现自己不懂的地方怎么这么多。以前做的工作偏重越软件开发和java方面,而现在偏重系统管理,网络管理和存储方面,整个就是不太搭界嘛。所以三个月的试用期简直就是噩梦一般。每天都在应付各种问题和学习新的技术。

    一年过去了,仍旧觉得还有好多技术是“必须”学习而还没有学习的,很有紧迫感,列于下表。

    1) cifs/nfs 协议
    了解软件系统的底层对qa不是坏事。对于重要的基础技术,还要不仅仅限于“了解”。掌握甚至精通都是大有裨益的。
    2) cisco 局域网交换技术
    与软件所工作的环境息息相关的技术。相关知识的匮乏使得以前的工作多处受制,太不爽了。
    3) celerra的技术
    迟早的事,还不如早做准备。
    4)英语
    daydayup

    然又考虑到年近而立,还苦苦吊在“技术”这个树上,仍旧还是一个engineer,前途几多迷茫啊。。。
  • Dev大哥,报不报bug是我的事,修不修bug是你的事

    2008-12-28 22:25:14

    Dev大哥,报不报bug是我的事,修不修bug是你的事

    有一天因为一个bugDev交流。这个bug其实是一个 corner case,其发现也是一个偶然的原因,所以重现也比较麻烦。所以我开玩笑的说,你看,为了这个case我做了多大的工作。他看来也很委屈,说“你看看我提交了多少code fix”,然后拦也拦不住的打开了bug对应的code check in


    我看了看,为了这个bug fix,至少有1020fix被提交,涉及78个文件。为了这么一个corner case,这个代价值得吗?对这个corner casefix,让code变得更复杂。而且涉及到的修改的地方这么多。所以我对他说:报不报bugqa的事,但你并不一定要fix。如果你觉得代价太大,应该向product managerbug做评估是否真的需要fix


    软件产品的质量不仅是QA的责任,同样也是Dev的责任。对于QA,报出所有发现的bug就是对软件质量的责任。但对Dev来说,并不是就需要fix所有发现的bug。很有可能fix一个bug对代码的修改带来的风险比bug本身的风险更大。Devbugseverity的做出正确判断是体现Dev对产品的理解,Dev的能力的一个体现,也是Dev对软件产品质量负责的体现。
  • 嘿,你该跳槽了

    2008-12-28 21:28:53

    嘿,你该跳槽了

    对一个软件测试工程师来说,多长时间应该换一个工作?


    我觉得是1~3年。其实时间不是关键,关键的是你还能不能学到新知识。或者说你还有没有足够的动力去学习新知识。当你感到每天在重复昨天,而你又没有动力去学习新知识的时候,赶快跳吧!


    我觉得QA是一个经验非常重要的工作,这里的经验既包括软件测试本身需要具有的知识,比如设计testcase,处理bug的流程等等,还包括对对计算机科学各种技术的了解。


    对技术深度的要求来说,DevQA深很多,但谈到对技术广度的要求,QA又远胜Dev。计算机行业博大精深,Dev能做到某一块的精深,QA要做到多个领域的博大。比如操作系统,网络,安全,数据库。。。这样你才能对要测试的系统有更深入的了解,你也才能更有效的测试系统,甚至在和Dev的讨论中,你才能从他们想不到的角度提出你的见解,得到尊重。


    那么如何才有动力不断学习新知识,获得新经验呢?


    在某一个岗位,无论你是多么好学,如果没有现实的驱动,你也会慢慢懒惰下来。这个时候换个岗位,或者换个公司能让你重新活跃起来。


    所以,对于软件测试工程师来说,在开始的几年,多呆几个不同的公司并不是坏事。等你跳了几家之后,你就已经是资深工程师了,那个时候找个好公司干到退休也不是坏事。:-)


    第一个公司我呆了一年,由于别的原因离开。第二个公司呆了快4年,到后面感觉日子太轻松,像温水煮青蛙,想跳也懒的跳了。幸好公司bankrupt,别无他法。当时还觉得很可惜,现在想想要是还那样下去的话,再过几年,人都废掉了。

  • 软件测试工程师的猫论

    2008-12-28 20:40:38

    软件测试工程师的猫论

    有一天team building大家在一起吃饭,不知道谈到什么,我的manager突然对我说:当初你的面试评价非常一般,要不是XXXXXXX,你就被刷掉了!我当时听了心里不禁“苦笑”,心想就用这样的面试方法,没被刷掉真是太运气了。


    可以确定的是就这个公司在行业中的地位来所,肯定是要找一流的软件测试工程师。那么他们是怎么面试的呢?我印象最深刻的一点是80%以上的内容都是知识性的,而且这个知识还和他们的产品密切相关。有些甚至是非常具体的操作知识。比如有一个问题是如何共享一个windows的目录,还有如何配置一个openldap server等等


    知识性和具体操作的东西不是不重要,而是如果占到80%那就太多了。实际这还不是最让我吃惊的面试,我还经历过面试有类似智商测试题的。用这样的方法来找优秀的软件测试工程师,我觉得是很难的。因为这些测试的目标,基本上是舍本逐末。这些面试都没有瞄准软件测试工程师需要具备的核心能力。


    软件测试工程师的核心能力很简单,我认为就是发现bug的能力。就像总设计师的猫论,无论白猫黑猫,逮到耗子的就是好猫。


    这个能力说起来简单,但并不太好恒量,因为它是一个综合能力的体现。


    在人力资源方面,一种分析个人能力的方法是C/E/T分析方法,把人的能力分成3个方面。


    C代表Competence,指表现出来的解决问题或完成某项工作的具体的能。Competence都是是需要长时间的积累的。对软件测试来说比如发散思维的能力,对bug来源的判断和追踪能力,学习新知识的能力,设计testcase的能力,控制测试进度的能力等。所有的这些能力都能影响一个软件测试工程师能否以更高的效率发现更多的bug


    E代表Experience,指工作经验,项目经验。很多公司招聘的时候非常注重工作经验,特别是本行业工作经验。原因是,如果一个行业本身的知识门槛比较高,比如通信设备的测试,那么具有相关工作经验可以节约很多培训时间。还有一个原因是更多的经验通常说明能力更强,因为能力都是从经验中总结获取的。


    T代表Technical Knowledge, 也就是掌握的技术知识。比如会QTP,会perl编程,或者获得CCNA。这些技术知识一般来说相对上面的CE来说是最容易获取的。只要脑袋不笨,经过一段时间的自学都能掌握的。


    所以,面试一个软件测试工程师,最重要的是恒量他的Competence,然后了解他的工作经验,最后才是一些具体的技术知识。


    在我面试过的所有公司中,个人觉得ebay cdc的面试是最有效的恒量软件测试工程师能力的。可惜被刷了下来。以后有机会再去面一会 *_^

     

1064/6<123456>
Open Toolbar