发布新日志

  • LoadRunner案例分析之五

    2007-05-14 15:11:41

    最近被一个代理的问题搞的纠缠不清。我这个人其实很多时候是不求甚解的那种。自打上次跟Zee版主交流了以后,很受打击,惭愧的要命。打算以后改改这个毛病。凡是要探个究竟,正所谓惩前毖后,治病救人嘛。:)

    问题是这样的,VUGen里面录制的脚本,回放的时候出错,错误信息是:

    [Net An. Warning ( 218: 9f0)] Request Connection: Remote Server @ 66.102.7.147:80 (Service=) Failed attempt #3. Unable to connect to remote server: rc = -1 , le = 0)
    [Net An. Error ( 218: 9f0)] Request Connection: Remote Server @ 66.102.7.147:80 (Service=) NOT PROXIED! (REASON: Unable to connect to remote server: rc = -1 , le = 0)

    重新安装了LoadRunner,结果同样。从错误的表面看是代理的问题,但是本机上网不需要任何代理。也没有设置任何的代理。搜了一下,发现了问题的解决方法。其实挺搞笑的。居然是杀毒软件的问题。

    下面是详细的讨论经过(英文的,大家将就看,看不懂就查查辞典)

    ==================================================
    I’ve installed LR on a new machine and I’m encountering an error at record time. This is the error as recorded against loading the Google home page, along with the three warnings that proceed it:

    [Net An. Warning ( 218: 9f0)] Request Connection: Remote Server @ 66.102.7.147:80 (Service=) Failed attempt #1. Unable to connect to remote server: rc = -1 , le = 0)
    [Net An. Warning ( 218: 9f0)] Request Connection: Remote Server @ 66.102.7.147:80 (Service=) Failed attempt #2. Unable to connect to remote server: rc = -1 , le = 0)
    [Net An. Warning ( 218: 9f0)] Request Connection: Remote Server @ 66.102.7.147:80 (Service=) Failed attempt #3. Unable to connect to remote server: rc = -1 , le = 0)
    [Net An. Error ( 218: 9f0)] Request Connection: Remote Server @ 66.102.7.147:80 (Service=) NOT PROXIED! (REASON: Unable to connect to remote server: rc = -1 , le = 0)

    I’ve reinstalled LR twice with the same results.

    One other thing I’ve noticed is that under Run-time Settings, the browser emulation was set to IE 4 and no O/S. I installed LR on a second machine and the setting is IE 6/NT 5.1. The recorder also worked as expected. However this is an older box and I’d rather not use it.

    The Mercury forums point to possible spyware, but the new machine is clean. If anyone has any information it would be most appreciated.

    1. What version of LoadRunner or PerformanceCenter are you using? 8.1.0.0
    2. What is the protocol you are recording? HTTP/HTML
    2.1 If HTML - are you using HTML-Advanced with URLs or, NO
    2.2 URL mode with Concurrent groups, or NO
    2.3 URL mode without Concurrent groups? NO
    3. Which LoadRunner/PerformanceCenter feature or service packs are you using? None
    4. What kind of LoadRunner license do you have - Subscrīption, Perpetual, Virtual User days, or Evaluation? (choose the one that fits your license model) Evaluation
    4.1 If subscrīption, is subscrīption current or expired?
    5. What platform(s) and Operating Systems? Include version and service packs. IE 6.0 SP2 and XP SP 2
    6. If you have filed a service request with Mercury, what have they told you at this point with respect to your issue?
    I’ll be filing an SR today.

    Thanks,

    Dan
    ==================================================
    Dan, since you are using the evaluation version, please turn your questions to your field sales engineer for HP|Mercury or your VAR for assistance prior to your sale. It is their job to make sure all engineering issues are addressed prior to your purchase of LoadRunner, just as it is the sales representative’s job to make sure all organizational and logistical issues are addressed prior to your purchase. If your VAR or vendor sales engineer is unresponsive to your inquiries, then seek a new representative to work with. However, it has been my experience that a slight threat to go with another vendor that can better support your environment tends to light the fire under most sales types, particularly with a product like LoadRunner that easily can exceed $100,000.00 USD when optioned out.

    Thank you for your interest in evaluating LoadRunner prior to your purchase.

    James Pulley
    ====================================================
    Thanks for the suggestion.

    The controller license is purchased and this is the machine designated for activation. I’m dealing with Mercury on this issue as well.

    This is not the first time I’ve had installation issues with a Mercury product and I’m sure it won’t be the last. As I mentioned this is a new laptop so maybe that has something to do with it. But I’ve seen one other post in this forum describing my same problem and there was no resolution so I’m not optimistic that this will be resolved quickly.

    If Mercury/HP provides a solution I’ll post it here.
    ======================================================
    A Mercury engineer provided a workaround for this recording error. Under Tools -> Recording Options -> Network -> Port Mapping, the capture level was changed from ‘Socket Level Data’ to ‘WinINet level data’.

    When I get the fix for ‘Socket Level Data’ recording error on this PC, I’ll post it here.

    Dan
    =========================================================
    Thanks, Dan. You may not know it, but it all too rare for people to come back and post solutions, so we are truly grateful.
    ================================================
    Thanks for that Peter. I find it worthwhile to post resolutions as I hope they can help others.

    So I solved my problem. Digging into the process explorer pointed to the biolsp.dll from Wave Systems. I Googled it and found several discussion forums indicating it causes problems with other applications as well. The patch download link on the Wave website was dead. I don’t need bio security on my Dell so I uninstalled the whole program group. VUGEN is now working as expected.

    Good luck to all,

    Dan
    ====================
    so let me get this straight…you have to disable the bio security on the computer to get it to work? Seems like an interesting problem if you are required to have the security on as a company policy.
    ================
    That’s a great point jamesso and I agree; this wasn’t the solution I was looking for. Unfortunately there is more going on here. We aquired a term license with Mercury/HP and it activated the virtual users two weeks ago, even though the installation on the controller did not go as planned. But I’m at the point now where we’ve already burnt too much and can’t afford to burn any more of the license. I have to get back on track with the client so I’m going with this for now.

    Regards,

    Dan

    ======================
    So the term license started before you could actually get a controller working to use them….hmmm. Is HP flexible enough to own this problem and give you time that you lost?
    =======================
    Time will tell jamesso. I do want that time back and I am looking for consideration, but at this point I’m not optimistic.

    I don’t mind saying at this point that I was unhappy with being tied to a start date to begin with. This is the first time I’ve worked with a term license from HP and I would be very happy if it is my last. In my previous term engagements I used Segue/Borland. With their model I activated the license the day I was ready which got the project more value, more flexibility, and less waste.

    ===========================
    Hi Dan,

    i had same problem with new LR 8.1 installation with trial 10 days licenses…and my friend with 8 years LR experience say me possible solution(99%):

    you need to disable(sometimes uninstall) any antivirus software during installation process (LR need to notify USER before starting installation process, but i not find it),
    after restart the PC you can to enable AV again.

    Try and Enjoy
    =======================



    原帖:http://www.rickyzhu.com/2007/04/24/case-five-of-loadrunner/trackback/

  • LoadRunner案例分析之四

    2007-05-14 15:10:52

    最近在论坛上看到几次这样的问题,今天突然想起来,觉得比较典型,有必要分析一下。

    这个问题的具体描述大概是这样的:在web应用下,模拟十个用户并发进行数据的添加,结果每次执行全部成功,但是数据却不是十条,每次数据不一样,但是都比十小。

    乍一看,可能是数据参数化的问题,其实仔细想想,道理其实很简单。是数据库的问题。
    大多数的数据库都有记录锁的问题,第一次的数据操作没有commit之前,第二次对同样表进行的操作可能就没 有办法成功。所以每次数据的条数都达不到十条。但是为什么每次都不一样呢?这个问题也容易解释,因为每次的操作服务器的响应时间是不同的,所以不同虚拟用 户的提交时间也不是不同的,这样一来,就导致每次提交成功的数据量不一致。导致每次结果的条数可能是不同的。

    其实这个问题,跟LoadRunner的使用并没多大关系,而主要是对数据库的了解和应用执行机制的了解。如何解决这个问题,我现在还没有好的思路,是否对应用程序写数据库的过程作一些改进?大家可以一起探讨。



    原帖:http://www.rickyzhu.com/2007/04/22/case-four-of-loadrunner/trackback/

  • LoadRunner案例分析之三

    2007-05-14 15:10:13

    把昨天的功课补了,本来打算昨天分析一个典型案例,可惜太忙了。所以这么说。

    以前一直没有解决的问题,利用LoadRunner测试一个应用的时候,需要验证域用户,所以即使录制成功,每次回放的时候都提示错误,用户名和密 码不对,对此耿耿于怀了很久。今天居然解决了。解决方法就是一个简单的函数调用: web_set_user,此函数的解释和用法如下:

    The web_set_user function is a Service function that specifies a login string and password for a Web server or proxy server. It can be called more than once if several proxy servers require authentication. web_set_user overrides the run-time proxy authentication settings for user name and password.

    When you log onto a server that requires user and password validation, VuGen records a web_set_user statement containing the login details. However, there are some more stringent, authentication methods for which VuGen is unable to insert web_set_user statements. See User Authentication for more detail. In such cases, you can add web_set_user into your scrīpt manually.

    When you run the scrīpt, LoadRunner automatically submits the user authorization along with every subsequent request to that server. At the end of the scrīpt, LoadRunner resets the authorization.

    This function is supported for all Web Vusers, and for WAP Vusers running in HTTP mode only. It is not supported for WAP Vusers running in Wireless Session Protocol (WSP) replay mode.

    Example 3
    The following example was inserted manually by the user into the scrīpt as the Web server “mansfield” uses NTLM authentication. VuGen cannot record NTLM or Digest authentication. Note that for NTLM authentication the domain name “mansfield” followed by a double backslash must be prepended to the user name:

    web_set_user(”mansfield\\freddy”, “XYZ”, “mansfield:80″);

    原来一直没有想到域的设置,结果一直不行,现在可以了。
    另外一个问题跟之前这个有关系,那就是验证码的问题,之前曾经看过段念(关河大侠)的关于验证码的是三个解决方案,这里是第四种解决方案。对于一些比较简单有规律的验证码可以搞定。对于复杂的比如有干扰的,或者没有规律的则参考关大侠的其他解决方案。

    这个应用经过源代码分析,发现每次客户端请求过来的验证码都可以取到,格式如下固定,是四个数字的组合。经过多次尝试发现如下规律:
    验证码如下: 52|52|52|51|46|47|49|55|
    对应界面的验证码是: 6039
    规律是第2,5,8,9位的值减去46对应的即是验证码。
    有了这个规律,就可以通过关联提前取得服务器的验证码,然后通过简单的计算,得到结果。详细代码如下:

    1. #include "web_api.h"

    Action()
    {

    // char* str = “52|52|52|51|46|47|49|55|”;
    char result[64];
    int num1;
    int num2;
    int num3;
    int num4;

    int temp1;
    int temp2;
    int temp3;
    int temp4;

    web_set_user(”XXXXDomain\\szXXXX”,
    lr_decrypt(”46246a2633f042c67758b9ddc2b863038aa063c03d7e”),
    “XXXX.XXXX.com.cn:8080″);

    web_reg_save_param(”check”, “LB=Image=”, “RB=\\”, LAST);

    web_url(”Register”,
    “URL=http://XXXX.XXXX.com.cn:8080/xx/main/Register”,
    “Resource=0″,
    “RecContentType=text/html”,
    “Referer=”,
    “Snapshot=t1.inf”,
    “Mode=HTML”,
    LAST);

    lr_think_time( 6 );

    sscanf(lr_eval_string(”{check}”), “%d|%d|%d|%d|%d|%d|%d|%d”, &temp1, &num1, &temp2, &temp3, &num2, &temp4, &num3, &num4);

    num1 -= 46;
    num2 -= 46;
    num3 -= 46;
    num4 -= 46;

    sprintf(result, “%d%d%d%d”, num1, num2, num3, num4);

    lr_log_message(”getvalue : %s”, result);

    web_submit_form(”Register;jsessionid=6726009A7D21963602B166D91C883413″,
    “Snapshot=t2.inf”,
    ITEMDATA,
    “Name=Register.reason”, “Value= “, ENDITEM,
    “Name=set_attach”, “Value=result”, ENDITEM,
    LAST);

    return 0;
    }



    原帖:http://www.rickyzhu.com/2007/04/17/case-three-of-loadrunner/trackback/


  • LoadRunner案例分析之二

    2007-05-14 15:08:55

    昨天在广州交流会开始之前,一个朋友问起这样一个问题:他们公司的系统上线以后,用户分布在各个不同的地区,而且接入系统的方式和带宽也不同,这种情况下进行性能测试,如何保证更加真实的模拟用户行为?用LoadRunner可以做到吗?

    回答当然是肯定的,其实这些都是简单问题的组合,这样的问题考察的也是你对工具的熟悉和掌握程度。在VUGen里面,是可以通过RTS (runTimeSetting)来模拟一个单个用户更加真实的行为,比如思考时间,网络带宽,是否清除cache等等。同样的设置也可以在场景中进行设 置。而且LoadRunner提供设置不同用户组不同RunTimeSetting的功能。以达到模拟不同用户行为的更加真实组合。
    假设有三种不同带宽的用户,而且上传和下载的带宽也有所不同,那么可以录制两个脚本,分别模拟上传和下载的用户行为,再Controller里面,建立六 个不同的脚本组,脚本组的用户数可以按照绝对或者百比分的方法分布。比如100,50,200用户或者20%,40%,40%等,这取决于你的业务模型。 然后设置不同的带宽和分布情况。这样不同用户组的虚拟用户模拟出来的就是不同带宽的用户实际接入情况。就可以满足之前的问题的要求。参考下图:




    原帖:http://www.rickyzhu.com/2007/04/01/case-two-of-loadrunner/

  • LoadRunner案例分析之一

    2007-05-14 15:07:52

    昨天和Zee兄交流的时候,探讨了最近无忧测试论坛上的两个问题,我们俩的看法基本一致.

    第一个问题:是如何利用LoadRunner判断HTTP服务器的返回状态. 两种方法,第一种方法是利用LR的内置函数web_get_int_property, 如下是一个简单的例子:

    Action.c
    {
    int HttpRetCode;
    web_url(”my_home”, “URL=http://my_home”, “TargetFrame=_TOP”, LAST);
    HttpRetCode = web_get_int_property(HTTP_INFO_RETURN_CODE);
    if (HttpRetCode == 200)
    lr_log_message(”The scrīpt successfully accessed the My_home home page”);
    else
    lr_log_message(”The scrīpt failed to access the My_home home page “);
    }

    另外一种就是最原始的办法,也是Zee兄这种高手才最先想到的,自己取HTTP服务器的数据,然后利用关联函数分析啊. (果然是高啊). 其实所有的东西都可以从服务器的返回取,然后自己动手解析,呵呵. 举个不太恰当的例子: 你需要一套家具,可以去家具市场挑,当然也可以自己买木材原料和工具,动手加工. 那才是最合乎自己需要的. 这样一比喻, Zee兄弟似乎成了木匠了,嘻嘻~~

    第二个问题:动态数据参数化的问题.

    其实第一次看到这个问题,我没有马上反应过来,后来仔细想想, 明白了. 就是需要参数化的数据不是静态的,是动态的. 比如从数据库中选出来的.

    针对这个问题,我跟Zee兄弟的看法一致,应该提前从数据源(比如数据库)把数据选取出来,然后在执行的时候直接进行参数化的选取. 反之,如果在程序执行期间,进行数据的选取,将可能带来数据库服务器的强大压力,因为参加并发执行的每个虚拟用户都去数据库搜刮一下,对数据库将是多么严 峻的考验啊.

    朋友或者同事之间的探讨是加深对问题理解和增加知识面,扩展视野最直接的途径和方法,加强沟通,keep in touch.

    原帖:

    http://www.rickyzhu.com/2007/03/23/case-one-of-loadrunner/

  • 自动化测试的计划和实施第四阶段

    2007-05-10 13:34:55

    第四阶段,也是最后一个阶段了。在开始这个阶段之前,还想多说几句,今天又有朋友说他们公司打算实施自动化测试了,开发经理主导的。他们对测试自动 化的认识还是停留在自动化测试工具上。只是十分要命的。自动化测试的初衷是要缩短测试周期,出发点是好的,但是步骤明显有问题,测试周期的缩短是可以靠提 高测试效率,改进测试方法和引进测试工具来达到的,但是不是决定因素。测试流程的规范才是最根本的,如果一个组织测试流程不规范,想通过引入自动化测试来 规范这一流程是很不现实的。

    好了,现在开始正题。

    自动化测试的第四阶段是收获和ROI(投资回报)
    进入这个阶段,基本组织的测试自动化已经步入正轨和良性的发展,随着回归测试的不断深入,自动化测试的投入也 初显成效。一方面,通过不断的回归测试,测试的质量得到了一定程度的提高,另外,测试效率也大大提高。同事,因为测试和开发的沟通渠道日益畅通,产品的稳 定性和可测性也有了改进。这是一个良性的互动过程。

    通过不断的测试执行,测试的投资回报这个时候可以进行一些统计。
    先谈谈投资回报(Return On Investment)
    ROI不是自动化测试专有的名词, 任何项目都要讲求ROI, 没有事先做过ROI分析的项目都会面临失败的危险
    ROI是投入总成本和实际获利之间的一个对比率, 如果实际获利大于实际投入总成本, 则本次投资是合算的
    ROI可以由两方面来计算: 在向某件事投入之前, 先估计一下可以获利多少, 在执行之后再看一看实际获利多少, 前者是用度量的方法来预测, 后者是进行评估。
    一个针对测试(没有自动化)改进过程的ROI的简单计算如下:

    一个简单的自动化测试投资回报率的计算方法
    自动化测试成本 = 工具软硬件成本 + 脚本开发所耗成本 + (脚本维护成本 X 脚本执行次数) + (脚本执行成本 X 脚本执行次数)
    手工测试成本 = 测试用例设计开发成本 + (测试用例维护成本 X 测试用例执行次数) + (手工测试执行成本 X 测试用例执行次数)
    利益 = 手工测试成本 – 自动化测试成本
    ROI = 利益/自动化测试成本
    注: 自动化测试的ROI无法显示在测试过程中查找出来的缺陷个数
    一个可以参考的自动化测试的ROI的计算例子。

    至此,这个系列的原创文章全部结束。

  • 自动化测试的计划和实施第三阶段

    2007-05-10 13:34:24

    进入到自动化测试的第三阶段,此时距离当初开始实施自动化测试的决定,两年三个月已经过去了,可见自动化测试的实施不是一蹴而就的,更不可急功近利。第三个阶段的标志是有点到面的全面铺开。

    自动化测试开展的初期,可以是一个小组,几个人进行小面积的试点,这样投入的成本不是很大,即使失败了,也是可以理解和接受的,而要想取得投资回报 或者大面积的试用和推广,前提的试点也是必须的。 但是仅仅靠几个人是不可能把自动化测试做起来的。自动化测试的开发工作是一个持续的过程,又是一个矛盾体。

    持续的过程体现在:随着回归测试的不断进行,老的功能不断被自动化起来,就有一定的维护工作量,另外,新功能的测试不断完善和稳定,又变成可以进行 自动化测试的老功能。所以自动化测试是一个持续进行的过程,另外,又是一个持续改进的过程,随着自动化测试技术的不断成熟和测试业务的不断丰富,以前的老 功能的测试用例或者测试脚本也同样需要进行更新和维护。

    矛盾体体现在两个方面:首先自动化测试的开发和维护本身需要对测试脚本和测试业务有一定的熟悉。实际情况往往并非如此,精通测试业务的测试工程师一 般情况下对测试脚本甚至自动化测试一无所知。而对测试开发非常熟悉的自动化测试工程师又不熟悉业务,所以矛盾就这样产生了。另外,从整体来看,自动化测试 工程师的数量肯定远远小于手工测试工程师,这样,对业务测试工程师熟悉自动化测试知识,了解测试平台和测试脚本就提出了更高的要求。如果有一半的测试工程 师都能熟悉测试脚本,可以试用测试平台进行相关的自动化测试开发,那么可以肯定的说:自动化测试已经成功了一大半。

    矛盾的另外一个方面是资源的问题。手工测试工程师往往由于测试进度的压力疲于应付,所以对自动化测试平 台或者脚本的学习缺少时间,这个时候,测试经理就需要有很好的协调能力,可以从团队内部抽调部分懂开发,学习能力快的测试工程师进行集中的培训,在测试团 队内部形成一种自动化测试的氛围,从而引导整个测试团队更好的进行自动化测试的开展。还有一种问题,就是我们在实际操作过程中遇到的,虽然不是典型,不过 也应该注意避免这种情况的发生,手工测试工程师有些保守的观念,对自动化测试技术是排斥的。他们错误的认为,自动化测试的开展是对手工测试的冲击,如果所 有的feature都被自动化执行了,那么手工测试就被取代了。其实这是一种十分狭隘的心态,至于道理为什么,前面也已经提及了,自动化测试是一个持续的 过程。这里就不多说。

    如果自动化测试可以顺利在一个系统测试团队中开展,并且很好的坚持下去。很快自动化测试的效果和投资回报就能体现出来了,这就是本系列的最后一部分,下期继续。

  • 自动化测试的计划和实施第二阶段

    2007-05-10 13:33:14

    自从上个月介绍了自动化测试的计划和实施第一阶段,这阵子一直都在忙别的事情,加上博客访问断断续续,所以没有接下去。打算利用这几天的时间把剩下 的几个阶段完整的记录下来。也对打算实施自动化和已经在实施自动化过程中的朋友有点帮助吧。另外,也完成自己的承诺,五一之前完成这几篇文章。嘻嘻。

    第二阶段的副标题:从烦杂到豁然开朗

    其实这是我们经历的真实的过程,从一开始的没有完整的自动化平台和对平台重要性的认识不足,加上缺乏相关的经验,这个过程可谓吃尽了苦头。这这个阶段,即使有了测试平台的支持,随着脚本技术的进步,我们仍然要为以后的维护和扩展付出很大的代价。

    这样的痛苦过程经历了大概半年左右的时间,当随着脚本技术的探索思路越来越清晰的时候。其中最关键的里程碑是API概念的提出,就是一个分层的概念。其实也没有多少创意而言,只是在自动化测试概念中提出来,颇有一些不同。

    自动化测试的被测试对象总是千差万别的,针对不同的测试对象开发不同的API显然不是办法,我们提出了 三层API的概念。底层API,针对一些基本的操作,比如界面GUI的操作,封装一些基本的原子操作方法:按钮,下拉框,列表框等。针对服务器的操作,封 装一些telnet,执行命令,获返回结果等。针都数据库操作(oracle和mysql分开进行),封装一些查询,提交,连接等原子操作的API。随着 业务的不断变化,这些原子操作不需要进行维护,只有在需要的时候进行扩充。原子层之上是逻辑层,这一层的API变化的可能性比较大,对他们进行版本管理, 这是一个颗粒相对较大的封装,可以充分一些原子层的操作进行组装。最大限度的重用原子层的代码。最上层就是业务层的操作,这部分的颗粒更大。利用业务层的 接口进行组装。需要注意的是,对于每一层的API,接口要进行很好的设计和论证,充分考虑扩充和重用。必要的时候利用变参。

    上面讲了一些具体实现,这是从技术的实现角度考虑的。另外,平台的开发工作是同步进行的。好的技术实现离不开平台的支撑。还需要重复那句话:好的平台不仅仅使得测试开发变得更加容易,而且可以统一测试开发人员的思想和规范性。

    平台的东西只做简单介绍,我们平台开发基于Linux,主要语言是前台的Java和后台的Tcl,数据库选的Oracle。整个系统是一个分布式的 测试平台,前端是Web浏览器,后端是执行引擎。用户可以直接利用前面说的原子API在平台上书写测试用例,并进行执行。 这是一个很好的IDE。有很多比较强大的功能,包括测试执行,定制,开发,统计。

    至此,自动化进入了相对来说正规化的阶段。

  • 自动化测试的计划和实施第一阶段

    2007-05-10 13:32:10

    从自动化测试决策的制定到决定进行实施,这中间有很多工作要做.包括说服你的老板,自动化是一个持续投入的过程,而且初期投入很大,短期内无法看到 回报,而且要持续进行投入,不能半途而废,投入的过程中需要各个部门的通力合作,上至包括系统分析师,研发人员特别是研发部门经理,项目经理.下至系统测 试部门等等,每个环节都跟自动化测试有着直接和间接的关系. 一旦决定开始进行实施自动化测试,就基本上没有回头的道路,因为前期的巨大的投入,导致如果想要中途终止,那么前期的巨大投入就是严重的资源浪费.

    开头讲了一点题外话,现在开始介绍实施的第一阶段-从无序到有序.

    我参与的这个产品的自动化项目开始于二零零三年初,从一开始就缺少经验, 我们走过的每一步现在回想起来都是痛苦的经历.因为大家都没有类似的自动化经验,加上团队的每个成员基本上都是开发出身,加上项目进度紧张,缺乏必要的自 动化测试理念和自动化测试的相关培训.更严重的事,这个时候,自动化刚刚起步,没有一个自动化的平台支持. 结果是每个工程师把一个单独的自动化测试项目(一个模块)作为一个独立的工具进行开发.结果导致自动化测试用例的混乱,而且无法进行维护.不同工程师开发 出来的东西也是千奇百怪.自动化团队的工程师慢慢的失去了耐心和信心,产生了抵触情绪,这个为以后的自动化测试的顺利开展带来了一定的障碍.

    这个时候的教训就是不能急于求成,不能为了一味的追求速度和效率. 自动化团队的经理应该控制项目的节奏,不能妥协于项目的巨大压力. 逐步培养自动化开发工程师的兴趣和探索动力.

    另外就是自动化团队成员没有系统全面的培训和严格的规范约束,即使每个人都有能力开发出来自动化测试脚本,但是却难于维护和执行.这个时候我们就认 识到自动化测试平台或者架构的重要性不仅仅在于使得测试脚本的开发更加容易进行,而且可以统一大家的思想和测试脚本的一致性. 在这之前我们对自动化测试平台的认识比较肤浅.

    在不同的阶段,自动化团队的成员构成也不尽相同. 在这个阶段,自动化团队的成员基本上都是自动化开发工程师.就是把手工的测试模块进行脚本化. 然后可以自动化进行执行.

  • 自动化测试的计划和实施总纲

    2007-05-10 13:31:18

    测试自动化的计划和实施系列文章,最近开始酝酿思路,初步打算分为四个部分来组织, 这也是我亲身经历的一个自动化项目的四个阶段,大家可以对号入座,看看你所在的公司或者组织处于自动化实施的哪个阶段?

    第一个阶段: 从无序到有序

    这个阶段主要是自动化测试的引入,从一开始的无序的自动化测试,摸着石头过河, 到慢慢找到一些窍门,其中的关键点/转折点是自动化测试系统或者说自动化测试平台的出现. 这个时间大概持续了1年左右. 这部分重点介绍如何找到通往有序的方法和思路.

    第二个阶段: 从烦杂到豁然开朗

    这个阶段主要介绍基于原始的自动化测试系统开发积累到一定程度的问题显现. 逐步暴露的问题在这个阶段到了非解决不可的程度,主要的问题是什么? 解决的思路是什么? 到也是我们自动化测试进展最艰难的时候.希望能对你有所帮助.

    第三个阶段: 从点到面铺开

    这个阶段主要介绍自动化测试系统和平台的推广, 好的平台是推广和大面积使用的前提和保证.如何保证平台在推广过程中能顺利? 推广过程中我们遇到了哪些阻力? 我们是如何解决这些阻力和克服困的?

    第四个阶段:  收获和ROI

    这个阶段分析在自动化测试推广以后的一些问题,我们应该如何计算我们的产出和投入,投资回报应该如何计算? 这个阶段我们会遇到什么问题? 如何解决?

    最近一直比较忙,可能时间不是很连续,初步打算再五一之前能完成这几篇文章. 希望大家有耐心 ^_^ ,同事也希望能多听听大家的意见和对文章的期望.

  • 博客搬家了

    2007-02-21 13:47:15

    自己申请的域名终于找到安家立身之所了,在kingofhosts.com申请了一个空间.配置好域名解析服务器,Okay了.

    欢迎大家去我的新网站参观访问,比较好记: rickyzhu.com

    不过有好的技术文档还是会在这边刊登的.请放心了.

    多谢.


  • 软件测试自动化之实践

    2007-02-12 18:13:33

    一、概述

    软件测试自动化,从计算机这一庞大学科发展至今,最根本的意义是解决手工劳动的复杂性,成为替代某些重复性行为模式的最佳工具。

     

    二、实施软件测试自动化的理由

    1.         提高测试效率和降低测试成本

    2.         将重复性强的测试由手工转为可以独立开来自动实现的。

    3.         实现快速的回归测试,提高新版本发布的速度和质量,尤其是不能适应目前流行的迭代开发,回归测试频度高、工作量大,人工的测试很难对新的迭代版本作出快速评估。

    4.         自动测试可以避免,人工测试容易犯的错误:错误测试、漏测试、多测试和重复测试等

    5.         典型的应用,例如多用户并发注册、并发交易请求和并发交易应答,这种情况用人工测试几乎是办不到的,而自动测试却很容易。

    6.         对于很常用的功能性边界测试测试,人工测试非常耗费时间,而自动测试很快且准确。

    可以说,实施测试自动化是软件行业一个不可逆转的趋势,如果在这个领域走在了前列,无论从企业的核心竞争力还是个人的工作技能来说,都有巨大的优越性。

     

    三、软件测试自动化的引入条件

    自动化测试能大大降低手工测试工作,但决不能完全取代手工测试。完全的自动化测试只是一个理论上的目标,实际上想要达到 100% 的自动化测试,不仅代价相当昂贵,而且操作上也是几乎不可能实现。一般来说,一个 40-60% 的利用自动化的程度已经是非常好的了,达到这个级别以上将过大的增加测试相关的维护成本。

     

    测试自动化的引入有一定的标准,要经过综合的评估,绝对不能理解成测试工具简单的录制与回放过程。实际上,从实现成熟度来说,自动化测试分五个级别

    级别

    说明

    优点

    缺点

    用法

    一级

    录制和回放

    自动化的测试脚本能够被自动的生成,而不需要有任何的编程知识

    拥有大量的测试脚本,当需求和应用发生变化时相应的测试脚本也必须被重新录制

    当测试的系统不会发生变化时,实现小规模的自动化

    二级

    录制、编辑和回放

    减少脚本的数量和维护的工作

    需要一定的编程知识;频繁的变化难于维护

    回归测试时,用于被测试的应用有很小的变化

    三级

    编程和回放

    确定了测试脚本的设计,在项目的早期就可以开始自动化的测试

    要求测试人员具有很好的软件技能,包括设计、开发

    大规模的测试套件被开发、执行和维护的专业自动化测试

    四级

    数据驱动的测试

    能够维护和使用良好的并且有效的模拟真实生活中数据的测试数据

    软件开发的技能是基础,并且需要访问相关的测试数据

    大规模的测试套件被开发、执行和维护的专业自动化测试

    五级

    使用动作词的测试自动化

    测试用例的设计被从测试工具中分离了出来

    需要一个具有工具技能和开发技能的测试团队

    专业的测试自动化将技能的使用最优化的结合起来

     

     

    自动化测试能提高测试效率,快速定位测试软件各版本中的功能与性能缺陷,但不会创造性的发现测试脚本里没有设计的缺陷。测试工具不是人脑,要求测试设计者将测试中各种分支路径的校验点进行定制,没有定制完整,即便事实上出错的地方,测试工具也不会发觉。因此,制订全面、系统的测试设计工作是相当重要的。

     

    自动化测试能提高测试效率,但对于周期短、时间紧迫的项目不宜采用自动化测试。推行自动化测试的前期工作相当庞大,将企业级自动化测试框架应用到一个项目中也要评估其合适性,因此决不能盲目的的应用到任何一个测试项目中,尤其不适合周期短的项目,因为很可能需要大量的测试框架的准备和实施而会被拖跨。

     

    实施测试自动化必须进行多方面的培训,包括测试流程、缺陷管理、人员安排、测试工具使用等。如果测试过程是不合理的,引入自动化测试只会给项目团队带来更大的混乱。

     

    那么应该具备什么样的条件才可以引入自动化测试呢,才可以最大可能的减少引入风险,并能够可持续性的开展下去呢?

    第一,从项目规模上来说,没有严格限制。无论项目大小,都需要提高测试效率,希望测试工作标准化,测试流程正规化,测试代码重用化。所以第一要做到的,就是从公司高层开始,直到测试部门的任何一个普通工程师,都要树立实施自动化测试的坚定决心,不能抱着试试看的态度。一般来说,一个这样的软件开发团队可以优先开展自动化测试工作:测试与开发人员比例合适,比如1315,开发团队总人数不少于10个。

    第二,从公司的产品特征来说,一般开发产品的项目实施自动化测试要比纯项目开发要优越些。但决不是说做纯项目开发不能实施自动化测试,只要软件的开发流程、测试流程、缺陷管理流程规范了,自动化测试自然水到渠成。

    第三,从测试人员个人素质和角色分配来说,除了有高层重视外,还应该有个具有良好自动化测试背景和丰富自动化测试经验的测试主管,不仅在技术方面,更重要的是在今后的自动化测试管理位置起着领导的作用。还要有几个出色的开发经验良好的测试人员,当然也可以是开发工程师,负责编写测试脚本、开发测试框架,还有一些测试执行者,他们要对软件产品业务逻辑相当熟练,配合测试设计者完成设计工作,并在执行自动测试时,敏锐的分析和判断软件缺陷。

    综合分析上述三个条件,就可以决定是否推行自动化测试;但是为了减少实施风险,还要预测到其他潜在的风险,做好事先解决问题规避风险的思路。

     

    四、对实施自动化测试的风险分析

    资金风险,虽然有些项目具备实施自动化测试的条件,但还是要引入自动化测试后组织结构调整等方面的成本估算是很必要的。

     

    自动化测试对软件功能类型的切入点的风险,开发的产品业务和功能是否需要自动化测试?包括白盒自动化测试、功能自动化测试和性能自动化测试。

     

    软件自动化测试切入方式的风险,一定要将自动化测试与手工测试结合起来使用,不合理的规划会造成工作事倍功半。首先,对于自动化测试率的目标开始是 20/80 20% 的自动化测试和 80% 的手工测试),当这些目标都实现了,再将自动化测试率提高。

     

    时间估算,在评估完前面几项指标后,需要估算实施测试自动化的时间周期,以防止浪费不必要的时间,减少在人员、资金、资源投入上的无端消耗。虽然到测试自动化步入正轨以后,会起到事半功倍的效果,但前期的投入巨大,要全面考虑各种因素,明确实施计划并按计划严格执行,才能最大限度降低风险。

     

    工作流程变更风险,测试团队乃至整个开发组织实施测试自动化,或多或少会因为适应测试工具的工作流程,带来团队的测试流程、开发流程的相应变更,而且,如果变更不善,会引起团队成员的诸多抱怨情绪;所以应该尽量减少这种变更,并克服变更中可能存在的困难。

     

    五、什么条件下使用自动化测试

    一般在这样的条件下使用自动化测试

    l         具有良好定义的测试策略和测试计划(知道要测试什么,知道什么时候测试)

    l         对于自动化测试你拥有一个能够被识别的测试框架和候选者

    l         能够确保多个测试运行的构建策略

    l         多平台环境需要被测试

    l         拥有运行测试的硬件

    l         拥有关注在自动化过程上的资源

     

    如下条件下是宜采用手工测试:

    l         没有标准的测试过程

    l         没有一个测试什么、什么时候测试的清晰的蓝图

    l         在一个项目中,测试责任人是一个新人,并且还不是完全的理解方案的功能性和或者设计

    l         整个项目在时间的压力下

    l         在团队中没有资源或者具有自动化测试技能的人

     

    六、各测试阶段的自动化测试评估

    测试阶段

    描       述

    备    注

    单元测试/

    组件测试

    这个测试工作通常是开发人员的职责,很多不同的方法能够被使用,比如"测试先行",它是一个测试框架,开发人员在编写代码前编写不同的单元测试,当测试通过时,代码也被完成了。

    通过使用正式的单元测试,不仅能够帮助开发人员产出更加稳定的代码,而且能够是软件的整体质量更加的好。

    集成测试

    这里的测试工作集中在验证不同的组件之间的集成上。

    这种类型的测试通常是被测试系统的更加复杂测试的基础,大量的边缘测试被合并以制造出不同的错误处理测试。

    系统测试

    这种测试是通过执行用户场景模拟真实用户使用系统,以证明系统具有被期望的功能。

    这里不需要进行自动化的测试。安装测试、安全性测试通常是有手工完成的,因为系统的环境是恒定不变的。

    其它两种非常重要的测试

    回归测试

    回归测试实际上是重复已经存在的测试,通常如果是手工完成的化,这种测试只在项目的结尾执行执行一到两次。

    这里完全有潜力应用自动化的测试,能够在每次构建完成后执行自动化的回归测试,以验证被测试系统的改变是否影响了系统的其他功能。

    性能测试

    性能测试包括以下不同测试形式:

    - 负载测试
    -
    压力测试
    -
    并发测试
    -.....

    使用自动化的测试工具,通过模拟用户的负载实现的高密集度的性能测试。

     

  • 自动化测试的思考和总结之功利篇

    2007-02-10 19:02:35

    上周参加公司的自动化测试研讨会,今年的主题是ROI(投资回报),个人感觉这是一个很严肃的话题,也是领导最关心的一个问题。不过谈测试自动化的投资回 报似乎并不是一件容易的事情。测试自动化本身是一个需要持续投入的系统工程。他并不像开发过程一样那么容易衡量产出和回报。另外,对于测试自动化的投资回 报似乎不应该在一开始提到一个很高的高度。否则对自动化的开展非常不利。

    另外,测试自动化并不是简单的把手工的测试转化成自动化的代码或 者脚本这么简单的过程,而是要贯穿在产品的生命周期中,进行不断地执行,只有不断地执行,才能得到收益,根据经验,回归测试的自动化测试用例在不考虑被测 对象改变带来自动化测试脚本维护的前提下,反复执行4-7轮才能收回成本。如果被测对象本身不是十分稳定,或者缺陷比较多,产品不成熟,这个时候介入测试 自动化是非常得不偿失的。

    测试自动化在很大程度也依赖于被测对象或者被测设备的稳定性,系统的设计应该考虑到可测试性,Design for Test。测试自动化越早加入到产品的开发周期,成功的机会越大。
    关 于测试自动化的效果衡量不是简单的发现了多少缺陷,其实自动化测试并不能比手工测试发现更多的缺陷,如果要发现更多的缺陷,一定要进行必要的手工测试。自 动化测试的效果或者投资回报可以通过其他一些方法进行衡量,比如节省的测试人力成本,可以通过统计手工测试的时间,自动化测试的开发时间,自动化测试的执 行之间,执行次数,刨去维护时间,进行计算得到。另外,还可以从回归测试能加快产品的发布时间上进行衡量。

    最后,关于产品的自动化程度, 究竟多少比例的产品需要被自动化,这个取决于产品本身,以及这个产品本身可以被自动化的程度有关系,还要考虑自动化所需要花费的代价。一般来说,不是所有 的测试用例都需要自动化,也不是所有的测试用例都能够自动化。据个简单的例子,有一个测试用例,需要重新启动机房里面一台服务器,常规来说,是不能也不需 要自动化。但是有没有可能自动化呢?肯定有,不过肯定不会为了这个自动化这个测试用例而去花费巨大的代价开发一个机器人帮你完成这个任务。当然这是一个极 端的例子。目的是告诉大家,不是所有的测试用例都需要自动化,也不是所有的用力都能自动化。衡量的依据是不同产品和代价得多少。

  • <软件质量保证>读书笔记--合同评审

    2007-02-01 23:20:14

    如何区别两个合同评审阶段:
    建议草案评审。这个阶段评审最终建议草案及其基础:顾客的需求文档,顾客对需求的详细解释,费用与资源评估,同合伙商和分包商已有的合同等。
    合同草案评审。这个阶段在后续谈判其达成的理解和建议的基础上评审合同草案。

    每个合同评审阶段的目标:
    建议草案评审目标如下:

    • 已经考察了完成项目的替代途径。
    • 已经明确顾客与软件公司之间关系的正式方面。
    • 开发风险的识别。
    • 已经充分估计项目资源和进度。
    • 对公司完成项目的能力的考察。
    • 合伙商和分包商参与的确定。
    • 专有权利的确定和保护。
    合同草案评审目标如下:
    • 合同草案中没有留下未澄清的问题
    • 在建议之后达成的所有理解正确的文档化。
    • 没有将任何“新“的更改,补充或者遗漏放到合同草案中。

    为进行正确的重大合同评审,应当遵守下列指南:
    • 合同评审应该是建议编制进度安排的一部分。
    • 合同评审因该有一个小组执行。
    • 应当制定合同评审组的组长。

    一些小的对内项目也应该进行合同评审:
    在内部顾客和内部开发者之间维持的松散关系增加了项目失败的可能性。这种倾向可通过确定草案编制的适当规程和应用针对外部合同评审的相同指南而降低。
  • <软件质量保证>--软件质量保证部件概述

    2007-02-01 23:18:31

    McCall的因素模型将所有软件需求按照11个软件质量因素分类。这11个因素被分为如下三个类别--产品运行,产品校正和产品转移:
    1。产品运行因素:正确性,可靠性,效率,完整性,实用性。
    2。产品校正因素:可维护性,灵活性,可测试性。
    3。产品转移因素:可移植性,可重用性,互操作性。

    20世纪80年代出现了两个因素模型,被认为是McCall经典因素模型的替代物,他们是:

    • Evans和Marciniak因素模型
    • Deutsch 和 Willis因素模型
    这些替代物建议给McCall模型增加5个因素。其中两个非常类似于McCall模型的两个因素,其余三个因素是新的:
    • 两个模型都增加了可验证性因素
    • Deutsch 和 Willis模型增加了安全性和可管理性因素

    对于SQA系统部件的分类有如下:
    • 项目前质量部件
    • 项目生命周期质量部件
    • 基础设施错误防护与改进部件
    • 软件质量管理部件
    • 标准化,认证与SQA系统评估部件
    • SQA的组织--人的部件
    另外,影响SQA部件使用的主要考虑是:

    • 机构的考虑
    1, 软件开发主顾的类型
    2,软件维护主顾的类型
    3, 软件产品的范围
    4, 机构的规模
    5, 同进行相关项目的其他机构的合作程度与性质
    6, 优化目标
    • 项目与维护服务的考虑
    1, 复杂性和困难的等级
    2, 关于项目技术的经验等级
    3, 在新项目中软件重用的程度
    • 专业人员的考虑
    1, 专业资格
    2, 对项目组成员熟悉的程度
  • <软件质量保证>读书笔记--什么是软件质量保证

    2007-02-01 23:17:39

    软件质量保证,首先必须有概念的定义,什么是软件?什么是软件质量?什么是软件质量保证?

    • 软件---IEEE定义:
    软件是计算机程序,规程以及可能的相关文档和运行计算机系统需要的数据.

    也就是说,包含计算机程序,规程,文档和软件系统运行所必需的数据四个部分.

    • 软件错误,软件故障和软件失效的关系:
    软件错误是指由于程序分析员,程序员或者软件开发组其他成员造成的语法,逻辑或者其他错误,部分或者全部不正确的代码段
    软件故障是再特定应用期间导致软件不正确功能的软件错误
    只有再软件故障激活被激活的时候,即用户试图使用故障的特定软件段时,他才变成软件失效

    软件开发过程中产生的错误中只有部分会变成软件故障,而再这些故障中又只有部分转变成软件失效

    • 软件错误的9种产生原因
    1. 需求的不完善定义
    2. 客户-开发者通信失效
    3. 对软件需求的故意偏离
    4. 逻辑错误设计
    5. 编码错误
    6. 不符合文档编制于编码规定
    7. 测试过程的不足
    8. 规程错误
    9. 文档编制错误

    • 软件质量--IEEE定义
    软件质量是
    1. 系统,部件或者过程满足规定需求的程度.
    2.系统,部件或者过程满足顾客或者用户需要或期望的程度

    另外的关于软件质量的定义:
    符合明确陈述的功能和性能需求,明确文档化了的开发标准和所有专业开发软件预期的隐含特征(有点拗口,呵呵)


    • 软件质量保证--IEEE定义:
    软件质量保证是:
    1. 一种有计划的,系统化的行动模式,他是为项目或者产品符合已有技术需求提供充分信任所必需的.
    2. 设计用来评价开发或者制造产品的过程的一组活动.与质量控制有区别.

    然而,这和实际的软件质量保证有些偏离,首先:
    SQA不应局限与开发过程
    SQA行动不应局限与功能需求的技术方面,而应该包含同进度和预算有关的活动.
    基于这个考虑,有一个SQA的扩展定义:

    软件质量保证是:一个有系统的,有计划的行动集合,他是为提供软件产品的软件开发过程与维护过程符合其已建立的技术需求以及跟上计划安排与在预算限制之内进行的管理上的需求的充分信任所必需的.
  • <软件质量保证>读书笔记--预告

    2007-02-01 23:16:30

    最近一周正在苦读机械工业的<软件质量保证>,试图从理论上加深对软件质量,软件测试的理解.



    以后会陆续推出这类的读书笔记,也算给自己一个任务和交代,不能为了获取一点点的知识而去死读一本书.

    必须读一本,消化一本; 读一本,就要有所收获.

    是为序.
  • Linux中几个不常用但是很有用的命令

    2007-02-01 23:14:53

    Linux中有非常多很有用的命令,比如ps, top, vmstat等等,这些是应用比较广泛的,广为人知的。还有一些命令,非常有用,但是应用并不是十分广泛,如果充分利用这些命令,有时可以完成一些复杂的任务,起到很奇妙的效果。今天就来介绍几个这样的命令:

    Could the command-line tools you've forgotten or never knew save time and some frustration?


    One incarnation of the so called 80/20 rule has been associated with software systems. It has been observed that 80% of a user population regularly uses only 20% of a system's features. Without backing this up with hard statistics, my 20+ years of building and using software systems tells me that this hypothesis is probably true. The collection of linux command-line programs is no exception to this generalization. Of the dozens of shell-level commands offered by Linux, perhaps only ten commands are commonly understood and utilized, and the remaining majority are virtually ignored.

    Which of these dogs of the linux shell have the most value to offer? I'll briefly describe ten of the less popular but useful Linux shell commands, those which I have gotten some mileage from over the years. Specifically, I've chosen to focus on commands that parse and format textual content.

    The working examples presented here assume a basic familiarity with command-line syntax, simple shell constructs and some of the not-so-uncommon linux commands. Even so, the command-line examples are fairly well commented and straightforward. Whenever practical, the output of usage examples is presented under each command-line execution.

    The following eight commands parse, format and display textual content. Although not all provided examples demonstrate this, be aware that the following commands will read from standard input if file arguments are not presented.

    • Head/Tail
    显示一个文件指定的前面或者后面多少行,也可以用来实时显示文件的动态情况。比较适合用来跟踪日至文件的变化情况。

    As their names imply, head and tail are used to display some amount of the top or bottom of a text block. head presents beginning of a file to standard output while tail does the same with the end of a file. Review the following commented examples:

    ## (1) displays the first 6 lines of a file
    head -6 readme.txt
    ## (2) displays the last 25 lines of a file
    tail -25 mail.txt

    Here's an example of using head and tail in concert to display the 11th through 20th line of a file.


    # (3)
    head -20 file | tail -10

    Manual pages show that the tail command has more command-line options than head. One of the more useful tail option is -f. When it is used, tail does not return when end-of-file is detected, unless it is explicitly interrupted. Instead, tail sleeps for a period and checks for new lines of data that may have been appended since the last read.


    ## (4) display ongoing updates to the given
    ## log file

    tail -f /usr/tmp/logs/daemon_log.txt

    Imagine that a dæmon process was continually appending activity logs to the /usr/adm/logs/daemon_log.txt file. Using tail -f at a console window, for example, will more or less track all updates to the file in real time. (The -f option is applicable only when tail's input is a file).

    If you give multiple arguments to tail, you can track several log files in the same window.

    ## track the mail log and the server error log
    ## at the same time.

    tail -f /var/log/mail.log /var/log/apache/error_log


    • tac--Concatenate in Reverse
    反过来显示一个指定的文件或者输入,同cat反过来记忆比价有效。

    What is cat spelled backwards? Well, that's what tac's functionality is all about. It concatenates file order and their contents in reverse. So what's its usefulness? It can be used on any task that requires ordering elements in a last-in, first-out (LIFO) manner. Consider the following command line to list the three most recently established user accounts from the most recent through the least recent.


    # (5) last 3 /etc/passwd records - in reverse
    $ tail -3 /etc/passwd | tac
    curly:x:1003:100:3rd Stooge:/homes/curly:/bin/ksh
    larry:x:1002:100:2nd Stooge:/homes/larry:/bin/ksh
    moe:x:1001:100:1st Stooge:/homes/moe:/bin/ksh


    • nl--Numbered Line Output
    nl简单的一个行过滤器,可以在文件的前面标注上行号,并可以从指定的行号开始,还可以指定分割符号等等,请看下面的描述和例子。
    nl is a simple but useful numbering filter. I displays input with each line numbered in the left margin, in a format dictated by command-line options. nl provides a plethora of options that specify every detail of its numbered output. The following commented examples demonstrate some of of those options:


    # (6) Display the first 4 entries of the password
    # file - numbers to be three columns wide and
    # padded by zeros.
    $ head -4 /etc/passwd | nl -nrz -w3
    001root:x:0:1:Super-User:/:/bin/ksh
    002daemon:x:1:1::/:
    003bin:x:2:2::/usr/bin:
    004sys:x:3:3::/:
    #
    # (7) Prepend ordered line numbers followed by an
    # '=' sign to each line -- start at 101.
    $ nl -s= -v101 Data.txt
    101=1st Line ...
    102=2nd Line ...
    103=3rd Line ...
    104=4th Line ...
    105=5th Line ...
    .......

    • fmt--format
    fmt可以用来给指定的文件限制宽度,使显示起来符合规则,好看些。另外还有些特殊的参数可以使用,参考下面的描述。
    The fmt command is a simple text formatter that focuses on making textual data conform to a maximum line width. It accomplishes this by joining and breaking lines around white space. Imagine that you need to maintain textual content that was generated with a word processor. The exported text may contain lines whose lengths vary from very short to much longer than a standard screen length. If such text is to be maintained in a text editor (like vi), fmt is the command of choice to transform the original text into a more maintainable format. The first example below shows fmt being asked to reformat file contents as text lines no greater than 60 characters long.


    # (8) No more than 60 char lines
    $ fmt -w 60 README.txt > NEW_README.txt
    #
    # (9) Force uniform spacing:
    # 1 space between words, 2 between sentences
    $ echo "Hello World. Hello Universe." |
    fmt -u -w80
    Hello World. Hello Universe.


    • fold--Break Up Input
    fold有点类似于fmt地用法,但是用法更加特殊,参考下面的描述。
    fold is similar to fmt but is used typically to format data that will be used by other programs, rather than to make the text more readable to the human eye. The commented examples below are fairly easy to follow:


    # (10) format text in 3 column width lines
    $ echo oxoxoxoxo | fold -w3
    oxo
    xox
    oxo
    # (11) Parse by triplet-char strings -
    # search for 'xox'
    $ echo oxoxoxoxo | fold -w3 | grep "xox"
    xox
    # (12) One way to iterate through a string of chars
    $ for i in $(echo 12345 | fold -w1)
    > do
    > ### perform some task ...
    > print $i
    > done
    1
    2
    3
    4
    5

    上面的例子似乎不那么有效,更加有效的方法是:

    for i in `seq 5`; do print $i;done

    seq(1) allows to define start, stop, step and more.


    • tr
    tr is a simple pattern translator. Its practical application overlaps a bit with other, more complex tools, such as sed and awk [with larger binary footprints]. tr is quite useful for simple textual replacements, deletions and additions. Its behavīor is dictated by "from" and "to" character sets provided as the first and second argument. The general usage syntax of tr is as follows:


    # (13) tr usage
    tr [options] "set1" ["set2"] <> output

    Note that tr does not accept file arguments; it reads from standard input and writes to standard output. When two character sets are provided, tr operates on the characters contained in "set1" and performs some amount of substitution based on "set2".


    • pr
    相对于tr或者其他命令,pr命令主要用于打印的格式。
    pr shares features with simpler commands like nl and fmt, but its command-line options make it ideal for converting text files into a format that's suitable for printing. pr offers options that allow you to specify page length, column width, margins, headers/footers, double line spacing and more.

    Aside from being the best suited formatter for printing tasks, pr also offers other useful features. These features include allowing you to view multiple files vertically in adjacent columns or columnizing a list in a fixed number of columns.



    • Miscellaneous
    The following two commands are specialized parsers used to pick apart file path pieces.


    Basename/Dirname
    The basename and dirname commands are useful for presenting portions of a given file path. Quite often in scrīpting situations, it's convenient to be able to parse and capture a file name or the containing-directory name portions of a file path. These commands reduce this task to a simple one-line command. (There are other ways to approach this using the Korn shell or sed "magic", but basename and dirname are more portable and straightforward).

    basename is used to strip off the directory, and optionally, the file suffix parts of a file path. Consider the following trivial examples:


    :# (14) Parse out the Java Class name
    $ basename
    /usr/local/src/java/TheClass.java .java
    TheClass
    # (15) Parse out the file name.
    $ basename srcs/C/main.c
    main.c

    dirname is used to display the containing directory path, as much of the path as is provided. Consider the following examples:


    # (16) absolute and relative directory examples
    $ dirname /homes/curly/.profile
    /homes/curly
    $ dirname curly/.profile
    curly
    #
    # (17) From any korn-shell scrīpt, the following
    # line will assign the directory from where
    # the scrīpt was launched
    scrīpt_HOME="$(dirname $(whence $0))"
    #
    # (18)
    # Okay, how about a non-trivial practical example?
    # List all directories (under $PWD that contain a
    # file called 'core'.
    $ for i in $(find $PWD -name core )^
    > do
    > dirname $i
    > done | sort -u
    bin
    rje/gcc
    src/C


    至此,这几个命令就介绍完了,希望能给你的工作带来帮助,如果要更详细地用法,可以参考man命令的帮助。
  • Top的一个bug

    2007-02-01 23:13:55

    今天发现了top命令的一个bug, 监控进程的时候,明明当前有三个进程,可是top的低版本只能取到其中一个进程的资源信息.

    但是用高版本的就可以,操作日志如下:

    [root@MD_100_22 bin]# ./linux_top -b -n 2 -d 2 > old.log

    [root@MD_100_22 bin]# top -b -n 2 -d 2 > new.log

    查看了一下版本信息:

    [root@MD_100_22 bin]# ./linux_top -version

    procps version 2.0.11

    [root@MD_100_22 bin]# top -version

    top: procps version 3.2.5

    usage: top -hv | -bcisS -d delay -n iterations [-u user | -U user] -p pid [,pid ...]

    然后对文件内容进行对比:

    [root@MD_100_22 bin]#

    [root@MD_100_22 bin]# grep "media_director" old.log

    1563 root 15 0 104M 2292 1884 S 9.9 0.1 10:46 0 media_director

    1563 root 15 0 104M 2292 1884 S 9.4 0.1 10:46 0 media_director

    [root@MD_100_22 bin]# grep "media_director" new.log

    1567 root 15 0 1037m 601m 408m S 11.9 29.7 10:48.14 media_director

    1563 root 15 0 104m 2292 1884 S 0.0 0.1 0:00.01 media_director

    1568 root 16 0 104m 2304 1892 S 0.0 0.1 0:00.02 media_director

    1567 root 15 0 1037m 601m 408m S 8.0 29.7 10:48.30 media_director

    1563 root 15 0 104m 2292 1884 S 0.0 0.1 0:00.01 media_director

    1568 root 16 0 104m 2304 1892 S 0.0 0.1 0:00.02 media_director

    [root@MD_100_22 bin]#


    new的结果分析,显然每次有三个media_director的进程,可是老版本的居然只能取到一个,看来真的是bug.

    man top的时候看到报bug可以发邮件

    Michael K. Johnson <johnsonm@redhat.com> is now the maintainer.

    Please send bug reports to procps-list@redhat.com

    发了俩封邮件居然都被reject,,郁闷

    下载最新的top,请到官方网址.

  • vmstat命令中增加时间戳

    2007-02-01 23:12:50

    前阵子,利用vmstat生成的实时性能数据文件,美中不足是没有时间信息,缺少一个时间戳,测试结束后开发在debug问题的时候,往往需要定位性能瓶颈发生的具体时间,因此,需要为vmstat性能文件添加一个时间戳.

    利用强大的awk即可实现这个功能,如下:

    [autoadm@AUTOTEST-ATS ATSLib]$ vmstat 2 5 | awk '{print strftime("%H:%M:%S") $0}'
    17:08:07 procs memory swap io system cpu
    17:08:07 r b w swpd free buff cache si so bi bo in cs us sy id
    17:08:07 1 0 0 8 316280 251760 995400 0 0 23 75 120 108 1 1 98
    17:08:09 0 0 0 8 316280 251760 995400 0 0 0 12 105 70 0 2 98
    17:08:12 0 0 0 8 316280 251760 995400 0 0 0 344 113 75 0 0 100
    17:08:14 0 0 0 8 316072 251760 995400 0 0 0 0 116 167 6 2 92
    17:08:16 0 0 0 8 316072 251760 995400 0 0 0 340 114 76 0 0 100
    [autoadm@AUTOTEST-ATS ATSLib]$

    其中的命令strftime好像在solaris下面不行,不知道是否因为strftime函数的缘故?如果是这样,用系统命令date应该也可以,尝试如下:

    [autoadm@AUTOTEST-ATS ATSLib]$ vmstat 2 5 | awk '{ system("date +%H:%M:%S"); print $0}'
    17:10:25
    procs memory swap io system cpu
    17:10:25
    r b w swpd free buff cache si so bi bo in cs us sy id
    17:10:25
    0 0 0 8 316092 251764 995584 0 0 23 75 120 108 1 1 98
    17:10:27
    0 0 0 8 316092 251764 995584 0 0 0 98 109 77 0 0 100
    17:10:29
    0 0 0 8 315884 251764 995584 0 0 0 0 117 174 5 3 92
    17:10:31
    0 0 0 8 315892 251764 995584 0 0 0 348 137 97 0 0 100
    17:10:33
    0 0 0 8 315888 251764 995584 0 0 0 12 157 200 16 3 80
    [autoadm@AUTOTEST-ATS ATSLib]$

    不过这样也有一个缺陷,就是时间和性能数据分在了两行, 不知有什么好办法可以搞到一行?


    其实不仅仅是vmstat,其他的不带时间戳的命令都可以用这种方法得到时间戳.
291/212>

数据统计

  • 访问量: 38336
  • 日志数: 29
  • 图片数: 2
  • 书签数: 1
  • 建立时间: 2006-12-28
  • 更新时间: 2007-05-14

RSS订阅

Open Toolbar