2013年4月7日星期日

获取给定数据范围内的随机整数

'**********************************************
'功能:返回给定数据范围内的随机整数
'参数:Max - 取数范围上限,必填参数,数字类型
'     Min - 取数范围上限,必填参数,数字类型  
'**********************************************

Function GetIntRmdNum(Min,Max)
  On Error Resume Next 
  If Trim(Min)="" Or Trim(Max)="" Then 
    ErrDes = "参数不能为空"
    Msgbox ErrDes
    Exit Function 
  Else 
    Max = Int(Trim(Min))
    Min = Int(Trim(Max))
    If Err.Number <>0 Then 
      ErrDes = "参数类型不匹配,必须为数字"
      Msgbox ErrDes
      Err.Clear
      Exit Function 
    Else 
      Randomize()
      GetIntRmdNum = cInt((Max-Min) * Rnd() + Min)
    End If 
  End If 
End Function 



EIAC测试经典问题总结

  前言:在EIAC项目组参与测试接近三年,成功测试了很多业务功能和流程,但同时也出现过多次失误和雷区,其中有些失误确实是难以避免的,但是有些可以通过仔细测试,或者通过有效沟通或其他用例评审等都是完全可以避免,本总结统计和分析在EIAC测试过程中,出现的几次严重失误,作为后续测试的经验教训,为自己后续参与其他项目提供参考,也为后续其他测试人员参与EIAC提供简单的指导,以便重复同样或类似的错误。

  问题一:

  问题描述:

  (由于时间长,以前没有记录,记不太准了,大体是这样的!)在业务流程中,有两个功能块,每个功能块分别对应着一个开发人员和一个测试人员,两个功能块在测试环境都没有问题,上了生产环境,只是做表面的checklist,也没有发现明显问题,但是第二天用户报障,让整个项目组挨批;

  问题原因分析

  问题之所以没有在测试环境被发现和挖掘出来,主要是因为涉及两个开发人员,同时测试阶段也是两个不同的测试人员,不是在同一时间测试,代码有覆盖,未及时发现,上线到生产时,由于第二个补丁部署上去以后已经比较晚,第一个补丁已经检查完,待第二个补丁部署完成后,没有重新检查第一个补丁,同时,在测试环境测试通过后,开发之间没有互查代码

  解决和避免措施

  针对以上问题。项目组讨论,从根本上杜绝问题存在,即:

  1、针对测试环境,每周一做一次同步,所有开发人员开发新补丁或功能时,获取最新代码;

  2、在测试环境补丁测试通过后,由平台级开发人员进行代码复查codereview,

  3、测试人员在保证测试环境没有问题的情况下,在测试环境进行checklist时,要等同批次所有补丁部署上去再做全面检查。

  问题二

  问题描述:

  问题的原因出的有点可笑,但这确实影响面还是挺大的,具体是:测试环境在深圳公文发现word控件有乱码现象,于是就告诉了开发人员,过了一段时间,开发人员就说,再试试,此时测试人员再试,问题已经不能重现,于是,测试人员就认为问题已经解决,在生产环境验证时,验证公文问题也只是验证了省本部的广州市的

  原因分析:

  当测试人员汇报了问题,开发人员并没有及时去解决问题,而是从生产同步过来后,直接让测试人员试试,测试人员试过以后发现没有问题了,就以为是问题解决了,而实际上,只是同步了代码,并没有真正解决此问题,所以问题还是带到了生产上,但是在生产上检查时又漏掉了检测深圳市分公司的。所以造成这么严重的失误。



软件测试者的2大类型特点及发展空间

  任何软件产品都由2部分组成:业务逻辑+软件技术。业务逻辑通常由产品经理设计,软件技术由软件开发架构师设计和程序员编程实现。而测试人员呢?则通常对两大部分的质量问题都会进行评测。无论是主动认知还是被动发展,在大部分的组织中都会发现有一部分测试人员更喜欢和擅长进行业务逻辑的测试(后面称:SET)、一部分测试人员更喜欢和擅长对软件技术的测试(SDET)。

  常规业务逻辑的测试类型有:功能验证、功能测试、场景测试、端到端测试、探索测试;

  常规软件技术的测试类型有:性能测试、可靠性测试、单元测试、Code Review

  帮助提升研发效率的技术手段有:持续集成、自动化测试

  通常SET会更喜欢和擅长常规业务逻辑的测试类型,SDET会更喜欢和擅长折腾常规软件技术的测试类型和帮助提升研发效率的技术手段。

  两类测试者的知识结构有所不同:

  SET们会更喜欢学习和了解产品的商业知识和分析用户场景及用户行为,从业时间久了会成为产品专家,这类测试者经过长期测试工作训练将拥有更强的以"用户为中心"的思维习惯,无论是转型产品设计或是产品推广都会比较容易,产品路线是其发展的核心。

  SDET们会更喜欢学习和了解产品实现的各类软件技术,如:编程语言、软件设计方法、非功能的测试技术(自动化测试/性能测试/可靠性测试等)、帮助提升测试效率和软件质量的各类软件工具和工程方法。此类角色从业时间久了会成为技术专家,技术路线是其发展的核心。

  作为一家产品公司SET和SDET都是必须的,至于SET重要还是SDET更重要将由各公司的基因文化决定。例如:在华为是一家以"客户为中心"的公司,因此在华为ST地位更高也更重要些。在谷歌是一家以"技术创新为中心"的公司,因此SDT地位更高也更重要些,但是后来谷歌也发现了SDET受限于工作时间和兴趣志向的约束导致一些产品问题无法单纯靠SDET来解决,所以又重新组建了谷歌SET资源与SDET形成互补,才真正更好支撑起了谷歌商业产品的需求。(更多可见【转载】How Google Tests Software - The Life of a TE:http://www.51testing.com/index.php?uid-293557-action-viewspace-itemid-842600

  所以作为一个tester无论走哪条专业路线(产品路线或技术路线)最终依赖的是个人的兴趣和喜好。

  喜好走产品路线的同学也不要觉得职业发展就比走技术路线的同学差,在大多数非技术驱动的产品公司中似乎SDT后来的发展空间比SDET更大。我认识的这类测试人员有的后来还有做到产品总监和市场总监。如果你的创新气质和能力很强,可以往产品经理去发展。如果你的商业思维和影响力很强,可以往产品市场经理去发展。如果你创新力一般又不喜欢商业的压力,也可以做成一个公司中的稀缺的产品测试专家,在公司中也是一个宝,无人可代替。

  喜好走技术路线的同学职业发展路线可以是:成为软件开发者、软件工程专家、软件测试专家,活在自己喜欢的世界中。在重视技术创新和技术品质的公司中也会获得很好的发展。



众包测试正在改变游戏规则

  众包(Crowdsourcing)是这样一个过程:征求大批社区中的群众去完成一个任务,传统上这种任务由组织从内部选择一拨人来完成,多数是雇员或合同工。众包测试(Crowdsourced testing)利用众包的有效性和效率,把网络和云经济结合起来,是一种强大的组合。这可以成为游戏规则的变革者吗?

  Israel Gat提到,软件测试过程可以分割成两部分:

  ● 开发团队的单元测试

  ● 其他形式的测试包括功能性测试、负载测试、回归测试、可用性测试等等

  Israel说,后者正是游戏变革的地方,有专门的软件测试公司正有效利用网络和群众。他提到,根据测试的定义,众包测试本身非常适合像Kanban这样的过程。

  根据定义,测试作为一项服务,涉及到把任务从一方移交给另一方。无论开发团队如何紧密地同执行测试的一方进行合作,这终究是一个从阶段到阶段的流动过程。这种流动过程很自然地适用于Kanban方法。

  Bob Walsh阐明了众包测试如何让组织取得双赢。他说:

  尽管致力于质量保证的群众成员都喜欢做测试,但他们在其他方面都是独一无二的。对你而言,这是有好处的!例如,可能有一位香港的测试人员,在Windows Server 2003上进行测试时,发现如果应用程序试图读取包含unicode编码的粤语字符文件,这个应用程序就会崩溃。或者,可能巴西的测试人员在红帽企业版Linux3上测试时,发现你的应用程序依赖于glibc的功能,而这只在Linux4或后续版本中才有。

  类似地,Yvette Francino提到了众包测试服务存在的原因。Yvette说:

  如今,要在众多设备以及不同的软件配置下测试基于web的软件几乎是不可能的。此外,如果该软件想要在任何地方运行,可能会出现很多差异,使用传统的测试方法会有重大障碍。如何能在每一个地理区域有效地进行代码测试?测试软件的最佳人选,是这个国家的当地人,那些最有可能成为最终用户的人。

  Stanton Champion总结了几个众包测试的好处。包括:

  ● 可以接触不同的平台、语言和人

  ● 从现实世界中获取真知灼见,并不是只从测试用例的结果中获得

  ● 同时由数百人完成测试

  ● 即时的快速反馈

  Fred Beringer有类似的看法,他说自己是众包的粉丝,众包测试有助于解决问题:

  ● 需要更多灵活的、不同的硬件环境,主要是为了做一致性测试和性能测试

  ● 需要确保适当的、灵活的测试容量,以便能够应对紧迫的发布时间表。

  因此,众包测试似乎是一个有趣的概念,它可以帮助组织利用公众的各种力量。就像Israel所说的那样:

  如果众包测试真的受到亲睐(我相信它会的),它会加速解构过程,并随之改写产品的交付过程。



2013年4月2日星期二

性能测试中使用tesseract-ocr工具来识别验证码的一些想法

    最近一周我在搞验证码的问题,幸好有tesseract-ocr工具的支持,可以识别保存在本地的图片上的字符等,就是利用这一点,好多朋友把这一功能用在了识别验证码上(有些验证码不能被识别,精确度不高,可能是由于验证码中噪点的存在,妨碍了识别)。我只是照葫芦画瓢,解决了LoadRunner中识别验证码的问题,全是基于C环境的。详细的可以参看我的另一篇博文:http://www.cnblogs.com/zhuque/archive/2013/03/06/2946565.html

     由于tesseract-ocr工具对一些验证码的识别精确度不是太高,甚至有些图片根本识别不出来,还是建议在正式压力测试时,不要使用此方法来解决验证码的问题,更好的办法是在代码中来解决,或使用万能验证码。另外一个方法是把登录交易的代码(涉及验证码代码)放到vuser_init()中去,即登录成功后,频繁的去压测后面的交易。但也有很多操作类型的交易中也有验证码,比如:支付提交,这个就必须使用一个万能验证码来解决。

     在性能测试过程中不要纠结验证码的问题,毕竟98%以上的性能测试都在专门的独立的测试环境中来进行的,都可以通过修改code来解决验证码问题,方法有很多。但也不排除有些变态的CTO或者客户要求在线上环境来进行压测,我们可以试着用tesseract-ocr来识别验证码,如果识别不出,再试着去除验证码图片中的噪点后再去识别。怎么去除验证码图片中存在的噪点,以后再去研究,看样子这是一个大工程。

iPhone Instruments工具使用_检测内存泄露(转)

最近常使用Instruments这个工具,我发现它对追踪游戏中的内存泄露非常有帮助。自从发现Instruments如此有用后,我就觉得写一篇文章介绍如何使用它来追踪内存泄露对其他人也会有帮助。
什么是内存泄露?我为什么要关心内存泄露?
…此段省略…
访问维基百科可以获得更多关于内存泄露的信息。
我如何知道内存泄露了?
一些内存泄露可以很容易地通过阅读代码来发现,另一些就要困难点了,这就是为什么需要Instruments 的原因。Instruments 有一个“Leaks”工具,它会准确地告诉你什么地方发生了内存泄露,以便你能定位和修复泄露问题。
例子程序
我写了一个例子程序,它有两个地方会发生内存泄露,一个在 Objective-C 视图控制器中,另一个在 C++ 类中。例程可以从这里获得。下边的代码是从例程里摘录的,包含了我们需要追踪内存泄露的代码。
// Leaky excerpts – see GitHub for complete source
- (void)viewDidLoad {
[super viewDidLoad];
LeakyClass* myLeakyInstance = new LeakyClass();
delete myLeakyInstance;
mMyLeakyString = [[NSString alloc] initWithUTF8String:”I’m a leaky string.”];
[self doSomethingNow];
}
- (void) doSomethingNow
{
mMyLeakyString = [[NSString alloc] initWithUTF8String:
“Look, another alloc, but no release for first one!”];
}
// Leaky excerpts – see GitHub for complete source
LeakyClass::LeakyClass()
{
mLeakedObject = new LeakedObject();
}
LeakyClass::~LeakyClass()
{
}
我会先在 Debug 模式编译InstrumentsTest,并在 iPhone 上运行。完成这步,我会启动 Instruments。

clip_image001

当你启动 Instruments,你可以从一堆 Instruments 工具里选择你需要的。在左手边选择 iPhone,在右手边的图标里双击“Leaks”工具:

clip_image002

之后你会看到下边的窗口:

clip_image003

请确保 iPhone 已经连接到了你的电脑,在这个窗口的左上角,你会看到一个下拉菜单,写着“Launch Executable”。单击它,并确保选中的是你 iPhone(而不是你的电脑)作为活动设备。然后移动到“Launch Executable”,你可以看到一个包含了所有已安装 iPhone 程序的列表。找到你希望运用“Leaks”工具的程序(本例中是 InstrumentsTest)并单击它。

clip_image004

你已经准备好了。单击红色的“Record”按钮,它会启动程序并开始记录程序里的每个内存分配操作。它会每10秒自动地检测内存泄露。

clip_image005

你 可以改变多少时间自动检测一次,你也可以手动进行检测(检测内存泄露的时候程序会停顿大约3-5秒钟,如果你想边进行测试边进行内存检测的话,这种停顿将 会干扰到你)。我一般是设置成手动控制,在我需要的时候才单击“Check for leaks”按钮(例如:在loading新的游戏模式之后检测一下,在退出游戏返回 MM 的时候检测一下)。单击“Leaks”,并使用右上角的 View->Detail 按钮来设置和查看选项值,在这个例子里,我将其设置成 auto。

clip_image006

程序在运行一段时间之后,自动内存检测将会发现两处内存泄露。太棒了!现在该干什么呢?

clip_image007

Extended Detail 视图
Instruments 非常懒,它不会明显地指出下一步该干什么。你需要注意的是窗口底部的那一排按钮。看见两个矩形组成的那个按钮了吗?讲你的鼠标停留在上边,它会提示“Extended Detail View”。

clip_image008

单击这个按钮,右边将会弹出一个窗口,里边提供了各种关于内存泄露的详细信息。单击一个内存泄露,Extended Detail 视图将会显示泄露的内存代码的完整调用堆栈。在我们上边的例子中,单击第一个内存泄露提示,它发生在 [NSString initWithUTF8String]。如果你选中调用堆栈里的高亮步骤,你会看到程序最后一次调用是 [InstrumentsTestViewController viewDidLoad]。
双击 Extend Detail 视图中的某行,它会打开 XCode 窗口并显示出问题的代码,这是非常棒的功能。

clip_image009

在本例中,第一次 NSString 分配的时候出现了泄露,你需要做一些处理。这是个非常简单的例子,但找到为什么会发生泄露则要麻烦些。让我们仔细看一下例子。在 viewDidLoad 当中,我们为字符串分配到了内存,如下所示:
mMyLeakyString = [[NSString alloc] initWithUTF8String:”I’m a leaky string.”];
在 dealloc 当中我们用如下方式来释放
[mMyLeakyString release];
你的直觉可能是这样不会发生泄露,但搜索代码中所有用到了 mMyLeakyString 的地方,在 doSomethingNow 中,它是这样用的:
mMyLeakyString = [[NSString alloc] initWithUTF8String:
“Look, another alloc, but no release for first one!”];
注意,我们声明了一个新的字符串,并且将 mMyLeakyString 指向了它。这里的问题是我们没有在更改 mMyLeakyString 的指向前释放它原 来指向的内存。所以原始的字符串依然在堆中,并且我们没有办法释放这部分内存。dealloc 里的 release 操作实际释放的是我们在 doSomethingNow 中声明的字符串所占内存,因为这才是指针所指。
为了修复这个问题,我们可以把 doSomethingNow 改成下边的代码:
- (void) doSomethingNow
{
[mMyLeakyString release];
mMyLeakyString = [[NSString alloc] initWithUTF8String:
“Look, another alloc, but released first one!”];
}
这段代码做的是在我们指定 mMyLeakyString 到新的字符串前释放第一个字符串所占内存。重新编译运行程序,你会看到只有一个内存泄露。当然,在项目中可能有更好的方式来处理 NSString,但如果你这样处理的话可以修复这个泄露问题。
让我们看看第二个泄露问题。单击泄露提示看什么导致了内存泄露。发现这个泄露来自于 LeakyClass::LeakyClass() 构造函数:

clip_image009[1]

在调用堆栈中双击它,出问题的代码将会再次出现在 XCode 中。

clip_image010

我们看到在构造函数里声明了一个新的 LeakedObject 对象,但是析构函数没有删除,这样不好。对于每一个 new 操作,都需要有与之对应的 delete 操作。所以我们把析构函数改变成下边的样子:
LeakyClass::~LeakyClass()
{
if (mLeakedObject != NULL)
{
delete mLeakedObject;
mLeakedObject = NULL;
}
}
重新编译运行,没有内存泄露了!
我选择这两个例子,虽然非常简单,但他们展示了 Instruments 可以用来追踪 Object-C 和 C++ 中的内存泄露。
修复你的内存泄露问题吧,记住,没有内存泄露的程序才是一个好程序。 原文出处http://www.mobileorchard.com/find-iphone-memory-leaks-a-leaks-tool-tutorial/

.NET程序内存分析工具CLRProfiler的使用

大家都知道.net有一套自己的内存(垃圾)回收机制,除非有一些数据(方法)长期占有内存不随着垃圾回收功能而释放内存,这样就造成了我们经常说的内存泄露、内存持续增长得不到释放等问题导致APS.net网站或者C/S应用程序的用户无法正常使用。最终会导致用户通过客服人员或者技术支持人员投诉公司的技术部门,形成一连串的未知的不良反映。
不管哪位性能测试人员,遇到这样的问题都是摸不着头脑,不知从何处下手。.net环境中不像JAVA有那么多的工具可以支撑,比如性能测试经常用到的Jconsole、Jprofiler等工具,并且基于JAVA运行环境的在打印GC日志方面也很强大。对于.net平台,微软也提供的.net辅助工具CLR Profiler可以很好的帮助我们的性能测试人员以及研发人员,找到内存没有及时回收,占着内存不释放的方法(详细到这个方法下面定义的数组或者其他变量)。
下载地址:http://search.microsoft.com/en-us/DownloadResults.aspx?q=clr%20profiler
可根据自己电脑.NET的版本下载相应的CLR Profiler,我下载的是CLR Profiler for .NET Framework 4版本的。
下载后提示解压缩,选择要加压到的目录;然后进入D:\SoftWare\CLRProfiler4\CLRProfiler\Binaries目录下选择对应操作系统64位或者32位的CLRProfiler.exe。
在说一下,CLRProfiler可以分析.net平台开发的几乎所有的产品,包括C/S应用程序、服务和asp.net编写的网站等。
我的环境是:IIS服务器(asp.net开发的站点)+MS sql
打开CLRProfiler界面,选中Profiling active、Allocation和Calls,【Start Application】是加载.net开发的exe程序的;【Start URL】是输入被测页面URL的;

我要在IE中测试asp.net开发的页面,CLR Profiler首先要加载IIS所需要的环境变量,CLR Profiler然后提示你加载ASP.NET应用程序和等待ASP.NET工作进程启动。
在File菜单中点击Profile ASP.NET


停止IIS服务可能要很长时间,需要耐心等待。最后提示可以测试页面啦
“Waiting for ASP.NET to start common language runtime - this is thetime to load your test page”

点击【Start URL】按钮,输入我们要测试的页面URL,点击OK,就会自动打开我们要检查内存有不释放内存的页面,多在页面中使用一会,以便CLR Profiler收集更多的数据。

当已完成页面的运行,请点击CLR Profiler窗口中的 【Kill ASP.NET】。然后CLR Profiler自动关闭IIS,移除环境变量,重启IIS。



点击【Allocation Graph】打开内存分配视图,在这个视图当中我们可以看出堆栈是如何分别对象的

点击【Objects by Address】按钮将会显示各种方法在内存中占用的直方图界面

可以通过选中那个视图中的某一个柱形条,右击show who allocated。点击这个菜单项显示关于所选分配的特定详细内容,而不是所有分配的

点击[TimeLine]按钮,在打开的图片中可以清晰的看出各次回收时间和前后内存占用量情况

在view菜单中,有很多没有显示的菜单。

点击call tree 菜单,可以看到在不同线程下,所有方法占用内存大小,被调用次数等信息

如果看不到图片请查看我的另一篇文章:http://blog.csdn.net/wy3552128/article/details/8158938

使用DDMS测试安卓手机APP的性能(android)

安装/配置:

通过另外一个工具也可以测试手机客户端APP的性能,这就是android开发包中的DDMS工具(Dalvik Debug Monitor Service),先来说一下android开发包的安装:

1、 首先安装JDK,1.5以上的版本

2、 在安装完JDK 后,就需要下载及安装Android SDK,即: android-sdk-windows,压缩包大约有551M左右

3、 解压缩android-sdk-windows,放在C盘的根目录下,配置系统变量path 的值为:C: \android-sdk-windows\tools

启动:

1、 可以在运行中进入ddms

clip_image001

2、也可以在C: \android-sdk-windows\tools目录下启动ddms.bat

连接:

1、 使用数据线连接安卓系统的手机,确认手机是处于“USB调试”模式

1)在手机上按下“Menu”键,在弹出的菜单中选择“Setting(设置)”;
2)选择“应用程序”;
3)在此界面勾选“未知来源”,然后选择“开发”;
4)勾选“USB调试”,“保持唤醒状态”;

2、 在ddms的左边框中会显示手机已经打开的应用程序(APP)进程,如果不显示,可以多连接几次,或者换个手机试试

clip_image002

操作:

前提是要打开我们要分析的手机客户端app程序(网上随便找的APK程序)

1. 点击选中想要监测的进程,比如system_process进程;
2. 点击选中Devices视图界面中最上方一排图标中的“Update Heap”图标;
3. 点击Heap视图中的“Cause GC”按钮;
4. 此时在Heap视图中就会看到当前选中的进程的内存使用量的详细情况。

分析:

如何才能知道我们的程序是否有内存泄漏的可能性呢。这里需要注意一个值:Heap视图中部有一个Type叫做data object,即数据对象,也就是我们的程序中大量存在的类类型的对象。在data object一行中有一列是“Total Size”,其值就是当前进程中所有Java数据对象的内存总量,一般情况下,这个值的大小决定了是否会有内存泄漏。可以这样判断:

a) 不断的操作当前应用,同时注意观察data object的Total Size值;

b) 正常情况下Total Size值都会稳定在一个有限的范围内,也就是说由于程序中的的代码良好,没有造成对象不被垃圾回收的情况,所以说虽然我们不断的操作会不断的生成很多对象,而在虚拟机不断的进行GC的过程中,这些对象都被回收了,内存占用量会会落到一个稳定的水平;

c) 反之如果代码中存在没有释放对象引用的情况,则data object的Total Size值在每次GC后不会有明显的回落,随着操作次数的增多Total Size的值会越来越大,直到到达一个上限后导致进程被kill掉。

d) 此处已system_process进程为例,在我的测试环境中system_process进程所占用的内存的data object的Total Size正常情况下会稳定在2.2~2.8之间,而当其值超过3.55后进程就会被kill。

clip_image004

clip_image006

clip_image008

clip_image010

clip_image012

参考文档:http://hi.baidu.com/2012jasonhao/item/27fafb0c014a5ac42f4c6b25