发布新日志

  • Loadrunner 各位老师的视频大集会

    89798520 发布于 2013-09-06 14:21:20

    小布老师视频:
    测试工具概述,兼LoadRunner介绍 -1-4
    http://www.boobooke.com/v/bbk1046
    http://www.boobooke.com/v/bbk1047
    http://www.boobooke.com/v/bbk1048
    小布老师视频 - 在LoadRunner中使用动态库技术
    http://www.boobooke.com/v/bbk1049
    测试工具概述,兼LoadRunner介绍 -1-4
    http://www.boobooke.com/v/bbk1055  -- 更新与2011-04-20th
    LR系列培训视频  - LoadRunner概述(上下)
    http://www.boobooke.com/v/bbk1059
    http://www.boobooke.com/v/bbk1060
    LR系列培训视频  - LoadRunner安装
    http://www.boobooke.com/v/bbk1061
    LR系列培训视频  - 录制和回放测试脚本(1-3)
    http://www.boobooke.com/v/bbk1063
    http://www.boobooke.com/v/bbk1064
    http://www.boobooke.com/v/bbk1065
    LR系列培训视频 - LoadRunner测试Tuxedo应用系统 1-4
    http://www.boobooke.com/v/bbk1067
    http://www.boobooke.com/v/bbk1068
    http://www.boobooke.com/v/bbk1071
    http://www.boobooke.com/v/bbk1072
    开源性能测试工具Curl-Loader快速实战 - 1
    http://www.boobooke.com/v/bbk1808
    开源性能测试工具Curl-Loader快速实战 - 2
    http://www.boobooke.com/v/bbk1809
    开源性能测试工具Curl-Loader快速实战 - 3
    http://www.boobooke.com/v/bbk1835
    开源性能测试工具Curl-Loader快速实战 - 4
    http://www.boobooke.com/v/bbk1836
    使用LoadRunner测试Oracle实例研究 - 1
    http://www.boobooke.com/v/bbk2159
    使用LoadRunner测试Oracle实例研究 - 2
    http://www.boobooke.com/v/bbk2170
    使用LoadRunner测试Oracle实例研究 - 3
    http://www.boobooke.com/v/bbk2171
    小强作品:
    性能测试常见用语-性能测试基本概念剖析
    http://www.boobooke.com/v/bbk1577
    1. lr目录分析
    http://www.boobooke.com/v/bbk1574
    2.1 lr界面分析
    http://www.boobooke.com/v/bbk1735
    2.2 lr界面分析
    http://www.boobooke.com/v/bbk1736
    2.3 lr界面分析
    http://www.boobooke.com/v/bbk1737
    3 lr常用术语
    http://www.boobooke.com/v/bbk1620
    4. hp web tours 分析
    http://www.boobooke.com/v/bbk1762
    5 lr录制测试脚本
    http://www.boobooke.com/v/bbk1763
    6. lr回放测试脚本
    http://www.boobooke.com/v/bbk1764
    7. HTML和URL比较
    http://www.boobooke.com/v/bbk1771
    8. lr自动关联
    http://www.boobooke.com/v/bbk1778
    9. lr测试脚本的增强方法
    http://www.boobooke.com/v/bbk1772
    10. run time settings
    http://www.boobooke.com/v/bbk1782
    11. lr脚本编写实践过程
    http://www.boobooke.com/v/bbk1781
    小强作品:12 错误处理
    http://www.boobooke.com/v/bbk1776
    小强作品:13 脚本调试
    http://www.boobooke.com/v/bbk1777
    小强作品:14 java虚拟用户
    http://www.boobooke.com/v/bbk1901
    小强作品:15 调用dll
    http://www.boobooke.com/v/bbk1900
    小强作品:16 lr录制sql脚本
    http://www.boobooke.com/v/bbk1526
    小强作品: HP Web Tour网站介绍
    http://www.boobooke.com/v/bbk1762
    小强作品:LoadRunner常用术语介绍
    http://www.boobooke.com/v/bbk1620
    小强作品:LoadRunner之Portmapping技术
    http://www.boobooke.com/v/bbk2163
    小强作品:性能分析基础知识
    http://www.boobooke.com/v/bbk2162
    小强作品: LoadRunner之结果分析
    http://www.boobooke.com/v/bbk2144
    小强作品: LoadRunner之面向目标场景
    http://www.boobooke.com/v/bbk2168
    小强作品: LoadRunner之第一部分基础知识完结篇
    http://www.boobooke.com/v/bbk2201
    小强作品:Loadrunner再谈
    http://www.boobooke.com/v/bbk3510
    小强作品:LoadRunner编程实践, 自定义监控程序
    http://www.boobooke.com/v/bbk3585
    小强作品:LoadRunner编程实践, 函数妙用(1)
    http://www.boobooke.com/v/bbk3584
    小强作品:LAMP全程实战之在线商店项目实战 -15
    http://www.boobooke.com/v/bbk2476
    小强作品:性能测试与调优概览
    http://www.boobooke.com/v/bbk3511
    小强作品:Loadrunner编程 return 0的私密
    http://www.boobooke.com/v/bbk3429
    小强作品:Loadrunner编程之参数化
    http://www.boobooke.com/v/bbk3430
    小强作品:Load Runner 编程实践 结构体
    http://www.boobooke.com/v/bbk2993
    小强作品:Load Runner 8.0 Student Workbook介绍
    http://www.boobooke.com/v/bbk2991
    小强作品:常用软件和工具杂谈
    http://www.boobooke.com/v/bbk2974
    小强作品:LoadRunner与JMeter杂谈
    http://www.boobooke.com/v/bbk2312
    测试小生作品:LoadRunner快速实战 - 1 脚本录制
    http://www.boobooke.com/v/bbk2074
    测试小生作品:LoadRunner快速实战 - 2 场景设计,性能指标添加分析
    http://www.boobooke.com/v/bbk2075
    测试小生作品:LoadRunner快速实战 - 3 性能报告结果分析
    http://www.boobooke.com/v/bbk2076
    测试小生作品:中级篇3.4 开源性能测试工具JMeter之Tomcat监视器 - Apache服务器性能监控测试计划
    http://www.boobooke.com/v/bbk2172
    测试小生作品:开源性能测试工具JMeter之实战1
    http://www.boobooke.com/v/bbk2186
    测试小生作品:性能测试工具JMeter之初级篇 1 - 搭建WEB测试环境
    http://www.boobooke.com/v/bbk2107
    测试小生作品:开源性能测试工具JMeter之MySQL篇 - 初级2-1 JDBC连接数据库
    http://www.boobooke.com/v/bbk2108
    JMeter初级2-1 JDBC连接数据库 - 初级2.2 测试环境搭建MYsql Jcreator安装
    http://www.boobooke.com/v/bbk2128
    测试小生作品:开源性能测试工具JMeter之测试MySQL 初级2.3 MYSQL数据库的性能测试
    http://www.boobooke.com/v/bbk2129
    测试小生作品:性能测试工具Badboy介绍
    http://www.boobooke.com/v/bbk2106
    小生作品:JMeter结果分析 - Jmeter结果分析以及处理方式
    http://www.boobooke.com/v/bbk2925
    测试小生作品:开源性能测试工具入门篇- meter和badboy下载安装
    http://www.boobooke.com/v/bbk2127
    测试小生作品:中级篇3.1 开源性能测试工具-JMeter之安装Tomcat
    http://www.boobooke.com/v/bbk2136
    测试小生作品:中级篇3.2 开源性能测试工具JMeter之HTTP机制
    http://www.boobooke.com/v/bbk2149
    测试小生作品:中级篇3.3 开源性能测试工具JMeter之Tomcat性能测试以及关联详细讲解
    小歪作品:LoadRunner参数化之研究
    http://www.boobooke.com/v/bbk1617
    小歪作品:使用NMON监控系统性能
    http://www.boobooke.com/v/bbk1609
    小歪作品:LoadRunner关联之研究
    http://www.boobooke.com/v/bbk1586
    小歪作品:LoadRunner中的C语言指针
    http://www.boobooke.com/v/bbk2223
    雪鹰老师:LoadRunner中如何手工编写ftp测试脚本
    http://www.boobooke.com/v/bbk1349
    雪鹰老师:LoadRunner中web_reg_find和web_find两个函数的区别。本系列讲座一共两集
    http://www.boobooke.com/v/bbk1333
    http://www.boobooke.com/v/bbk1334
    小春作品:HP SiteScope入门培训 - 1/2
    http://www.boobooke.com/v/bbk2720
    小春作品:HP SiteScope入门培训 - 2/2
    http://www.boobooke.com/v/bbk2721
    Wind作品:LoadRunner测试ASP.NET投票系统实战
    http://www.boobooke.com/v/bbk2371
    Wind作品:LoadRunner测试ASP.NET投票系统实战 - 2
    http://www.boobooke.com/v/bbk2403
    Wind作品:LoadRunner测试ASP.NET投票系统实战 - 3
    http://www.boobooke.com/v/bbk2440
    Wind作品:LoadRunner常用函数介绍(1/2)
    http://www.boobooke.com/v/bbk2615
    Wind作品:SQL Server对称加密实例研究
    http://www.boobooke.com/v/bbk2394
    软件测试最佳实战远程培训之LR全程实战
    第一部:discuz论坛测试实战
    软件测试最佳实战远程培训之LR全程实战-环境介绍
    http://www.boobooke.com/v/bbk2295
    软件测试最佳实战远程培训之LR全程实战-TestLink介绍
    http://www.boobooke.com/v/bbk2328
    软件测试最佳实战远程培训之LR全程实战-BugFree介绍
    http://www.boobooke.com/v/bbk2413
    软件测试最佳实战远程培训之LR全程实战-立项书和计划书
    http://www.boobooke.com/v/bbk2466
    软件测试最佳实战远程培训之LR全程实战-Discuz 7测试点
    http://www.boobooke.com/v/bbk2620
    软件测试最佳实战远程培训之LR全程实战-注册流程的录制 - 1
    http://www.boobooke.com/v/bbk2617
    软件测试最佳实战远程培训之LR全程实战-注册流程的录制 - 2
    http://www.boobooke.com/v/bbk2618
    软件测试最佳实战远程培训之LR全程实战-注册脚本的增强
    http://www.boobooke.com/v/bbk2734
    软件测试最佳实战远程培训之LR全程实战-登录分析
    http://www.boobooke.com/v/bbk3593
    软件测试最佳实战远程培训之LR全程实战-登陆-1
    http://www.boobooke.com/v/bbk2992
    软件测试最佳实战远程培训之LR全程实战-登录-2
    http://www.boobooke.com/v/bbk3594
    软件测试最佳实战远程培训之LR全程实战-发帖-1
    http://www.boobooke.com/v/bbk3595
    软件测试最佳实战远程培训之LR全程实战-发帖-2
    http://www.boobooke.com/v/bbk3632
    软件测试最佳实战远程培训之LR全程实战-发帖场景设计
    http://www.boobooke.com/v/bbk3633
    软件测试最佳实战远程培训之LR全程实战-总结
    http://www.boobooke.com/v/bbk3634
    第二部:简易OA系统测试实战
    项目实战之简易OA系统 1 -- 课程介绍:
    http://www.boobooke.com/v/bbk3636
    项目实战之简易OA系统 2 -- 系统介绍:
    http://www.boobooke.com/v/bbk3637
    项目实战之简易OA系统 3 -- 需求分析:
    http://www.boobooke.com/v/bbk3638
  • 自动化测试工具总结

    staunch0442 发布于 2013-11-13 08:53:36

  • Python中的文件管理

    xfzhang 发布于 2008-07-25 10:56:12

    一、Python中的文件管理
     
    文件管理是很多应用程序的基本功能和重要组成部分。Python可以使文件管理极其简单,特别是和其它语言相对比。
    以下,Peyton McCullough讲解了文件管理基础。
     
    介绍
    你玩过的游戏使用文件来保存存档;你下的订单保存在文件中;很明显,你早上写的报告也保存在文件中。
    几乎以任何语言编写的众多应用程序中,文件管理是很重要的一部分。Python当然也不例外。在这篇文章中,我们将探究如何使用一些模块来操作文件。我们会完成读文件,写文件,增加文件内容的操作,还有一些另类的用法。OK,让我们开始吧。
     
    读写文件
    最基本的文件操作当然就是在文件中读写数据。这也是很容易掌握的。现在打开一个文件以进行写操作:
    1. fileHandle = open ( 'test.txt''w' )  
    ‘w'是指文件将被写入数据,语句的其它部分很好理解。下一步就是将数据写入文件:
    1. fileHandle.write ( 'This is a test.\nReally, it is.' )  
    这个语句将“This is a test.”写入文件的第一行,“Really, it is.”写入文件的第二行。最后,我们需要做清理工作,并且关闭文件:
     
    1. fileHandle.close()  
    正如你所见,在Python的面向对象机制下,这确实非常简单。需要注意的是,当你再次使用“w”方式在文件中写数据,所有原来的内容都会被删除。如果想保留原来的内容,可以使用“a”方式在文件中结尾附加数据:
     
    1. fileHandle = open ( 'test.txt''a' )   
    2. fileHandle.write ( '\n\nBottom line.' )   
    3. fileHandle.close()  
    然后,我们读取test.txt,并将内容显示出来:
    1. fileHandle = open ( 'test.txt' )   
    2. print fileHandle.read()   
    3. fileHandle.close()  
    以上语句将读取整个文件并显示其中的数据。我们也可以读取文件中的一行:
     
    1. fileHandle = open ( 'test.txt' )   
    2. print fileHandle.readline() # "This is a test."   
    3. fileHandle.close()  
            
    同时,也可以将文件内容保存到一个list中:
     
    1. fileHandle = open ( 'test.txt' )   
    2. fileList = fileHandle.readlines()<DIV></DIV>   
    3. for fileLine in fileList:   
    4.     print '>>', fileLine   
    5. fileHandle.close()  
    Python在读取一个文件时,会记住其在文件中的位置,如下所示:
     
    1. fileHandle = open ( 'test.txt' )   
    2. garbage = fileHandle.readline()   
    3. fileHandle.readline() # "Really, it is."fileHandle.close()  
    可以看到,只有第二行显示出来。然而,我们可以让Python从头开始读来解决这个问题:
     
    1. fileHandle = open ( 'test.txt' )   
    2. garbage = fileHandle.readline()   
    3. fileHandle.seek ( 0 )   
    4. print fileHandle.readline() # "This is a test."   
    5. fileHandle.close()  
    在上面这个例子中,我们让Python从文件第一个字节开始读取数据。所以,第一行文字显示了出来。当然,我们也可以获取Python在文件中的位置:
     
    1. fileHandle = open ( 'test.txt' )   
    2. print fileHandle.readline() # "This is a test."   
    3. print fileHandle.tell() # "17"   
    4. print fileHandle.readline() # "Really, it is."  
    或者在文件中一次读取几个字节的内容:
     
    1. fileHandle = open ( 'test.txt' )   
    2. print fileHandle.read ( 1 ) # "T"   
    3. fileHandle.seek ( 4 )   
    4. print FileHandle.read ( 1 ) # " "(原文有错)  
    WindowsMacintosh环境下,有时可能需要以二进制方式读写文件,比如图片和可执行文件。此时,只要在打开文件的方式参数中增加一个“b”即可:
     
    1. fileHandle = open ( 'testBinary.txt''wb' )   
    2. fileHandle.write ( 'There is no spoon.' )   
    3. fileHandle.close()  
     
    1. fileHandle = open ( 'testBinary.txt''rb' )   
    2. print fileHandle.read()   
    3. fileHandle.close()  
    二、从现有文件中获取信息
    使用Python中的模块,可以从现有文件中获取信息。使用“os”模块和“stat”模块可以获取文件的基本信息:
     
    1. import os   
    2. import stat   
    3. import time<DIV></DIV>   
    4.   
    5. fileStats = os.stat ( 'test.txt' )   
    6. fileInfo = {   
    7.     'Size' : fileStats [ stat.ST_SIZE ],   
    8.     'LastModified' : time.ctime ( fileStats [ stat.ST_MTIME ] ),   
    9.     'LastAccessed' : time.ctime ( fileStats [ stat.ST_ATIME ] ),   
    10.     'CreationTime' : time.ctime ( fileStats [ stat.ST_CTIME ] ),   
    11.     'Mode' : fileStats [ stat.ST_MODE ]   
    12. }   
    13.   
    14. for infoField, infoValue in fileInfo:   
    15.     print infoField, ':' + infoValue   
    16. if stat.S_ISDIR ( fileStats [ stat.ST_MODE ] ):   
    17.     print 'Directory. '  
    18. else:   
    19.     print 'Non-directory.'  
    上面这个例子创建了一个包含文件基本信息的dictionary。然后显示了相关信息,并且告诉我们打开的是否为目录。我们也可以试一下打开的是否是其它几种类型:
     
    1. import os   
    2. import stat   
    3.   
    4. fileStats = os.stat ( 'test.txt' )   
    5. fileMode = fileStats [ stat.ST_MODE ]   
    6. if stat.S_ISREG ( fileStats [ stat.ST_MODE ] ):   
    7.     print 'Regular file.'  
    8. elif stat.S_ISDIR ( fileStats [ stat.ST_MODE ] ):   
    9.     print 'Directory.'  
    10. elif stat.S_ISLNK ( fileStats [ stat.ST_MODE ] ):   
    11.     print 'Shortcut.'  
    12. elif stat.S_ISSOCK ( fileStats [ stat.ST_MODE ] ):   
    13.     print 'Socket.'  
    14. elif stat.S_ISFIFO ( fileStats [ stat.ST_MODE ] ):   
    15.     print 'Named pipe.'  
    16. elif stat.S_ISBLK ( fileStats [ stat.ST_MODE ] ):   
    17.     print 'Block special device.'  
    18. elif stat.S_ISCHR ( fileStats [ stat.ST_MODE ] ):   
    19.     print 'Character special device.'  
    另外,我们可以使用“os.path”来获取基本信息:
     
    1. import os.path   
    2.   
    3. fileStats = 'test.txt'  
    4. if os.path.isdir ( fileStats ):   
    5.     print 'Directory.'  
    6. elif os.path.isfile ( fileStats ):   
    7.     print 'File.'  
    8. elif os.path.islink ( fileStats ):   
    9.     print 'Shortcut.'  
    10. elif os.path.ismount ( fileStats ):   
    11.     print 'Mount point.'  
    三、目录
    和普通文件一样,关于目录的操作也很容易掌握。首先,列出一个目录的内容:
     
    1. import os   
    2.   
    3. for fileName in os.listdir ( '/' ):   
    4.     print fileName  
    正如你所见,这很简单,用三行代码就可以完成。
    创建目录也很简单:
     
    1. import os   
    2.   
    3. os.mkdir ( 'testDirectory' )  
    删除刚才创建的目录:
     
    1. import os   
    2.   
    3. os.rmdir ( 'testDirectory )  
    嗯,可以创建多级目录:
     
    1. import os   
    2.   
    3. os.makedirs ( 'I/will/show/you/how/deep/the/rabbit/hole/goes' )  
    如果没有在创建的文件夹中添加任何东西,就可以一次性将它们全部删除(即,删除所列的所有空文件夹):
     
    1. import os   
    2.   
    3. os.removedirs ( 'I/will/show/you/how/deep/the/rabbit/hole/goes' )  
    当需要对一个特定的文件类型进行操作时,我们可以选择“fnmatch”模块。以下是显示“.txt”文件的内容和“.exe”文件的文件名:
     
    1. import fnmatch   
    2. import os   
    3.   
    4. for fileName in os.listdir ( '/' ):   
    5.     if fnmatch.fnmath ( fileName, '*.txt' ):   
    6.         print open ( fileName ).read()   
    7.     elif fnmatch.fnmatch ( fileName, '*.exe' ):   
    8.         print fileName  
    *”字符可以表示任意长度的字符。如果要匹配一个字符,则使用“?”符号:
     
    1. import fnmatch   
    2. import os   
    3.   
    4. for fileName in os.listdir ( '/' ):   
    5.     if fnmatch.fnmatch ( fileName, '?.txt' ):   
    6.         print 'Text file.'  
    fnmatch”模块支持正则表达式:
     
    1. import fnmatch   
    2. import os   
    3. import re   
    4.   
    5. filePattern = fnmatch.translate ( '*.txt' )   
    6. for fileName in os.listdir ( '/' ):   
    7.     if re.match ( filePattern, fileName ):   
    8.         print 'Text file.'  
    若只需要匹配一种类型的文件,更好的办法是使用“glob”模块。该模块的格式和“fnmatch”相似:
     
    1. import glob   
    2.   
    3. for fileName in glob.glob ( '*.txt' ):   
    4.     print 'Text file.'  
    使用一定范围的字符来匹配同样可行,就像在正则表达式中使用一样。假设你想要显示扩展名前只有一位数字的文件的文件名:
     
    1. import glob   
    2.   
    3. for fileName in glob.glob ( '[0-9].txt' ):   
    4.     print filename  
    glob”模块利用“fnmatch”模块来实现。
     
    四、数据编组
    使用前一节中介绍的模块,可以实现在文件中对字符串的读写。
    然而,有的时候,你可能需要传递其它类型的数据,如listtupledictionary和其它对象。在Python中,你可以使用Pickling来完成。你可以使用Python标准库中的“pickle”模块完成数据编组。
    下面,我们来编组一个包含字符串和数字的list
     
    1. import pickle   
    2.   
    3. fileHandle = open ( 'pickleFile.txt''w' )   
    4. testList = [ 'This'2'is'1'a'0'test.' ]   
    5. pickle.dump ( testList, fileHandle )   
    6. fileHandle.close()  
    拆分编组同样不难:
     
    1. import pickle   
    2.   
    3. fileHandle = open ( 'pickleFile.txt' )   
    4. testList = pickle.load ( fileHandle )   
    5. fileHandle.close()  
    现在试试存储更加复杂的数据::
     
    1. import pickle   
    2.   
    3. fileHandle = open ( 'pickleFile.txt''w' )   
    4. testList = [ 123, { 'Calories' : 190 }, 'Mr. Anderson', [ 127 ] ]   
    5. pickle.dump ( testList, fileHandle )   
    6. fileHandle.close()  
     
    1. import pickle   
    2.   
    3. fileHandle = open ( 'pickleFile.txt' )   
    4. testList = pickle.load ( fileHandle )   
    5. fileHandle.close()  
     
    如上所述,使用Python的“pickle”模块编组确实很简单。众多对象可以通过它来存储到文件中。如果可以的话,“cPickle”同样胜任这个工作。它和“pickle”模块一样,但是速度更快:
     
    1. import cPickle   
    2.   
    3. fileHandle = open ( 'pickleFile.txt''w' )   
    4. cPickle.dump ( 1776, fileHandle )   
    5. fileHandle.close()  
    五、创建“虚拟”文件
    你用到的许多模块包含需要文件对象作为参数的方法。但是,有时创建并使用一个真实的文件并让人感到有些麻烦。所幸的是,在Python中,你可以使用“StringIO”模块来创建文件并将其保存在内存中:
     
    1. import StringIO   
    2.   
    3. fileHandle = StringIO.StringIO ( "Let freedom ring" )   
    4. print fileHandle.read() # "Let freedom ring."   
    5. fileHandle.close()  
    cStringIO”模块同样有效。它的使用方法和“StringIO”一样,但就像“cPickle”之于“pickle”,它速度更快:
     
    1. import cStringIO   
    2.   
    3. fileHandle = cStringIO.cStringIO ( "To Kill a Mockingbird" )   
    4. print fileHandle.read() # "To Kill a Mockingbid"   
    5. fileHandle.close()  
    结论
    文件管理,是众多编程语言的程序员在编写应用程序是经常遇到的问题。幸好,和其它语言相比,Python使其出乎意料地容易。Python的标准库中提供了许多相关的模块帮助程序员解决这方面的问题,而它的面向对象的机制也简化了操作。
    好了,现在你已经了解了Python中文件管理的基本知识,可以在今后的应用程序中很好地使用了。
  • python执行telnet命令

    xfzhang 发布于 2008-07-25 11:21:26

    一个简单的用python执行telnet命令的例子

    # -*- coding: mbcs -*-

    import telnetlib
    import ipAddress
    import sys

    host='122.224.113.164'
    port = 20001
    command='showall'
    timeout = 2

    def telnet():
        global command
        try:
            tn = telnetlib.Telnet(host,port) #连接端绑定到主机 HOST  去
        except:
            print   "Cannot open host"
            return   
       
        tn.write(command+'\r\n')
        msg = tn.read_until("$",timeout)
        tn.write("exit\r\n")
        tn.close()
        print msg
        cont = raw_input("\ncommand>")
        if cont != '':
            command = cont
        show()


    def help():
        print """python telnet.py [host=<host>] [port=<port>] [timeout=<timeout>] [command=<command>]"""
       
    if __name__ == "__main__":
        if len(sys.argv) >= 2:  # additional parameters
            for arg in sys.argv[1:]:
                pv=arg.split("=")
                if len(pv)!=2:
                    help()
                    sys.exit()
                if pv[0] == "min":
                    min=int(pv[1])
                elif pv[0] == "host":
                    host=pv[1]
                elif pv[0] == "port":
                    port = int(pv[1])
                elif pv[0] == "command":
                    command = pv[1]
                elif pv[0] == "timeout":
                    timeout = int(pv[1])
                else:
                    help()
                    sys.exit()
        show()
       
       

  • Python下载百度新歌100的代码

    yang119345 发布于 2007-02-07 17:00:28

      1 #!/usr/bin/python 
      2 # -*- coding: utf-8 -*- 
      3 # Copyright (c) 2006 UbuntuChina <http://www.ubuntu.org.cn> 
      4 # License: GPLv2 
      5 # Author: oneleaf <oneleaf AT gmail.com> 
      6 # hack by ct <ctqucl AT gmail.com> 
      7 
      8 import httplib
      9 import re
     10 import urllib
     11 import os
     12 import locale
     13 global m,topid
     14 global fsize
     15 fsize=2     #文件大小下限(M) 
     16 m='0'       #'-1'=任意  '0'=mp3 '1'=rm '2'=wma '3'=asf '4'=ram '5'=mid '6'=flash 
     17 topid='1'
     18 
     19 if topid=='0':
     20      topid='/list/newhits.html'         #新歌100 
     21 elif topid=='1':
     22      topid='/topso/mp3topsong.html'     #Top500 
     23 elif topid=='2':
     24      topid='/list/oldsong.html'         #老歌经典 
     25 elif topid=='3':
     26      topid='/list/movies.html'          #电影金曲 
     27 elif topid=='4':
     28      topid='/list/tvs.html'             #电视歌曲 
     29 elif topid=='5':
     30      topid='/minge/mp3topsong.html'     #民歌精选 
     31 elif topid=='6':
     32      topid='/xiaoyuan/mp3topsong.html'  #校园歌曲 
     33 elif topid=='7':
     34      topid='/list/liujinsuiyue.html'    #流金岁月(new) 
     35 elif topid=='8':
     36      topid='/list/yaogun.html'          #摇滚地带 
     37 
     38 
     39 def getdownfileurl(url):                #获取歌曲页的试听URL 
     40     url = "http://220.181.27.54/m"+url
     41     tn = re.search('&tn=(.*)&word',url).group(0)
     42     url=url.replace(tn,'&tn=baidusg,mp3%20%20&word')
     43     try:
     44         urlopen = urllib.URLopener()
     45         fp=urlopen.open(url)
     46         data = fp.read()
     47         fp.close()
     48     except IOError, errmsg:
     49         print errmsg
     50     expression2='"_blank">(.*)</a></a></li>'
     51     url = re.search(expression2, data).group(0)[16:-13]
     52     try:
     53         url="http://"+urllib.quote(url)
     54     except:pass
     55     #print u"发现 "+url 
     56     return url
     57 
     58 def getdownurl(url):                     #从歌曲页抓取URL列表 
     59     urllist=[]
     60     urllist1=[]
     61     urllist2=[]
     62     conn = httplib.HTTPConnection('mp3.baidu.com')
     63     conn.request("GET",url)
     64     response = conn.getresponse()
     65     html=response.read()
     66     conn.close()
     67     expression2='http://220.181.27.54/m(.*)" target'
     68     listSentence2 = re.findall(expression2, html)     #抓取链接列表 
     69     filesize=re.findall('<td>(.*)M</td>',html)        #抓取文件大小 
     70     lineno=0
     71     while lineno<len(listSentence2):
     72         mp3url=getdownfileurl(listSentence2[lineno])  #转换链接为最终下载地址 
     73         urllist1.append(mp3url)
     74         lineno+=1
     75     urllist=map(None,urllist1,filesize)
     76     return urllist
     77 
     78 def downmp3(url,author,name,filelist):    #下载歌曲 
     79     filename=author+"-"+name;
     80     for i in filelist:
     81         name=unicode(i,locale.getpreferredencoding())
     82         if name.find(filename) == 0:      #忽略 
     83             print u"文件已经下载,忽略。"
     84             return 1
     85     urllists=getdownurl(url)              #获取文件url列表 
     86     lineno=0
     87     while lineno<len(urllists):
     88         print u"尝试",urllists[lineno][0]
     89         ext=urllists[lineno][0][-4:]      #获取文件名后缀(最后4位) 
     90         try:
     91             lineno+=1
     92             print urllists[lineno-1][1] +'M'
     93             if float(urllists[lineno-1][1])>float(fsize) :   #大小符合则下载 
     94                   urlopen = urllib.URLopener()
     95                   fp=urlopen.open(urllists[lineno-1][0])
     96                   data = fp.read()
     97                   fp.close()
     98                   filename=filename+ext;
     99                   file=open(filename,'w+b')
    100                   file.write(data)
    101                   file.close()
    102                   print u"下载成功!"
    103                   return 1
    104             elif float(urllists[lineno][1])<float(fsize) :   #不符则略过 
    105                   print u"文件太小,忽略!"
    106         except:
    107             continue
    108     return 0
    109 
    110 if __name__ == "__main__":
    111     conn = httplib.HTTPConnection('list.mp3.baidu.com')
    112     conn.request("GET",topid )  #类型 
    113     response = conn.getresponse()
    114     html=response.read().decode('gbk')
    115     conn.close()
    116     expression1='border">(.*).</td>'
    117     expression2='><a href="http://mp3.baidu.com/m(.*)</a>'
    118     expression3='href="http://mp3.baidu.com/m(.*)</td>'
    119     listSentence1 = re.findall(expression1, html)   #编号特征 
    120     listSentence2 = re.findall(expression2, html)   #歌曲名特征 
    121     listSentence3 = re.findall(expression3, html)   #歌手名特征 
    122     lineno=0
    123     while lineno<len(listSentence1):
    124        listSentence2[lineno]=listSentence2[lineno].replace('m=-1','m=' + m) #指定格式 
    125        url=re.search('(.*)target',listSentence2[lineno])
    126        url='/m'+url.group(0)[:-8]
    127        idno=listSentence1[lineno]
    128        name=re.search('blank>(.*)',listSentence2[lineno])
    129        name=name.group(0)[6:]
    130        dirty=re.search('</A>/<A  href=(.*) target=_blank>',listSentence3[lineno])
    131        if dirty is not None :             #合唱 
    132       author1=re.search('>(.*)</A>/<A',listSentence3[lineno])
    133       author1=author1.group(0)[1:-7]
    134       author2=re.search('/<A  href=(.*)</A>',listSentence3[lineno])
    135       author2=re.search('>(.*)<',author2.group(0))
    136       author2=author2.group(0)[1:-1]
    137       author=author1 + '+' + author2
    138        elif dirty is None :               #独唱 
    139            author=re.search('blank>(.*)</',listSentence3[lineno])
    140            author=author.group(0)[6:-2]
    141        print u"开始下载",idno,name,author
    142        filelist=os.listdir('.');
    143        if downmp3(url,author,name,filelist)==0:  #判断失败 
    144           print u"下载",author,name,u'失败!'
    145        lineno+=1
    146 
    转自:http://forum.ubuntu.org.cn/viewtopic.php?t=15682
  • python实例练手002

    jqwhwf 发布于 2010-04-29 20:06:26

    接着上篇继续
    邮件发送篇
    前言:另外再查看帮助文档时,发现一个emali.mime.text模块可以用来方便的处理邮件正文;先拿公司邮箱smpt服务器测试了一下,结果发现每次都报错,故换成163的smtp

    import smtplib  导入smtplib
    from email.mime.text import MIMEText

    global addresses
    addresses = ('xxxx@163.com','xxxx@163.com') 定义了邮件接收人列表

    def SendEmail(toaddrs)
        COMMASPACE = ', '     后来在测试时发现发送给多人时报错,重新看帮助文档,才加入这个,用于规范接收人列表
        fromaddr = 'xxxx@163.com'   发送人的邮箱
        
        fq = open('email.txt','rb')   email.txt为本地autoit脚本处理之后生成的待发送文本(存为utf-8)
                                      否则接收到的邮件中的中文字符就变乱码了
        msg = MIMEText(fq.read())    初始化MIMEText并导入邮件正文
        fq.close()

        msg['From'] = fromaddr              发件人邮箱
        msg['To'] = COMMASPACE.join(toaddrs)     使用join方法格式了收件人列表(发送给多人时必须)
        msg['Subject'] = '[AUtoReport]'      邮件标题

        server = smtplib.SMTP()
        server.connect('smtp.163.com','25')     连接163的smtp服务器和端口
        server.login('163邮箱帐号','密码')
        server.sendmail(fromaddr,toaddrs,msg.as_string())   发送邮件
        server.quit()
  • python实例练手001

    jqwhwf 发布于 2010-04-29 19:50:55

    学python有一段时间了,该考虑拿工作中一些解决问题的需求来练练手了
    工作需求:对某论坛(未提供rss)的页面的新贴进行关注,定时以邮件的方式发出来

    于是开始考虑:
    要实现必然会用到python的urllib smtplib 
    然后希望加入命令行来控制,所以需要用到optparse

    首先从抓取网页开始
    01 import smtplib
    02 global url
    03 url = r"http://bbs.xxxxxx.html" 要抓取的网页的url
    04 
    05 def AnalyseHtml(url):
    06     sockUrl = urllib.urlopen(url)
    07     htmlSoucrc = sockUrl.read()
    08     sockUrl.close()
    09     f.file('test.html','w')
    10     f.write(htmlSource)
    11     f.close()

    简单看了下python的正则模块,发现不太理解,故选择了把抓取到的页面保存到本地,然后再用自己比较熟悉的autoit脚本来完成对html页面的分析,而python则只负责了抓取网页和发送邮件


  • (转)有一种女人,嫁给谁都幸福

    wsophie 发布于 2013-09-24 14:58:42

     有一种女人,不管她嫁的是建筑工人还是国会议员,她都有能力让自己过得幸福

    有一种女人嫁给谁都幸福  我见到明依是在好友的聚会上,一个35岁的女人,中等姿色,学历也不高,却嫁了个气宇轩昂的好老公,他据说是硕士,后来做家具生意发了家,结婚10年,有一个粉雕玉镯的小女儿,好友说完后半妒半羡地感叹,嫁到这么好的男人,明依真幸福,我笑着不说话,想来她的故事不会这么简单。

      幸福能力一:会做菜,会煲汤,会踏实过日子

      明依嫁给老公的时候,他还是大学里年轻的讲师,站在讲台上激情飞扬地大谈犬儒主义和叔本华,台下的女生们多数是冲着英俊老师来的,明依全身心的投入和迷恋这份感情,那时候她当然不会去考虑台上气质非凡的男人名下只有一间20平米的筒子楼宿舍。

      婚后的现状虽然不尽如人意,但如胶似漆的爱情可以弥补一切。小两口一起在公共用水间洗衣服,一人一头拧床单;在烟熏火燎的楼道里做饭,饭后老公陪着她边洗碗边聊天;周末手拉手去看场电影或是回婆家吃顿饭。明依觉得小日子虽然清贫,但一样觉得幸福甜蜜,她把眼光从简陋的家,朴素的衣裳,自己光秃秃的脖子手指上移开,每月精打细算的捂着手中不多的钱把日子过好,明依做得一手好菜,老公最爱喝她熬的汤,排骨炖莲藕,鲫鱼萝卜丝,芋头娃娃菜……每次喝的肚儿圆圆才放下碗。看到老公简单满足微笑,明依觉得,这就是幸福。

      大学的谈资论辈终于令老公厌烦了。明依看出了他的心思,鼓励他去经商创业,那一阵,家里家外的事情全靠明依一手操持,老公在外面联系洽谈,四处求人,有时候碰壁受气,回家难免冲着老婆发泄。日子比刚结婚那阵更苦,心理压力也大,明依背地里也哭过,当面也和老公吵过,但每当一早醒来看见老公的头颅孩子一般依恋在自己的肩头,心里便像温水里融化的蜜,暖暖的,甜甜的。

      她比以往更加用心操持家务,把500元租来的小房间布置得整洁温馨;老公夜归的时候她总在灯下等着,接下沉重的公文包,递上一杯热茶;临睡前两口子坐在床头聊聊烦心的事情,共同商量解决问题的办法。

      幸福能力二:对婚姻别期望太高,少抱怨,少纠结于小事

      怀上孩子的时候,老公的事业刚起步,天天周旋于客户和朋友间,请客吃饭,陪酒,陪玩,每晚不到深更半夜回不了家。明依非常难过,面前的男人虽然还是熟悉的面孔,却好像完全换了一个灵魂。他没时间对着大肚子的老婆嘘寒问暖,没精力回应老婆的温存关切,在生活的残酷考验下,他还原了男人爱事业不爱美人的本质,简直就是一个工作狂。明依觉得自己的温柔克己完全白费了,眼前的男人已经不是当初自己深爱的那一个,再勉强下去还有什么意义?

      定居美国的大姐回来看她,明依哭着告诉她:老公给不了我想要的幸福,我想离婚。大姐缄默,第二天给她带来一本美国专栏女作家的畅销小集子,里面有一句话让明依有所触动:有一种女人,不管她嫁的是建筑工人还是国会议员,她都有能力让自己过得幸福。没错,女人的幸福,为什么要靠男人给呢?每个女人,都应该有让自己,让家庭幸福的能力。

      大着肚子的明依向父母求援,请妈妈过来帮忙买菜做饭,照顾这个自己无力兼顾的小家。她强迫自己不去想烦心的事情,每天吃好睡好,安心养胎;她不再等老公夜归,不再像以前那样每天缠着他问长问短,不再拿鸡毛蒜皮的小事去烦他;在他偶尔有空的时间里让他搀着自己散步,彼此取笑着对方为孩子取名字。也怪了,一天天平静安稳地过去,原本觉得天昏暗地的生活,渐渐变得阳光灿烂起来。

      女儿快3岁了,他们搬了新家。钱都花在房款上了,明依雇了个油漆匠把墙一刷,购置了简单的家具,就这样凑合着先搬进去了。老公每天回家都能看到一点点新的变化:客厅里别致的灯罩是用硬纸壳蒙上米色暗红碎花图案的棉布做的;自己到海南出差带回来的椰子,吃剩的硬壳被巧妙改造成了造型可爱的小猪扑满;卷筒纸用完了,明依给简芯细致地裹上了一层米白色亚麻细布,教女儿用蜡笔涂鸦,画出五彩的虹,绿的树,蓝色的河流,金色的太阳公公,这样一个DIY小笔筒摆在书桌上,做爸爸的每次看到心里都暖洋洋的。一个原本平凡的空间在明依手里渐渐改头换面,一天比一天丰富,一天比一天有情趣。

      幸福能力三:培养自己的兴趣爱好,照顾好自己在前,不冷落家庭在后

      汤妮的出现差点儿击碎了明依的幸福梦想。她是老公生意上的重要合伙人之一,年轻,家境富裕,有生意头脑和管理能力,带着一种咄咄逼人的美和气势。汤妮明显地向老公老公表示好感,根本不在乎他的已婚身份,男人到了这种地步,不免有些心猿意马,暧昧不明。很多人都来向明依告密,有的是打抱不平,有的纯粹为了看热闹。

      明依却还是和以前一样,看自己的书,种自己的花花草草,照顾刚上小学的女儿。

      在老公回家的时候,给他送上舒服的拖鞋;在他起床洗漱的时候,提前给他挤好牙膏。她对烹调的兴趣越发浓厚,时不时来些新奇的花样。比如把香蕉切成小块,浇上酸奶,然后裹上全麦饼干屑;去凤凰旅游的时候学会了用蒜叶和新鲜芫菜加干辣椒炝炒;跟婆婆学会了做四川泡菜。

      种种小创意让在外面吃惯了大鱼大肉的老公回到家来就会忍不住多添一碗饭,赞一句,还是家里的菜好吃。明依把周末的时间精心策划起来,老公有空的时候,带上孩子,开车到附近的农家乐,踏青,看红叶,老公没空陪她,她就自己带着女儿去儿童乐园,或是看最新上映的动画大片。每次娘俩儿都开心的手牵手回家,女儿欢声笑语,明依红光满面。

      老公终日担心,如果明依提出那个难堪的问题,他不知道该如何回答。但明依开开心心地过自己的日子,从来不多问一句。当然明依也有变化:她恢复了几分婚前活泼可爱的样子,穿衣打扮越发精致;她参加了瑜伽课,学打网球;她组织姐妹旅行团去尼泊尔,回来容光焕发,给女儿带回一条手工绣花的小裙子,送老公一个乌木镶银的烟灰缸;她甚至开始学习英文,居然可以磕磕巴巴地和美国网友聊天!这个跟了自己10年的女人身上原来还有那么多自己不了解的特质和能量,这一切都让他感觉既陌生又熟悉,并深深为之吸引。

      汤妮的事情居然就这么慢慢地淡了,没了,女友去看明依,崇拜无比地追问她处理方式。明依笑说,见怪不怪,其怪自败。以前我老觉得嫁个好老公就能幸福,现在看起来,女人的幸福不是靠男人给的。女人要有让自己幸福的能力。热爱生活,照顾好家庭,不冷落自己,这才是女人真正的幸福。

      这话有道理,一个家庭幸不幸福,80%以上取决于女主人。有能力让自己幸福,有能力给男人幸福,才是聪明的好女人。

  • 读书笔记5----TCP协议如何建立和断开连接

    zhangcaiyun_86 发布于 2013-05-30 15:12:01

    1.简述TCP协议连接建立时3次握手的过程。
        在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接,如图1所示。
        第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 


        第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 


        第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 


        完成三次握手,客户端与服务器开始传送数据。

                            图1 TCP三次握手建立连接

    2.断开连接

        由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

    (1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送(报文段4)。

    (2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。

    (3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A(报文段6)。

    (4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。

    TCP采用四次挥手关闭连接如图2所示。

                                   图2  TCP四次挥手关闭连接

    思考:为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

       因为TCP有个半关闭状态,假设A.B要释放连接,那么A发送一个释放连接报文给B,B收到后发送确认,这个时候A不发数据,但是B如果发数据A还是要接受,这叫半关闭。然后B还要发给A连接释放报文,然后A发确认,所以是四次。
  • 读书笔记5(续)----IP数据包结构

    zhangcaiyun_86 发布于 2013-05-30 16:16:26

    1.IP数据包结构

    如图,一个刻度表示1个二进制位(比特)。

    1-1.版本4位,表示版本号,目前最广泛的是4=B1000,即常说的IPv4;相信IPv6以后会广泛应用,它能给世界上每个纽扣都分配一个IP地址。

    1-2.头长4位,数据包头部长度。它表示数据包头部包括多少个32位长整型,也就是多少个4字节的数据。无选项则为5(红色部分)。

    1-3.服务类型,包括8个二进制位,每个位的意义如下:

           过程字段:3位,设置了数据包的重要性,取值越大数据越重要,取值范围为:0(正常)~ 7(网络控制)

           延迟字段:1位,取值:0(正常)、1(期特低的延迟)

           流量字段:1位,取值:0(正常)、1(期特高的流量)

           可靠性字段:1位,取值:0(正常)、1(期特高的可靠性)

           成本字段:1位,取值:0(正常)、1(期特最小成本)

           保留字段:1位 ,未使用

    1-4.包裹总长16位,当前数据包的总长度,单位是字节。当然最大只能是65535,及64KB。

    2-1.重组标识16位,发送主机赋予的标识,以便接收方进行分片重组。

    2-2.标志3位,他们各自的意义如下:

           保留段位(2):1位,未使用

           不分段位(1):1位,取值:0(允许数据报分段)、1(数据报不能分段)

           更多段位(0):1位,取值:0(数据包后面没有包,该包为最后的包)、1(数据包后面有更多的包)

    2-3.段偏移量13位,与更多段位组合,帮助接收方组合分段的报文,以字节为单位。

    3-1.生存时间8位,经常ping命令看到的TTL(Time To Live)就是这个,每经过一个路由器,该值就减一,到零丢弃。

    3-2.协议代码8位,表明使用该包裹的上层协议,如TCP=6,ICMP=1,UDP=17等。

    3-3.头检验和16位,是IPv4数据包头部的校验和。

    4-1.源始地址,32位4字节,我们常看到的IP是将每个字节用点(.)分开,如此而已。

    5-1.目的地址,32位,同上。

    6-1.可选选项,主要是给一些特殊的情况使用,往往安全路由会当作攻击而过滤掉,普联(TP_LINK)的TL-ER5110路由就能这么做。

    7-1.用户数据。

    2.TCP数据包结构

    1-1.源始端口16位,范围当然是0-65535啦。

    1-2.目的端口,同上。

    2-1.数据序号32位,TCP为发送的每个字节都编一个号码,这里存储当前数据包数据第一个字节的序号。

    3-1.确认序号32位,为了安全,TCP告诉接受者希望他下次接到数据包的第一个字节的序号。

    4-1.偏移4位,类似IP,表明数据包头有多少个32位。

    4-2.保留6位,未使用,应置零。

    4-3.紧急比特URG—当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。

    4-3.确认比特ACK—只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。参考TCP三次握手

    4-4.复位比特RST(Reset) —当RST=1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。参考TCP三次握手

    4-5.同步比特SYN—同步比特SYN置为1,就表示这是一个连接请求或连接接受报文。参考TCP三次握手

    4-6.终止比特FIN(FINal)—用来释放一个连接。当FIN=1时,表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。

    4-7.窗口字段16位,窗口字段用来控制对方发送的数据量,单位为字节。TCP连接的一端根据设置的缓存空间大小确定自己的接收窗口大小,然后通知对方以确定对方的发送窗口的上限。

    5-1.包校验和16位,包括首部数据这两部分。在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。

    5-2.紧急指针16位,紧急指针指出在本报文段中的紧急数据的最后一个字节的序号。

    6-1.可选选项24位,类似IP,是可选选项。

    6-2.填充8位,使选项凑足32位。

    7-1.用户数据……

    作者:虎胆游侠

    出处:http://blog.csdn.net/prsniper/article/details/6762145。转载请注明出处,谢谢。

  • [跳槽]卧槽比跳槽更适合的三类人

    zhangcaiyun_86 发布于 2013-07-09 13:48:49

        我为现在的公司服役已经七年了,话说七年之痒,再加上物价涨得快,没有跳槽的心是不可能的。而且周围人的论调都是:“不跳不精彩”,“工作经验和薪水在跳槽中成长”,“工作着,跳槽着”。但出于从众心理的跳槽我觉得很没意义。

        我很喜欢斯柯达明锐的广告词:“实力是一种节奏,不急、不慢、不争先恐后。实力是一种态度,不张扬、不做作、不虚张声势。”在我看来,卧槽也是一种低调的实力,也是一种忠于自我的态度。

        关于卧槽和跳槽哪个更适合发展,更容易晋升,我觉得这是个伪命题,关键点在于人,有些人很适合跳槽,越跳越高;而有些人适合卧槽,越卧越宽。如果你是以下这三类人,也许卧槽比跳槽更适合你:

    第一类卧槽族:起点低能力强决心大

        职场上不乏这些意志坚定、一步一步走上金字塔顶端的人物——十几年如一日,在同一家公司,从前台、秘书、助理爬上天的。这类卧槽族通常学历不高起点低,但能力强雄心勃勃,清楚自己的职业目标和人生规划,很有上进心、企图心和竞争性。

        除了勤奋努力外,这类卧槽族通常会保持良好的人脉关系,受到同事的认同和称赞,而且不像普通员工那样看到老板会发憷,他们善于抓住每一次和老板交谈的机会表现自己,看到内部晋升机会时勇于毛遂自荐。当然,他们也勇于承担责任。

        如果你是这类人,恰巧又在一家企业文化开明、制度流程都很规范的大公司,卧槽对于你来说,是一个好机会。

    第二类卧槽族:负责任但竞争意识淡泊

        “不想当将军的兵不是好兵”?错了。每个兵都想当将军,那这支队伍才要腥风血雨打破头呢!

        宣讲会,面试时,问十个新人十年后的理想,八个都说要做经理、总监甚至CEO,于是老板们深表赞同——我们需要aggressive的精神!然而当公司不可能给每个员工提供无限的向上空间,跳槽流失率严重时,老板们又感叹这些新人没有责任心。

        为什么我们看到“我要一辈子做个最棒的程序员”“我要做一个善于发现的编辑”“我要做一个很酷的理发师”就觉得他们没出息呢?事实证明,这些人是公司稳定蓬勃发展不必可少的基础。所以,一个竞争意识淡薄的员工,并不意味着就不是一个合格的员工。而要找一个具有高度责任感的员工,并不容易。

        “老兵”有“老兵”的自豪感和责任心。如果你是这类勤勤恳恳的兵,如果你在一家类似AC米兰文化的企业,卧槽的终点也许是一片蓝天。

    第三类卧槽族:永远不会对工作产生感情

        我们不能不强制人们非要热爱工作,我们不能不允许人们对工作冷淡。在工作中找不到目标、理想或者自我,是无法产生持久的热情的。

        而永远不会对工作产生感情的人分为两类:认为工作只是为了赚钱,为了今后更好地生活的人,跳槽比卧槽更合适——哪里钱多去哪里;而有“间歇性严职”甚至“永久性厌职”,讨厌的是工作本身的人,恐怕任何公司任何企业文化,都很难治愈你的病,因为天下没有“事少钱多离家近”的工作,如果你现在的工作环境还不错,同事关系也融洽,薪水也够过上滋润的生活——那么,就好好卧着,别朝三暮四了,按时保质完成工作吧!只是不要让老板和同事看出你的冷淡来。(完)

    作者:前程无忧

    出处:http://arts.51job.com/arts/05/402707.html转载请注明出处,谢谢!

  • 测试执行负责人经历之经验总结二

    没翅膀的飞鱼 发布于 2013-07-07 11:06:57

    今年写独立于项目总结的文章较少,一来是今年的项目确实多而且复杂,作为测试负责人承担的责任也更多,思考项目具体问题时间较多;二来多数的主题思考都在项目总结中写过(想想,今年写的项目总结文章也有二十来篇吧,由于涉及到具体项目就没有分享出来);之前跟一个前辈交流,前辈提到好的思想都是独立于具体项目,不依赖与具体项目;好吧,我表示自己的思想还不够层次,趁休假看病时间再依据过去一年作为测试负责人,聊聊测试执行负责人相关的经历经验,去年写过“测试执行负责人经历之经验总结一”: http://www.51testing.com/?uid-363907-action-viewspace-itemid-827317

    今年再来谈谈,一来总结,二来了却总结一中自己说过的话,欢迎交流探讨。

    今年换组,新的老大给予测试负责人的职责更多,相应的,测试负责人施展自己想法的机会也更多。这里简单从以下几个方面说说:

    1.遇事不乱,没做过摸索去做

    可以先看看这篇文章:http://www.51testing.com/?uid-363907-action-viewspace-itemid-848643,我很赞同作者的观点,不管遇到什么项目,老大把项目抛给自己,那就积极去接,不要担心能力不足什么的,人都是在实际中去总结积累经验的,昨天看《开讲啦》,很同意文章的观点:趁年轻,要敢去做,做错了,至少能证明我当初的决策是错的(当然这个看具体公司具体情况)。作为测试负责人更应该如此,如果遇到问题自己都有点怵,组员更没有信心把项目测试好。前阶段也遇到一些困惑,发现项目越来越大,有点把持不住力不从心的感觉,就找一些前辈聊天交流,也看一些文章和书籍,学学项目管理、测试管理,把自己的疑问抛出来,试着去找解决的方法,告诉自己凡事都会有解决的方法,不管方法是不是最好,但是可以先做再去优化。

    2. 测试方案

    测试方案的重要性之前并没有深刻体会到,因为一直感觉公司的方案都是走流程走形式,具体系统测试前会临时安排,测试方案的重要性没有凸显出来。但是最近接的一个项目改变了我之前的看法,这个项目是跨平台合作进行,整体测试方案中要注明需要的测试资源、测试工具、准入准出原则、各平台的职责等等,各组都按照这个方案来,项目总体来说可控性就比较强一些。之前都是单组作战,其灵活性可以弥补测试方案的不足,但是当项目涉及到多个组来完成时就要考虑有个文档来统一一下步伐(当然这只是测试方案作用的一个方面)。

    3. 测试改进优化

    这块是今年做的比较多的一个方面,负责的项目逐渐针对每日反馈、测试度量、测试时间甘特图、缺陷分析、更新说明讨论会等展开优化,也与开发人员进行了一些必要的约定;自己也一直在反思项目中存在的一些问题,然后把问题抛出来,组织大家一起讨论交流,寻找解决及优化的方法。测试改进是个持续的活动,想要高效率高质量,就得多发现测试过程中的问题,多思考优化途径。现在困扰我的有以下几个问题,使用的方法一直感觉效率不高(把问题抛出来,有兴趣的大家可以交流下):

    1> 回归测试用例如何更有效的筛选?这个问题看起来很简单,一些书籍上也有很多介绍,但是具体实施起来还是有一定难度,首先你得保证开发人员的话可信(如哪些做了修改等等);再则看不到代码的情况下你得判断对哪些模块有影响(需要你和组员对业务都很熟悉);最后主要功能走还是不走?

    2> 时间不够,如何完善更改测试用例?

    3> 谁来修改测试用例更合适?

    4> 风险把控做的还不好,还在学习

    4. 沟通

    如其它文章一样,各方面的沟通一如既往的那么重要,这里就不多说了。

    5. 让组员舒服

    之前老大跟我说过,作为测试负责人就是为组员服务、让组员舒服,这个观点我一半赞同一半不赞同,有问题找负责人来协调沟通没错,但是如果负责人把什么都整舒服了对于新人来说心里上就会有依赖,人一旦有依赖就会变得懒,懒得去思考解决方法,懒得去优化测试过程等等(当然这个也不一定),这个度要适当把握下,有些问题需要组员自己去解决,不要什么都管。

    6. 业务及测试技术

    对于业务你应该比组员更熟悉,这里可能涉及到管和技的讨论,但在中国这个大环境下:做技术管理你就得有技术了解业务,不要跟我瞎扯淡,那真的没用(有点极端,但是这是事实)。虽然不一定要了解每一个业务细节,但是在整体上必须要熟悉,闲暇之余多了解下业务知识,多学习下测试技术,也会让你这个测试负责人做的更有说服力。

    7. 整体把控

    遇到突发问题如何解决、测试策略如何选择、资源如何实时调节、如何调动测试灵活性,对一个测试项目的整体把控的前提是你要了解这个项目的情况:项目测试内容、项目目前表现的质量情况(如何让产品质量更透明,如何测试度量)、组员能力等等,这些方面需要多花点时间去观察去思考,自己也在学习ing

    8. 身先士卒

    碰到事情不要推诿,制定某个规范或者约束时自己先带头去做,我本人就比较讨厌一些管理者,自己制定的规范自己不去遵守,还整天嚷嚷这规范那该怎么做。说服别人做好的办法就是我先做好,你跟着做。

    现在感觉有些想法还需要去验证还不太成熟,就先写这么多吧,越来越不敢写文章了,总感觉写的有点肤浅,哎。

    --------没翅膀的飞鱼

  • 在项目管理思维方式上的一点感受【转】

    没翅膀的飞鱼 发布于 2013-07-04 08:09:02

    ==========================================================================================
    原来当公司给我提职机会的时候,我总是有一种恐惧感,感觉不知道后面能不能做好。老是说,自己心里没有做好这方面的准备。怕一旦出问题就完蛋了。另一方面,可能给我从小受的教育有关,不喜欢出头露脸,所以,当上面说,让我做team lead的时候,我竟然想要让贤,把机会给别人。哇赛,好像有一种当年孔融让梨的感觉。不过,后来想想约阂策盗耍『罄吹盤M的时候,我也有类似的举动,哎~真的傻得可以!不过后来,还是变了,直到作了PM之后,这些观点才慢慢的得到彻底改变。这也可以说明,很多所谓的什么本性是可以改变的。

    不知道和我一样有这种类似想法的人多不多,如果有的话,可以一起分析一下这个想法吧:

    第一,没有一个人在做这种事情的时候是能够准备好的。没有当作PM,你就不可能准备好做PM所需要的能力。一个职位,进门 就是一个门槛。能跨过这个门槛就行了。所以,当时没有准备好的感觉是没错的,因为没有一个人能准备好,除非他当过PM。但是没准备好并不代表你不能当。也不代表后面没有时间准备。事实证明,我后面做的也不错,真正的学习,必须经历真正的工作过程,解决那些冲突才是提升经验值最快的途径。

    第二,说得远一点,如果说做PM,或者说进入管理层,有个门槛的话,那这个门槛又是什么呢?就我这2年的经验感觉,这个门槛就是你的素质,你的思维方式,不是你的技术!当然技术要过一个及格线。可以插一句话,其实技术在任何公司,都不是最重要的。一个领导,管理人员,最重要的是思维的前瞻性,前瞻性的思维对项目的影响太大啦!一次一个问我说他的项目为什么会失败,我说,做项目,就像是开极品飞车,如果你没有看到前面有个急弯,你现在还在拼命加速,到转弯的地方,不撞死才是奇迹呢!

    做项目,就像开F1,就像是做运动,一定要有节奏感,可是这种节奏感,如何获得呢?如果知道自己是否在这个节奏之上呢?很简单的一个方法就可以判断自己是否在这个节奏之上。

    我们每天做的事情可以简单的分成三类:第一,处理以前的事情,就是在以前的工作中没有处理好的事情,现在有个不好的结果产生了,那你今天需要处理这个结果。比如昨天晚饭吃得太多,今天拉肚子,你要处理吧。第二,处理今天产生的事情,第三,处理以后可能发生的事情,为以后做个准备。比如下周要出国旅游,你要准备好各种东西吧。防止以后需要了但是没有带。如果,你的项目让你非常繁忙,那你就需要看看你在忙什么事情了。如果全是处理以前问题遗留的不良后果,那就说明你有问题了。如果说,你每天都不很忙,或者仅仅在想以后怎么办,一个月之后的事情,你今天都在准备处理了,那恭喜,说明你的思维方式是对的,你的节奏是好的:)  作对的事情的人,不可能很忙的,所以,做管理层,不忙,是应该的,如果你一直很忙,才恰恰说明你有问题呢!
    ==========================================================================================


  • loadrunner之socket协议开发的测试脚本(二)

    whoisangle 发布于 2012-11-22 14:35:40

     

    今天,做一个socket的脚本,报文是和sniffer中截取的一模一样,服务器就是不认。气死我了。

    仔细研究发现好像在报文末尾有回车换行。

    于是,在socket发送报文末尾加上\n。ok完事大吉。这些细节的地方,有时候问研发也不一定知道。只好自己摸索了。

  • LR的socket协议

    luoriver 发布于 2013-05-29 14:37:09

    LRsocket协议

    [翻译]LoadRunnerWinsock协议(一)

     在开始讨论winsocket解决方案之前,我们先讨论一下各种协议是如何工作.从前面的简介可以了解到很多的高级协议,例如FTP,HTTP协议等. 以及所有基于window的应用(例如IE,WS-FTP)底层都是在Winsocket层上通信,因此任何高级协议的底层都是用Winsocket通 信。什么时候在LR中选择Winsocket协议呢?你要先了解LR是怎么样工作的:LR捕捉API请求然后再把它们回放。所以当你在创建LR WEB脚本的时候,VUGEN捕捉从IE出去的所有的HTTP请求。除此之外lr还支持其他很多协议,例如OracleODBC等。在选择不同协议录制 脚本的时候,LR是依靠hooks捕捉正确的API请求。所以既然大部分网络协议都是架构在winsocket协议之上的,那对于lr不支持的协议,我们 都可以在winsocket层上录制脚本。所以当找不到合适协议的时候,可以选择winsocket来录制。录制WinSock协议脚本!Lr录制新的虚 拟用户脚本,选择winsock协议在web虚拟用户脚本中录制的是URL信息,所以VUGEN启动流览器并运行就可以了,但选择Winsocket录制 的时候,可能会是各种形式的应用,并不简简单单就是浏览器,所以在开始的时候我们不需要指定应用的地址。下面的例子我们选择winsock来录制web应 用,正如上面说的我们开始要指定ie的地址。因为本来lr是支持http协议的,所以这个例子并无具体的意义,只是为了使例子简单。

    [翻译]LoadRunnerWinsock协议(二)

     winsock脚本典型代码?

    lrs_create_socket(”socket0″, “UDP”, “LocalHost=0″, “RemoteHost=doors:2084″, LrsLastArg);

    lrs_create_socket(”socket1″, “TCP”, “LocalHost=0″, “RemoteHost=www2.yahoo.com:80″, LrsLastArg);

    lrs_send(”socket0″, “buf0″, LrsLastArg);

    lrs_receive(”socket0″, “buf1″, LrsLastArg);

    lrs_send(”socket1″, “buf2″, LrsLastArg);

    lrs_send(”socket0″, “buf3″, LrsLastArg);

    lrs_receive(”socket0″, “buf4″, LrsLastArg);

    这是访问雅虎的一个应用,正如我们看到的,winsock先打开一个winsocket连接,然后收发包。我们发现录制的脚本中比web脚本(三个文件)多一个文件。

    第四个文件是data.ws,它里面记载了在action里面收发所有包的内容下面是一个data.ws的例子。

    send buf0

    “!”

    recv buf1 1

    “!”

    send buf2

    “GET / HTTP/1.1\r\n”

    “Accept: */*\r\n”

    “Accept-Language: en-us\r\n”

    “Accept-Encoding: gzip, deflate\r\n”

    “User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)\r\n”

    “Host: www.yahoo.com\r\n”

    “Connection: Keep-Alive\r\n”

    “Cookie: B=5oj83bst12l6m&b=2; Y=v=1&n=8lln5lmi3f8g1&l=6ef8c0d34b0/o&p=m2a2s”

    “qa4110004&r=3f&lg=us&intl=us; T=z=4TVE6A4ZqE6A9dIIpt30.NQNTYGNDE3NTYwM081&”

    “a=AAE&sk=DAAEwinHlDtEm/&d=c2wBTWpFQk16WXdNakUzTkRneQFhAUFBRQF6egE0VFZFNkFn”

    “V0E-; I=i1=010g1q1u24252e2i2k2p2r494a4g4m4q55565b5g6g6t6u7172737678797a7f7″

    “g7k7n7o888f8k8p8q989c9f9i9k9l9n9qacanapb0b3bdbfbhblbqbrbuc0c1c4cgcmcscteie”

    “jgr&ir=73\r\n”

    “\r\n”

    send buf3

    “!”

    recv buf4 1

    “!”

    recv buf5 2048

    “HTTP/1.0 200 OK\r\n”

    “Content-Length: 16030\r\n”

    “Content-Type: text/html\r\n”

    “\r\n”

    buf2 包含了发给www.yahoo.com的包,buf5包含了从server收到的回应。正如看到的winsock录制的脚本并不像web脚本那样具有可读 性,因为winsock是我们最后的选择。在buf序列号的后面是buf的字节数。例如5buffer后面的2048就是表示收到了2048个帧。

    注 意:在很多buffer里面你会发现仅仅包含了一个,这是一个网络常识,这个帧对于应用来说没有任何的作用,完全可以把这些桢清除掉,在 data.ws清除这个帧是效果的,需要到action里把这些桢注释掉。譬如例子中收到和发出的buffer可以用//注释掉。这样可以使脚本运行得更 快。下边的例子: buffers 0, 1, 3 4 可以注释掉:

    lrs_create_socket(”socket0″, “UDP”, “LocalHost=0″, “RemoteHost=doors:2084″, LrsLastArg);

    lrs_create_socket(”socket1″, “TCP”, “LocalHost=0″, “RemoteHost=www2.yahoo.com:80″, LrsLastArg);

    // lrs_send(”socket0″, “buf0″, LrsLastArg);

    // lrs_receive(”socket0″, “buf1″, LrsLastArg);

    lrs_send(”socket1″, “buf2″, LrsLastArg);

    // lrs_send(”socket0″, “buf3″, LrsLastArg);

    // lrs_receive(”socket0″, “buf4″, LrsLastArg);

    lrs_receive(”socket1″, “buf5″, LrsLastArg);

    lrs_send(”socket0″, “buf6″, LrsLastArg);

    [翻译]LoadRunnerWinsock协议(三)

     创建脚本步骤:

    1. VuGen录制脚本

    2.增强脚本

    3.参数化

    4.关联脚本

    5.设置运行参数

    6.运行脚本

    1. VuGen录制脚本

    按照之前章节说的步骤创建脚本,录下来的就是基本脚本,可以先把buffer注释掉。

    练习:

    创 建一个简单的winsock脚本,可以选择MI公司的网站,把录下来的脚本命名为winsocket_1,再用Http协议方式创建一个Web脚本,把脚 本保存为WebWinsock_1.请不要更改session_id把两种脚本比较,当你登陆的时候,可以收到一个“welcomejojo….”的消 息。既然所有的消息都放在data.ws文件里,那么data.ws里面应该能找到这条消息。

    1.1) 在几号bufffer里面包含“welcomejojo”?怎样判断这是收到的帧而不是发出的帧?还有着个字符串正如显示的那样或者他是html的一个标签。

    仔 细查看脚本,在data.ws文件中寻找MSO=SIDxxxxxxxxxXXXXXX9位数的号码 ,他表示自从January 1 st,1970以来流逝的所有的秒时间,cookiesession_id都是根据时间来生成的,所以脚本里面的9位数也就直接和脚本运行时间挂钩,所 以我们要把这个数改成我们每次运行脚本的确切时间,首先把这个值更换成参数,在c里面有一个Time()的函数。他返回的就是自从January 1 st,1970以来流逝的所有的秒时间,在脚本的开始用这个函数获取时间值,然后把刚才创建的参数指向这个值。然后在data.ws里面替换所有的id, 这样每次脚本运行都能获得正确的id

    1.2)把修改了参数的脚本运行一遍,在脚本的运行日志里面寻找”incorrectly”。会找到”You’ve reached this page incorrectly”这条消息,运行web脚本也会发现类似的消息。其中发生了什么呢?

    注 意:在data.ws文件中收到的buffer内容在每次运行时不会改变,录制脚本时data.ws文件被创建并且回放过程中也不会改变?所以lr录制的 脚本种buffer不是很重要,LR用发送包的数据发出请求,然后对比发送请求的数据包和脚本里面包存的数据,这里lr只判断数据包大小,而不是具体内 容。如果收到的数据包包括“rob”,而server响应是“bob”lr也会认为脚本运行成功。但如果server回复的是robot”,这样lr就 会因为收到包的大小不对而认为脚本执行失败。另一种情况时lr期望收到500bytes大小的包,但是前10秒只收到了100bytes,这时r会认为超 时判断脚本运行失败,可以通过lrs_set_recv_timeout 函数来设定超时时间。

    那么反面一种情况是,你不想接受所有的数据包,只是想收到包的前100bytes,可以通过函数ltr_receive_ex 来任意设定想要收到的字节。

    2.增强脚本

    在脚本中添加事务,集合点和控制语句等增强脚本,和web脚本不同的是winsock脚本可读性很差,所以要在录制脚本时添加注释,事务和集合点等。如果在脚本中有逻辑需求,那么插入逻辑语句 (通用声明不适应Winsock_1脚本).

    3.脚本参数化

    把脚本中变化的值参数化,只要用参数把这些值替换掉就可以,使用不同参数重复业务流程,例如在上面的例子里面jojo/bean就可以参数化成为userIDs/passwords

    4.关联脚本

    关 联目的是为了让你在一个并发中用到一个商业流程的结果,在web脚本中有这样的过程,从web脚本中sessionid关系到后面的流程能不能运 行,winsock脚本有同样的问题。所以需要捕获到session id然后把它关联起来,举个例子从下面的脚本中获取PIDlr函数的例子):

    “\r”

    “\x0 blah blah blah “

    “\r\n blah blah blah “

    “PID TT STAT TIME COMMAND\r\n PID 28469 q2″

    ” S 0:01 -tcsh (tcsh)\r\n”

    在一个典型的web脚本中,你用web_create_html_param函数,用“PID“ “q2”定义边界扑获数据。

    Winsock脚本中,用lrs_save_param函数从静态数据或收到的数据包中截获数据,看下面的例子:

    lrs_receive(”socket2″, “buf47″, LrsLastArg);

    lrs_save_param(”socket2″, NULL, “param1″, 67, 5);

    web_create_html_param函数不同的是lrs_save_param在请求之后进行,这个例子中,第一行代码是接收到47号包。lrs_save_param函数的参数意义如下:

    socket2: socket2中扑获数据

    NULL: null参数意思是从最后一个buffer里截取,在这儿就是指buf47,如果你从其它的buf里面来获取数据,则你必须要指明buf的号码了

    param1:命名的参数值

    67:位移(下面截解释)

    5:捕获的长度

    位移:从buffer的开始多少位去捕获参数的值,在下面的例子里面,PID是从buf47开始往后67bytes来截取的,我们怎么确定这个值?

    data.ws中选取需要截取参数的地方然后按F7键,这样会弹出一个窗体。如下图:

    在左边的列,你将看到符合这部分数据的偏移量,中间四行是用EBCDIC加密的数据包。最右边,是没有经过加密的数据。所以你应该看第五行包含PID的真实的数据,,很容易就可以根据64+3得出位偏移为67

    (现在我们解释一下问什么添加这些多余的东西到数据包中,让它适合我的例子呢?)

    注意:在socket脚本中没有提供web_find函数。只有通过编程来找到你要截取的脚本。

    5run-time的设置

    配置Run-Time可以控制脚本运行过程中的虚拟用户行为,包括looplogTime信息等设置

    6VuGen运行脚本.

    保存并用VuGen运行脚本验证脚本是否正确

    搞定WinSock!

     

  • 工作中的沟通问题

    chenyuting89 发布于 2013-05-22 23:11:53

        测试不单单是件技术活,而是一门综合艺术,其中就包括沟通的艺术。沟通贯穿于整个项目开发的过程。


        从一开始,测试就要关注需求。往往在讨论设计时,开发和需求很容易忽略了测试成员,他们潜意识里觉得这不关测试什么事。可是,测试也要熟悉业务,熟悉功能,熟悉各种设计,而且测试需要站在用户的角度来去考量他们的设计是否有不合理的地方,并提出自己的建议。这些工作,测试成员需要主动,积极参加,多提建设性意见,这样可能会让开发慢慢发现测试成员的重要性。


        其次,沟通最频繁应该还是关于bug的讨论。下面列出几个遇到的沟通问题,及我的解决办法。

      

        1.“这个bug我这边重现不了啊~~~

    解决办法:这种问题首先要自省,bug描述里面是否没有说清楚。Bug应该简明扼要,重点突出。如果描述存在歧义,一定要总结并尽快改进。有时会遇到概率性的bug,要告诉开发概率是多少,尽可能多的提供重现的条件。


        2.“这个不是代码问题,需求这么定义的”

    解决办法:需求也是人定的,如果觉得有异议,可以找需求人员询问清楚,为什么这样定义,把自己的想法告诉他们,看他们怎么决定。如果被需求说服了当然是最好的,如果自己还是不同意需求的看法,需求又不同意我的提议,那只能听他的,毕竟权力在他那里。但是我们可以保留交流的记录,证明曾经在这里发生过歧义。


        3.“这块是别人负责的,我负责的部分没有问题”

    解决办法:如果bug是由开发的项目经理来分发到程序员,那就是项目经理来面对这样的问题,而不是测试。当然,项目经理当然有项目经理的处理办法。可是,测试遇到这样的问题怎么办呢,把负责相关内容的开发都邀请到一个讨论组里,让他们自己讨论,这样更清楚,不必在测试这里中转。如果他们都觉得代码没问题,而我也有强有力的截图和真相,那就只有上交给上级领导,让他们来决定怎么解决。


        4.“有问题吗?”(也就是开发不认为这是个问题)

    解决办法:测试人员一定比开发要敏感,对bug的容忍度也要低一些。特别是一些不符合用户习惯的bug,开发总觉得无大碍。比如,一个列表默认的宽度太小了,导致初次打开,有一些内容被隐藏在后面,但是这个宽度可以手动调节。开发觉得问题很小,不影响功能,而且也有解决办法,所以不认为是bug。这个时候,就要发挥测试的本事了,嘴甜一点,说说好话,态度柔和一些。因为既然是小问题,解决起来一定不难,耐心地催开发的改过来就好。催一次不行催两次,记住态度一定要好。


        5.“用户不会像你这样操作的!”

    解决办法:用户怎么操作,谁都预料不到。我们不可能覆盖所有可能性,但是大多数用户会出现的操作,我们当然要测试。慢慢地把开发从代码的世界里带出来,带到用户的世界里,让他换个角度思考问题,毕竟软件开发不是为了实现功能,是要满足用户需求的。如果最后还是没能说服他,第一向上级反映,第二做好沟通的记录,将来备份在测试报告里。


        除了bug上的问题,还有测试安排上的问题,有时候小功能没有做好,或者某个文档、图片没有上传,等小功能做好了文档上传之后,很可能开发忘记告诉测试。所以,平时的工作中,一定要主动记录问题,主动沟通和督促,并反复确认,不要怕麻烦。


        总结起来,测试在工作上要主动询问,态度上不能轻易妥协,习惯上要善于记录细节,方法上软硬兼施。

  • 测试经验教训总结

    chenyue181 发布于 2013-04-25 11:07:42

    在论坛里找到一些有用的管理信息,记录下来作为参考!

    测试是为了提高软件的质量,测试的质量又如何保证和提高呢?

    制定合适的测试过程规范;
    制定合理的测试计划;
    设计合适的测试方案;
    编写的测试用例覆盖到所有的需求;
    对测试执行过程进行监控;
    使用工具管理测试发现的缺陷;
    对缺陷进行统计分析,指导过程改进。

    对测试过程规范,测试计划、测试方案、测试用例进行评审。


    XX项目测试经验和教训总结


    1.  测试进度及时跟踪、及时调整

       XX项目建立每日例会制度,测试组长每天早晨总结前一天工作进度;检查工作量统计表、问题单、测试过程跟踪表;测试组成员反馈问题;测试组组长根据进度状况、反馈的问题决定是否调整资源和进度安排。

    2.  做好资源的规划,降低风险

       XX项目由于资源的原因,主要是计算机硬件资源的缘故,两次设备故障,导致进度拖延。资源不充分,导致测试执行工作不能并行完成。资源是测试组将要面临的风险,在测试规划中必须考虑,并制定对策。

    3.  测试环境一定要与需求规格相符

       XX项目管理器的开发一直在WIN2000上开发,并且开发人员在向测试组发布之前做过充分的测试,但是测试环境严格依照规格,在WIN98环境测试,发现管理器安装运行出现严重问题。

    4.  测试版本要受控

       在测试过程中出现发现的错误导致后续测试无法进行的情况,需要问题更改错误之后再进行测试。由于要保证三套测试环境的一致和测试结果的有效性,测试版本的更新由测试组长控制,避免随意的更新。也不允许开发组更改测试机上的测试版本。

    5.  测试例的完备需要时间和经验的积累

       XX项目的测试例设计经过三次大的整改:第一次是解决测试例可执行性问题,细化测试例以及测试数据;第二次是在第一轮功能测试完毕,通过与开发组的集中讨论,增加了大量测试例;第三次是在第二轮功能测试完毕。

    6.  随时增加新的测试例

     在测试执行过程中,有时发现使用测试例之外的方法会发现一些问题,因此必须及时记录下这些方法,并补充到测试例文档中。XX项目使用测试过程文档进行记录和跟踪。

    7.  经常与开发组沟通促进测试的深入

       经常有组织的与开发组沟通讨论测试方案。

       测试小组要养成沟通和讨论的习惯。

    8.  测试执行过程中对问题要及时记录

       避免口头问题汇报,导致问题没有记录,而没有进行问题的回归测试。

    9.  养成记录和跟踪的习惯

       对任何需要记录的事项进行记录。XX项目对每次例会需要跟踪的事项进行记录;每次讨论进行记录;同行检视结果进行记录;并对问题的解决结果进行跟踪。

    10. 测试程序的编制也是开发活动

       测试程序也必须经过分析、设计、编码、测试的阶段才能用于测试。

       测试程序也必须有设计文档和使用说明

    11. 测试程序的编制不要从头开始

       测试程序往往可以通过修改开发代码生成,不必一切从头开始.

    12. 测试工作产品必须进行管理

       测试组的文档、各种记录、问题单、工作量统计表、测试程序、测试数据等必须进行良好的管理,并且测试组所有成员能够方便的访问到这些工作产品。XX项目主要按照版本、功用和时间来划分测试工作产品的存放结构。

    13. 测试环境准备需要占用大量的时间

       XX项目的工作量分布数据看,测试环境的准备与测试例执行时间在整个测试执行阶段是11的比例。这种比例与预期的时间要高。因此测试环境在测试规划中是必须要考虑的风险 。

    14. 版本发布延迟对测试组的影响

       XX项目向测试组发布版本的时间推迟了几天,为了保证后续的测试进度,测试组先使用了中间版本调试测试例、测试数据、脚本。版本发布延迟是测试组工作规划的风险之一,在规划中必须考虑并制定对策。

    15. 软件的可测试性对测试组的影响

          XX项目本身是一个产品框架,不是一个拿来就可以用的完整的产品,在实际交付用户使用时,还需要做很多客户化的工作,或称为二次开发,如配置交易脚本,开发实际对帐签到签退程序,开发系统函数库等,在测试的过程中,为了执行测试,需要做一部分客户化的工作,模拟一个实际环境;在模拟客户化的过程中出现错误,而测试中不知道是配置的问题还是软件本身的问题,会影响测试的结果。该问题可以通过开发者培训测试人员的方法部分解决。

          –XX项目服务器上的各个模块关联性强,依赖性强,独立性不好,比如,有的模块依赖于别的模块初始化一些环境参数(共享内存中),才能够启动,测试时,必须先测初始化模块,测试中不易定位问题。

       –XX项目有些模块虽然功能独立,但想通过手工模拟一些场景来单独测试非常困难,必须依赖别的模块来测试,比如P–CODE执行器模块,原计划单独测试,由于上述原因,最后将它放在交易处理模块中来测试,测试覆盖性无法保证。

       - XX项目的配置参数很多,相互间有很多依赖关联关系,而配置操作界面上是分别独立配置的,没有体现逻辑关系,容易产生不一致性,对配置人员要求高。

    16. 团队合作精神

     人力资源的重新分配,工作任务的重新划分

     测试环境资源的协调利用

     沟通与协作

     集体奋斗

     测试组长的核心作用

  • 软件测试中的网站测试技术要领(转载)

    hzhij 发布于 2013-03-29 16:02:57

    基于Web的系统测试与传统的软件测试既有相同之处,也有不同的地方,对软件测试提出了新的挑战。基于Web的系统测试不但需要检查和验证是否按照设计的要求运行,而且还要评价系统在不同用户的浏览器端的显示是否合适。重要的是,还要从最终用户的角度进行安全性和可用性测试。

      本文从功能、性能、可用性、客户端兼容性、安全性等方面讨论了基于Web的系统测试方法

      随着Internet和Intranet/Extranet的快速增长,Web已经对商业、工业、银行、财政、教育、政府和娱乐及我们的工作生活产生了深远的影响。许多传统的信息和数据库系统正在被移植到互联网上,电子商务迅速增长,早已超过了国界。范围广泛的、复杂的分布式应用正在Web环境中出现。Web的流行和无所不在,是因为它能提供支持所有类型内容连接的信息发布,容易为最终用户存取。

      Yogesh Deshpande和Steve Hansen在1998年就提出了Web工程的概念。Web工程作为一门新兴的学科,提倡使用一个过程和系统的方法来开发高质量的基于Web的系统。它"使用合理的、科学的工程和管理原则,用严密的和系统的方法来开发、发布和维护基于Web的系统"。目前,对于web工程的研究主要是在国外开展的,国内还刚刚起步。

      在基于Web的系统开发中,如果缺乏严格的过程,我们在开发、发布、实施和维护Web的过程中,可能就会碰到一些严重的问题,失败的可能性很大。而且,随着基于Web的系统变得越来越复杂,一个项目的失败将可能导致很多问题。当这种情况发生时,我们对Web和Internet的信心可能会无法挽救地动摇,从而引起Web危机。并且,Web危机可能会比软件开发人员所面对的软件危机更加严重、更加广泛。

      在Web工程过程中,基于Web系统的测试、确认和验收是一项重要而富有挑战性的工作。基于Web的系统测试与传统的软件测试不同,它不但需要检查和验证是否按照设计的要求运行,而且还要测试系统在不同用户的浏览器端的显示是否合适。重要的是,还要从最终用户的角度进行安全性和可用性测试。然而,Internet和Web媒体的不可预见性使测试基于Web的系统变得困难。因此,我们必须为测试和评估复杂的基于Web的系统研究新的方法和技术。

      一般软件的发布周期以月或以年计算,而Web应用的发布周期以天计算甚至以小时计算。Web测试人员必须处理更短的发布周期,测试人员和测试管理人员面临着从测试传统的C/S结构和框架环境到测试快速改变的Web应用系统的转变。

      网站测试流程、要求及测试报告

      一个网站基本完工后,需要通过下面三步测试才可以交活。

      一、 制作者测试,包括美工测试页面、程序员测试功能。在做完后第一时间内有制作者本人进行测试。

      a) 页面 包括首页、二级页面、三级页面的页面在各种常用分辨率下有无错位;图片上有没有错别字;各连接是否是死连接;各栏目图片与内容是否对应等

      b) 功能 达到客户要求;数据库连接正确;各个动态生成连接正确;传递参数格式、内容正确;试填测试内容没有报错;页面显示正确

      二、 全面测试 根据交工标准和客户要求,由专人进行全面测试

      也是包括页面和程序两方面,而且要结合起来测,保证填充足够的内容后不会导致页面变形。另外要检查是否有错别字,文字内容是否有常识错误。

      三、 发布测试 网站发布到主服务器之后的测试,主要是防止环境不同导致的错误

    软件缺陷的原则

    •   软件缺陷区别于软件bug,它是在测试过程中出现的对系统有影响的,但是在设计中没有的或者对修改后的bug测试和开发人员有不同意见等
    •   软件未达到产品说明书标明的功能。
    •   软件出现了产品说明书指明不会出现的错误。
    •   软件功能超出产品说明书指明范围。
    •   软件未达到产品说明书虽未指出但应达到的目标。
    •   软件测试员认为软件难以理解、不易使用、运行速度缓慢,或者最终用户认为不好。

      测试的主要方面:

      一、功能测试

      对于网站的测试而言,每一个独立的功能模块需要单独的测试用例的设计导出,主要依据为《需求规格说明书》及《详细设计说明书》,对于应用程序模块需要设计者提供基本路径测试法的测试用例。

      1、链接测试

      链接是Web应用系统的一个主要特征,它是在页面之间切换和指导用户去一些不知道地址的页面的主要手段。链接测试可分为三个方面:

      1)测试所有链接是否按指示的那样确实链接到了该链接的页面;

      2)测试所链接的页面是否存在;

      3)保证Web应用系统上没有孤立的页面,所谓孤立页面是指没有链接指向该页面,只有知道正确的URL地址才能访问。

      链接测试可以自动进行,现在已经有许多工具可以采用。链接测试必须在集成测试阶段完成,也就是说,在整个Web应用系统的所有页面开发完成之后进行链接测试。

      Xenu------主要测试链接的正确性的工具

      可惜的是对于动态生成的页面的测试会出现一些错误。

      2、表单测试

      当用户给Web应用系统管理员提交信息时,就需要使用表单操作,例如用户注册、登陆、信息提交等。在这种情况下,我们必须测试提交操作的完整性,以校验提交给服务器的信息的正确性。例如:用户填写的出生日期与职业是否恰当,填写的所属省份与所在城市是否匹配等。如果使用了默认值,还要检验默认值的正确性。如果表单只能接受指定的某些值,则也要进行测试。例如:只能接受某些字符,测试时可以跳过这些字符,看系统是否会报错。

      要测试这些程序,需要验证服务器能正确保存这些数据,而且后台运行的程序能正确解释和使用这些信息。

      B/S结构实现的功能可能主要的就在这里,提交数据,处理数据等如果有固定的操作流程可以考虑自动化测试工具的录制功能,编写可重复使用的脚本代码,可以在测试、回归测试时运行以便减轻测试人员工作量。

      我们对UM子系统中各个功能模块中的各项功能进行逐一的测试,主要测试方法为:边界值测试、等价类测试,以及异常类测试。测试中要保证每种类型都有2个以上的典型数值的输入,以确保测试输入的全面性。

      3、Cookies测试

      Cookies通常用来存储用户信息和用户在某应用系统的操作,当一个用户使用Cookies访问了某一个应用系统时,Web服务器将发送关于用户的信息,把该信息以Cookies的形式存储在客户端计算机上,这可用来创建动态和自定义页面或者存储登陆等信息。

      如果Web应用系统使用了Cookies,就必须检查Cookies是否能正常工作而且对这些信息已经加密。测试的内容可包括Cookies是否起作用,是否按预定的时间进行保存,刷新对Cookies有什么影响等。

      4、设计语言测试

      Web设计语言版本的差异可以引起客户端或服务器端严重的问题,例如使用哪种版本的HTML等。当在分布式环境中开发时,开发人员都不在一起,这个问题就显得尤为重要。除了HTML的版本问题外,不同的脚本语言,例如Java、Javascrīpt、 ActiveX、VBscrīpt或Perl等也要进行验证。

      5、数据库测试

      在Web应用技术中,数据库起着重要的作用,数据库为Web应用系统的管理、运行、查询和实现用户对数据存储的请求等提供空间。在Web应用中,最常用的数据库类型是关系型数据库,可以使用SQL对信息进行处理。

      在使用了数据库的Web应用系统中,一般情况下,可能发生两种错误,分别是数据一致性错误和输出错误。数据一致性错误主要是由于用户提交的表单信息不正确而造成的,而输出错误主要是由于网络速度或程序设计问题等引起的,针对这两种情况,可分别进行测试。

    二、性能测试

      网站的性能测试对于网站的运行而言异常重要,但是目前对于网站的性能测试做的不够,我们在进行系统设计时也没有一个很好的基准可以参考,因而建立网站的性能测试的一整套的测试方案将是至关重要的。

      网站的性能测试主要从三个方面进行:连接速度测试、负荷测试(Load)和压力测试(Stress),

      连接速度测试指的是打开网页的响应速度测试。负荷测试指的是进行一些边界数据的测试,压力测试更像是恶意测试,压力测试倾向应该是致使整个系统崩溃。

      1、连接速度测试

      用户连接到Web应用系统的速度根据上网方式的变化而变化,他们或许是电话拨号,或是宽带上网。当下载一个程序时,用户可以等较长的时间,但如果仅仅访问一个页面就不会这样。如果Web系统响应时间太长(例如超过5秒钟),用户就会因没有耐心等待而离开。

      另外,有些页面有超时的限制,如果响应速度太慢,用户可能还没来得及浏览内容,就需要重新登陆了。而且,连接速度太慢,还可能引起数据丢失,使用户得不到真实的页面。

      2、负载测试

      负载测试是为了测量Web系统在某一负载级别上的性能,以保证Web系统在需求范围内能正常工作。负载级别可以是某个时刻同时访问Web系统的用户数量,也可以是在线数据处理的数量。例如:Web应用系统能允许多少个用户同时在线?如果超过了这个数量,会出现什么现象?Web应用系统能否处理大量用户对同一个页面的请求?

      3、压力测试

      负载测试应该安排在Web系统发布以后,在实际的网络环境中进行测试。因为一个企业内部员工,特别是项目组人员总是有限的,而一个Web系统能同时处理的请求数量将远远超出这个限度,所以,只有放在Internet上,接受负载测试,其结果才是正确可信的。

      进行压力测试是指实际破坏一个Web应用系统,测试系统的反映。压力测试是测试系统的限制和故障恢复能力,也就是测试Web应用系统会不会崩溃,在什么情况下会崩溃。黑客常常提供错误的数据负载,直到Web应用系统崩溃,接着当系统重新启动时获得存取权。

      压力测试的区域包括表单、登陆和其他信息传输页面等。

      采用的测试工具

      性能测试可以采用相应的工具进行自动化测试,我们目前采用如下工具

      ab -----Apache 的测试工具

      OpenSTA—开发系统测试架构

    三、接口测试

      在很多情况下,web 站点不是孤立。Web 站点可能会与外部服务器通讯,请求数据、

      验证数据或提交订单。

      1、 服务器接口

      第一个需要测试的接口是浏览器与服务器的接口。测试人员提交事务,然后查看服务器

      记录,并验证在浏览器上看到的正好是服务器上发生的。测试人员还可以查询数据库,确认事务数据已正确保存。

      2、 外部接口

      有些 web 系统有外部接口。例如,网上商店可能要实时验证信用卡数据以减少欺诈行

      为的发生。测试的时候,要使用 web 接口发送一些事务数据,分别对有效信用卡、无效信用卡和被盗信用卡进行验证。如果商店只使用 Visa 卡和 Mastercard 卡, 可以尝试使用 Discover 卡的数据。(简单的客户端脚本能够在提交事务之前对代码进行识别,例如 3 表示 American Express,4 表示 Visa,5 表示 Mastercard,6 代表Discover。)通常,测试人员需要确认软件能够处理外部服务器返回的所有可能的消息。

      3、错误处理

      最容易被测试人员忽略的地方是接口错误处理。通常我们试图确认系统能够处理所有错

      误,但却无法预期系统所有可能的错误。尝试在处理过程中中断事务,看看会发生什么情况?

      订单是否完成?尝试中断用户到服务器的网络连接。尝试中断 web 服务器到信用卡验证服

      务器的连接。在这些情况下,系统能否正确处理这些错误?是否已对信用卡进行收费?如果

      用户自己中断事务处理,在订单已保存而用户没有返回网站确认的时候,需要由客户代表致

      电用户进行订单确认。

    四、可用性测试

      可用性/易用性方面目前我们只能采用手工测试的方法进行评判,而且缺乏一个很好的评判基准进行,此一方面需要大家共同讨论。

      1、导航测试

      导航描述了用户在一个页面内操作的方式,在不同的用户接口控制之间,例如按钮、对话框、列表和窗口等;或在不同的连接页面之间。通过考虑下列问题,可以决定一个Web应用系统是否易于导航:导航是否直观?Web系统的主要部分是否可通过主页存取?Web系统是否需要站点地图、搜索引擎或其他的导航帮助?

      在一个页面上放太多的信息往往起到与预期相反的效果。Web应用系统的用户趋向于目的驱动,很快地扫描一个Web应用系统,看是否有满足自己需要的信息,如果没有,就会很快地离开。很少有用户愿意花时间去熟悉Web应用系统的结构,因此,Web应用系统导航帮助要尽可能地准确。

      导航的另一个重要方面是Web应用系统的页面结构、导航、菜单、连接的风格是否一致。确保用户凭直觉就知道Web应用系统里面是否还有内容,内容在什么地方。

      Web应用系统的层次一旦决定,就要着手测试用户导航功能,让最终用户参与这种测试,效果将更加明显。

      2、图形测试

      在Web应用系统中,适当的图片和动画既能起到广告宣传的作用,又能起到美化页面的功能。一个Web应用系统的图形可以包括图片、动画、边框、颜色、字体、背景、按钮等。图形测试的内容有:

      (1)要确保图形有明确的用途,图片或动画不要胡乱地堆在一起,以免浪费传输时间。Web应用系统的图片尺寸要尽量地小,并且要能清楚地说明某件事情,一般都链接到某个具体的页面。

      (2)验证所有页面字体的风格是否一致。

      (3)背景颜色应该与字体颜色和前景颜色相搭配。

      (4)图片的大小和质量也是一个很重要的因素,一般采用JPG或GIF压缩。

      3、内容测试

      内容测试用来检验Web应用系统提供信息的正确性、准确性和相关性。

      信息的正确性是指信息是可靠的还是误传的。例如,在商品价格列表中,错误的价格可能引起财政问题甚至导致法律纠纷;信息的准确性是指是否有语法或拼写错误。这种测试通常使用一些文字处理软件来进行,例如使用Microsoft Word的"拼音与语法检查"功能;信息的相关性是指是否在当前页面可以找到与当前浏览信息相关的信息列表或入口,也就是一般Web站点中的所谓"相关文章列表"。

      4、整体界面测试

      整体界面是指整个Web应用系统的页面结构设计,是给用户的一个整体感。例如:当用户浏览Web应用系统时是否感到舒适,是否凭直觉就知道要找的信息在什么地方?整个Web应用系统的设计风格是否一致?

      对整体界面的测试过程,其实是一个对最终用户进行调查的过程。一般Web应用系统采取在主页上做一个调查问卷的形式,来得到最终用户的反馈信息。

      对所有的可用性测试来说,都需要有外部人员(与Web应用系统开发没有联系或联系很少的人员)的参与,最好是最终用户的参与。

    五、兼容性测试

      需要验证应用程序可以在用户使用的机器上运行。如果您用户是全球范围的,需要测试各种操作系统、浏览器、视频设置和 modem 速度。最后,还要尝试各种设置的组合。

      1、平台测试

      市场上有很多不同的操作系统类型,最常见的有Windows、Unix、Macintosh、Linux等。Web应用系统的最终用户究竟使用哪一种操作系统,取决于用户系统的配置。这样,就可能会发生兼容性问题,同一个应用可能在某些操作系统下能正常运行,但在另外的操作系统下可能会运行失败。

      因此,在Web系统发布之前,需要在各种操作系统下对Web系统进行兼容性测试。

      2、浏览器测试

      浏览器是Web客户端最核心的构件,来自不同厂商的浏览器对Java,、Javascrīpt、 ActiveX、 plug-ins或不同的HTML规格有不同的支持。例如,ActiveX是Microsoft的产品,是为Internet Explorer而设计的,Javascrīpt是Netscape的产品,Java是Sun的产品等等。另外,框架和层次结构风格在不同的浏览器中也有不同的显示,甚至根本不显示。不同的浏览器对安全性和Java的设置也不一样。

      测试浏览器兼容性的一个方法是创建一个兼容性矩阵。在这个矩阵中,测试不同厂商、不同版本的浏览器对某些构件和设置的适应性。

      采用测试工具

      通过白盒测试或者黑盒测试导出的测试用例,采用相应的工具进行测试,可以采用OpenSTA进行测试,此测试工具可以采用不同的浏览器进行测试。

      3.视频测试

      页面版式在 640x400、600x800 或 1024x768 的分辨率模式下是否显示正常? 字体是否太小以至于无法浏览? 或者是太大? 文本和图片是否对齐?

      4.Modem/连接速率测试

      是否有这种情况,用户使用 28.8 modem下载一个页面需要 10 分钟,但测试人员在测

      试的时候使用的是 T1 专线? 用户在下载文章或演示的时候,可能会等待比较长的时间,

      但却不会耐心等待首页的出现。最后,需要确认图片不会太大。

      5、打印机测试

      用户可能会将网页打印下来。因此网页在设计的时候要考虑到打印问题,注意节约纸张和油墨。有不少用户喜欢阅读而不是盯着屏幕,因此需要验证网页打印是否正常。有时在屏幕上显示的图片和文本的对齐方式可能与打印出来的东西不一样。测试人员至少需要验证订单确认页面打印是正常的。

      6、组合测试

      最后需要进行组合测试。600x800 的分辨率在 MAC 机上可能不错,但是在 IBM 兼容

      机上却很难看。在 IBM 机器上使用 Netscape 能正常显示,但却无法使用 Lynx 来浏览。

      如果是内部使用的 web 站点,测试可能会轻松一些。如果公司指定使用某个类型的浏览器,

      那么只需在该浏览器上进行测试。如果所有的人都使用 T1 专线,可能不需要测试下载施加。

      (但需要注意的是,可能会有员工从家里拨号进入系统) 有些内部应用程序,开发部门可能

      在系统需求中声明不支持某些系统而只支持一些那些已设置的系统。但是,理想的情况是,

      系统能在所有机器上运行,这样就不会限制将来的发展和变动。

    六、安全测试

      Web应用系统的

  • 换个角度看测试

    sophian727 发布于 2013-04-01 15:13:10

  • windows 性能监视器常用指标分析【转】

    没翅膀的飞鱼 发布于 2013-01-14 21:59:45

    怀疑内存不足时:
    方法1:
    【监控指标】:Memory Available MBytes ,Memory的Pages/sec, page read/sec, Page Faults/sec
    【参考值】:
    如果 Page Reads/Sec 比率持续保持为 5,表示可能内存不足。
    Page/sec 推荐00-20(如果服务器没有足够的内存处理其工作负荷,此数值将一直很高。如果大于80,表示有问题)。

    方法2:根据Physical Disk 值分析性能瓶颈
    【监控指标】:Memory Available MBytes ,Pages read/sec,%Disk Time 和 Avg.Disk Queue Length
    【参考值】:%Disk Time建议阈值90%
            当内存不足时,有点进程会转移到硬盘上去运行,造成性能急剧下降,而且一个缺少内存的系统常常表现出很高的CPU利用率,因为它需要不断的扫描内存,将内存中的页面移到硬盘上。

    怀疑内存泄漏时
       【监控指标】:Memory Available MBytes ,Process/Private Bytes和Process/Working Set,PhysicalDisk/%Disk Time
    【说明】: 
    Windows资源监控中,如果Process/Private Bytes计数器和Process/Working Set计数器的值在长时间内持续升高,同时Memory/Available bytes计数器的值持续降低,则很可能存在内存泄漏。内存泄漏应该通过一个长时间的,用来研究分析当所有内存都耗尽时,应用程序反应情况的测试来检验。

    CPU分析
    【监控指标】:
    System %Processor Time CPU,Processor %Processor Time CPU
    Processor%user time 和Processor%Privileged Time
    system/Processor Queue Length
    Context Switches/sec 和%Privileged Time
    【参考值】: 
    System/%Total processor time不持续超过90%,如果服务器专用于SQL Server,可接受的最大上限是80-85% ,合理使用的范围在60%至70%。
    Processor %Processor Time小于75%
    system/Processor Queue Length值,小于CPU数量的总数+1

    CPU瓶颈问题
    1:System/%Total processor time如果该值持续超过90%,且伴随处理器阻塞,则说明整个系统面临着处理器方面的瓶颈.
    注: 在某些多CPU系统中,该数据虽然本身并不大,但CPU之间的负载状况极不均衡,此时也应该视作系统产生了处理器方面的瓶颈.
    2:排除内存因素,如果Processor %Processor Time计数器的值比较大,而同时网卡和硬盘的值比较低,那么可以确定CPU 瓶颈。(内存不足时,有点进程会转移到硬盘上去运行,造成性能急剧下降,而且一个缺少内存的系统常常表现出很高的CPU利用率,因为它需要不断的扫描内存,将内存中的页面移到硬盘上。)

    造成高CPU使用率的原因:
    频繁执行程序,复杂运算操作,消耗CPU严重
    数据库查询语句复杂,大量的 where 子句,order by, group by 排序等,CPU容易出现瓶颈
    内存不足,IO磁盘问题使得CPU的开销增加

    磁盘I/O分析
    【监控指标】:PhysicalDisk/%Disk time,PhysicalDisk/%Idle Time,Physical Disk/ Avg.Disk Queue Length, Disk sec/Transfer
    【参考值】:%Disk Time建议阈值90%

    Windows资源监控中,如果% Disk Time和Avg.Disk Queue Length的值很高,而Page Reads/sec页面读取操作速率很低,则可能存在磁盘瓶径。
    Processor%Privileged Time该参数值一直很高,且如果在 Physical Disk 计数器中,只有%Disk time 比较大,其他值都比较适中,硬盘可能会是瓶颈。若几个值都比较大, 那么硬盘不是瓶颈。若数值持续超过80%,则可能是内存泄露。如果 Physical Disk 计数器的值很高时该计数器的值(Processor%Privileged Time)也一直很高, 则考虑使用速度更快或效率更高的磁盘子系统。

    Disk sec/Transfer 一般来说,该数值小于15ms为最好,介于15-30ms之间为良好,30-60ms之间为可以接受,超过60ms则需要考虑更换硬盘或是硬盘的RAID方式了
532/3<123>
staunch0442

staunch0442

从事软件测试工作已经一年多了,发现越来越喜欢软件测试这个工作了...

数据统计

  • 访问量: 24842
  • 日志数: 34
  • 书签数: 1
  • 建立时间: 2008-07-11
  • 更新时间: 2016-06-30

RSS订阅

Open Toolbar