qileilove

blog已经转移至github,大家请访问 http://qaseven.github.io/

使用 Selenium 和 TestNG 进行编程式测试

  Testngjunit对比
  1. 总体概念
  TestNG,即Testing, Next Generation,下一代测试技术,是一套根据JUnit 和 NUnit思想而构建的利用注释来强化测试功能的一个测试框架,即可以用来做单元测试,也可以用来做集成测试。
  2. 介绍
  TestNG是一个设计用来简化广泛的测试需求的测试框架,从单元测试(隔离测试一个类)到集成测试(测试由有多个类多个包甚至多个外部框架组成的整个系统,例如运用服务器)。
  编写一个测试的过程有三个典型步骤:
  * 编写测试的 业务逻辑并在代码中插入TestNG annotation
  * 将测试信息添加到testng.xml文件或者build.xml中
  * 运行TestNG
  在欢迎页面上可以找到快速入门示例。
  下面是这篇文档使用的概念:
  * suite由xml文件描述。它包含一个或多个测试并被定义为<suite>标签
  * test由<test>描述并包含一个或者多个TestNG类
  * TestNG类是包含至少一个TestNG annotation的java类,由<class>标签描述并包含一个或多个测试方法
  * 测试方法是源文件中带有@Testd注释的java方法
  TestNG测试可以被@BeforeXXX 和 @AfterXXX annotations配置,容许在特定点的前后执行一些java逻辑,这些点上面已经列出。
  这份手册的剩余部分将讲述以下内容:
  * 所有的annotation列表并带有简短说明,为TestNG的多种功能性提供参考, 你可能需要参考为每个annotation提供的代码片段来学习细节。
  * testng.xml文件描述,它的语法和如果指定它。
  * 多个特性的详细列表和怎样结合annotation和testng.xml来使用它们
  *******************************************************************************
  注:上面的内容很简短,但是请注意其中的一些细节。
  1. TestNG是一个设计用来简化广泛的测试需求的测试框架,从单元测试到集成测试
  这个是TestNG设计的出发点,不仅仅是单元测试,而且可以用于集成测试。设计目标的不同,对比junit的只适合用于单元测试,TestNG无疑走的更远。
  可以用于集成测试,这个特性是我选择TestNG的最重要的原因。
  2. 测试的过程的三个典型步骤,注意和junit(4.0)相比,多了一个将测试信息添加到testng.xml文件或者build.xml
  测试信息尤其是测试数据不再写死在测试代码中,好处就是修改测试数据时不需要修改代码/编译了,从而有助于将测试人员引入单元测试/集成测试。
  3. 基本概念,相比junit的TestCase/TestSuite,TestNG有suite/test/test method三个级别,即将test/test method明确区分开了。
  junit中的TestCase将test/test method混合,比较容易让人概念不清晰,尤其是新手。

posted @ 2014-01-06 13:56 顺其自然EVO 阅读(247) | 评论 (0)编辑 收藏

可用性测试的那些事

  可用性测试是指通过对典型用户实施测试来对产品或服务做出评价。在一次典型的测试中,用户要完成一系列典型任务。与此同时,观察者会在一旁观察、倾听、做笔记。可用性测试的目的就是为了发现可用性问题,收集定性和定量的数据,并评估用户对产品的满意度。
  可用性测试的好处
  可用性测试有助于设计和研发团队在产品成型之前发现问题。问题发现和修正的越早,从工时和对日程的潜在影响来看,修正的代价就越小。可用性测试可以帮助你:
  1、了解参与者能否顺利完成特定任务
  2、了解完成特定任务的时间
  3、了解参与者对网站和其他产品的满意度
  4、找到为改善用户表现和满意度所需的改变
  5、通过分析用户表现来考察其是否满足你的可用性目标
  你不需要一个正式的实验室
  有效的可用性测试并不一定需要正式的实验室。你可以在这些背景下实施:
  1、由2-3个相连的房间改装的实验室,同时配备有录音和视频设备
  2、配备有可携带录制设备的房间
  3、没有录制设备的房间没关系,只要有人在观察用户并做笔记
  4、远程测试,用户在不同的地方(有主持的或者没主持的)
  影响成本的因素
  影响成本的因素有:
  1、测试的类型
  2、配备给测试的团队规模
  3、测试参与者的数量
  4、测试的天数
  记住要安排不止一次测试的预算。网站或其他产品的可用性设计是一个迭代的过程。
  为可用性测试安排预算时要考虑下面的因素:
  1、时间:你需要时间来计划可用性测试。需要时间来让可用性专家和团队熟悉网站,试验测试场景。确保为测试准备安排足够的时间,当然还有实施测试、分析数据、撰写报告和呈现结果的时间。
  2、招募成本:要考虑你要怎样和在哪里招募参与者。你要考虑到招募的工时以及让招募公司按照你的要求招募被试的时间。
  参与者报酬:如果你要为参与者的时间、旅费支付报偿,那就将这些也考虑进预算。
  3、租金成本:如果你没有监控或录制设备,你需要为实验室或其他设备支付租金,这也是预算的一部分。你可能需要保证一个测试的地点,比如一间会议室,这也是要考虑的。


 制定测试计划
  计划的目的就是记下你要做什么,你要如何实施测试,你要收集哪些测量数据,测试多少参与者,以及使用的场景。
  通常,可用性专家会和网站或产品的拥有者以及研发团队的成员碰面,讨论决定计划的主要要素。然后,可用性专家会制定出计划的初步方案,告诉管理者和团队的其他成员。每个人发表自己的意见,并对最后的计划达成一致,可用性专家会修改计划来反映最后的决定。
  测试计划的要素
  可用性计划包括如下要素:
  1、范围:你要测试什么:给网站、网站应用、或其他产品取个名字。说明测试覆盖的产品方面,例如,截止到某个日期的原型;导航;导航和内容。
  2、目标:确定测试的关注点、问题和目标。目标可能很宽泛,例如,“用户从原型主页的导航能够定位到重要信息吗?”也可能很具体,例如,“用户能够很容易地找到放在目前位置的搜索框吗?”在每轮测试中,你肯定会有一些或宽泛或具体的关注点。场景要依据你的关注点设置。
  3、日程和地点:什么时候以及在哪测试。日程安排要详细说明一天中有多少次的会谈,每次会谈的时间安排怎样。
  4、测试阶段:每个测试阶段的说明、时长(通常一个小时到90分钟)。在安排参与者时,在测试阶段之间通常要预留30分钟的时间来重新布置环境,与观察者简单回顾讨论这个测试阶段,或者为测试阶段推后或参与者迟到提供缓冲。
  5、设备:说明设备的类型。台式机、笔记本、手机或智能手机。如果与测试相关,也应包括显示器的尺寸和分辨率,操作系统,浏览器等。也要说明你计划录音或录像,或使用到某种特殊的可用性测试工具和协助工具。
  6、参与者:说明你计划招募的测试参与者的数量和类型。介绍你要怎样招募这些参与者。可以考虑将筛选标准放在附录。
  7、场景:说明测试中任务的数量和类型。通常,对于一个60分钟的测试,你可以为台式机或笔记本的测试安排10(+/-2)个场景,为手机或智能手机测试安排8(+/-2)个场景。你可以在测试计划中包含更多的场景,这样团队就可以从中选择合适的任务。
  8、测量数据:主观测量数据:包括你准备在每个测试阶段前(如背景调查问卷)和每个任务场景完成后(任务的容易度和满意度问题)询问参与者的问题,以及每个测试阶段结束后整体的容易度、满意度以及使用和推荐的可能性等问题。
  9、定量测量数据:列出你在测试中要测量哪些定量数据,例如成功率,错误率和完成任务所需时间。
  10、角色:参与可用性测试的员工名单和他们的角色。可用性专家应该成为测试的主持人。可用性团队成员可以是主要的记录者。其他团队成员可以作为观察者或记录者。
  招募参与者
  你要招募熟悉网站的用户做测试的参与者。
  根据网站或产品的不同,你可能有许多不同的潜在用户群(例如,内科医生、病人、研究者或青少年、父母和教育者)。每个用户群要尝试着招募一些典型用户,或者最好的情况是,如果你想收集基于角色的信息或关注功能,你也可能单独对每个用户群实施测试。
  如果你的网站是针对外部受众的,一个常见的错误就是使用内部员工来做参与者。只有内部员工也是网站的目标受众时,他们才能作为参与者。
  1、数量:对于一个诊断性的可用性测试,6-8个用户通常就足以发现产品的主要问题。
  如果你想开展正式的定量测试,你需要从更多的人那里获得数据结果,但是可用性测试通常不会这样做。
  如果你计划在开发网站时做迭代可用性测试,许多用户会对网站的好几个版本进行测试。你需要将这个考虑进你的招募和预算计划。
  2、招募:如果你的团队能够找到典型用户,你可以从他们当中招募。如果你的团队找不到,你可以雇用一家商业招募公司。大部分招募公司需要两到三周来寻找和安排必须的参与者数量和类型。一些招募公司也可能帮你管理报酬费。最好和他们讨论下你的团队所需要的额外服务。
  3、筛选问卷:筛选问卷可以很简单,只有性别和年龄;也可以很复杂,包括一系列目标受众的规定。
  4、成本:包括寻找参与者的花费,也包括激励参与者的花费(如礼物或酬金),某些情况下也包括旅途费用和停车费。
  测试准备
  确保你准备好了所有材料、知情同意书和需要的文件。在测试前再检查一遍。让一个志愿参与者初步试验一下设备和材料。初步试验可以帮助你:
  1、测试设备
  2、让主持人和记录者练习一遍
  3、了解到参与者能否清晰地理解你的问题和场景
  4、做最后的调整
  在正式测试前用1-2天做试验性的测试,这样你就有时间处理一些技术问题、或有必要的话调整场景或其他材料。
  实施可用性测试
  以下是一个测试阶段的例子:
  1. 主持人对参与者表示欢迎,并向其说明接下来的测试阶段,邀请参与者签下授权协议,询问测试前的人口统计学问题。
  2. 主持人说明出声思维,并询问参与者有没其他问题。主持人告知如何开始。
  3. 参与者大声阅读任务场景,并一边依据场景开始工作,一边出声思维。
  4. 记录者记下参与者的行为,评论,错误以及是否成功完成每个任务。
  5. 直到所有任务场景全部完成,测试阶段也就结束,或分配的时间已经过去
  6. 主持人询问测试阶段结束后的主观性问题,或者让他们完成一个在线调查,感谢参与者,给参与者报酬,护送他们离开测试环境。
  7. 主持人随后重新布置材料和设备,和观察者简单讨论,等待下一个参与者的到来。
  测试度量
  在测试中可以收集下面几种测量数据:
  1、任务成功率:每个场景都需要用户获得特定的数据以完成任务。当参与者找到问题的答案或完成任务目标时,场景任务就算成功完成了。在某些情况下,你可能想要询问多重选择的问题。记住,在测试计划中要有问题和相应的答案,并将这些告诉记录者和观察者。
  2、关键错误:关键错误是指偏离场景目标的行为。例如,由于参与者的工作流程而报告了错误的数据。这种情况下,参与者本质上是不能完成任务的。参与者可能意识到或没有意识到没有完成任务。
  3、非关键错误:是指参与者自己恢复的错误,或没有导致任务失败的错误。这些错误只是造成完成的效率更低。例如,打开错误的导航菜单栏目的探索性的行为,或不正确地使用一个控件。
  4、零错误率:参与者在没有出现任何错误(关键和非关键错误)的情况下完成任务的百分比。
  5、完成任务时间:参与者完成任务所需的时间。
  6、主观测量:参与者自我报告的关于满意度、易用性、找到信息的容易程度等方面的评价,使用5-7点量表测量。
  喜欢,不喜欢和建议:参与者最喜欢网站的哪些方面,最不喜欢网站的哪些方面,以及改善网站的建议。

  数据分析
  根据你使用的测量数据的不同,你最后会得到几种不同的数据类型。这包括定量数据(成功率、完成任务时间、错误率、满意度评价)和定性数据(参与者使用流程的观察、出现的问题、评价与建议、开放性问题的回答)。
  重要结果报告
  为了保证报告了重要结果,当你检视数据时要考虑问题在整个网站中的普遍性以及问题的严重性。
  你的发现可能对网站的其他页面也有参考价值(普遍性)。例如,你可能发现,由于文字太密集,参与者在网页上找不到想要的东西。你可以说仅仅是这个页面需要调整,但你也需要考虑其他页面是否也存在这个问题。
  一些问题相比其他问题对于参与者完成任务更为关键。许多组织会在3-4点量表评价问题的严重性。例如:
  1、非常重要:如果我们不修正这个问题,用户就没法完成场景任务。
  2、重要:如果不修正这个问题,用户会感到受挫,并最终放弃。
  3、次要:用户有点恼火,但这并不影响他们完成场景任务。这个问题有待不久后商榷。
  撰写报告
  一个好的报告应该包括测试计划的相关信息,并呈现刚好足够的细节以便后续测试能够重复这一方法。每一部分尽量简洁,用表格呈现测量数据。把发现和建议作为重点,并使用可视化的例子来说明问题区域。
  你的报告要包括:
  1、背景总结:对你测试了什么(网站或网站应用)、什么时候在哪里测试、设备信息、在测试中你做了什么(可以将所有的测试材料放在附录)、测试团队和问题的简单描述做一简短的总结。
  2、方法:呈现测试方法以便他人可以重复你的测试。说明你是如何实施测试的,包括介绍测试阶段、测试界面的类型、收集到的测量数据、测试场景概述。介绍参与者情况,用一个总结性的表格呈现他们的背景/人口统计学特征的信息,例如年龄、职业、网络使用情况、访问的网站等。对人口统计学数据做简单的总结,但不要透露参与者的全名。
  3、测试结果:介绍主持人和数据记录设备的收集的结果。介绍最高和最低完成率的任务。总结每个参与者的成功率、任务和每个任务的平均成功率,并用表格呈现出来。以这种方式呈现所有的测量数据。
  1.完成每个场景和所有场景的参与者数量和百分比,可以用条形图呈现。
  2.完成每个场景平均所需的时间
  3.满意度结果
  4.作为例证的参与者的评论
  4、发现和建议:用你的数据列出你的发现和建议(定量的和定性的,笔记和电子表格)。每个发现都应基于数据,即你实际看到和听到的。你可能只想将所有发现和建议列成一张总表,或者一个场景一个场景的介绍,又或者不仅有一张主要发现的列表,也有依据场景任务划分的建议,同时也有一个场景一个场景的报告。记住:
  1.虽然大部分的可用性报告只关注问题,但报告正面的发现也是有用的。那些工作良好的特性在未来的研发必须保留。
  2.一个完全负面的报告可能会让人心灰意冷;它有助于团队知道一个工作良好的网站的许多问题。
  3.每个发现应该包括尽可能具体的对情境(situation)的描述。
  4.每个发现(或每组互相关联的发现)应该包括怎么应对的建议。
  5、严重性评级:如果你将问题区分为局部性的和整体性的,且有严重性评级,要报告这些。附上截图和视频片段。加入视觉元素能够报告更富信息量也更加有趣。截图能让读者看到你在测试什么。它能表现哪些地方工作良好,哪些地方给用户带来使用困难。如果你是在电子设备上呈现报告,并且能让读者看到视频片段,要附上一些短视频来说明特定的点。通过观看相关的视频片段,没有观察到实际测试阶段的人能够更加确信问题的所在,并由更强的意愿去修正。
  6、执行和重新测试:要想实现可用性测试的价值,你必须将你所了解的应用到网站的改善中去。你可能没法执行所有的建议。开发任何产品都是一系列权衡的过程,你要考虑需要的日程安排、预算、人手和改变。如果你没法执行所有的建议,你可以基于全局性和严重性来判断优先级。做出优先级判断后,推进用户需要的改变。当一个网站还在开放阶段时,为一个设计糟糕的网站的用户提供支持的成本远远大于修正网站的成本。
  最佳实践
  1.尊重被试,让他们感觉舒适自然。
  2.记住你是在测试网站而不是用户。让他们理解他们是在帮助我们测试原型或网站。
  3.保持中立。你是在听和看。如果参与者问你问题,你可以这样回应“你认为呢?”,“我好奇你会怎么做。”
  4.不要突然跳出来帮助参与者,也不要引导参与者。如果参与者放弃了并向你求助,你要决定是否要终止场景、提示还是给到更多的帮助。
  5.团队必须决定当参与者明显去到一个错误的路径时,你要提供多大程度的提示,以及允许参与者完成场景花费多少时间。
  6.做好笔记。记录者要尽可能详细地记录下参与者做了什么和说了什么。笔记做的越好,分析也就越容易。
  7.测量行为表现和主观(偏好)度量。表现测量包括:成功率、时间、错误率等。主观测量包括:用户自我报告的满意度和舒适度评价。人们的行为表现和主观偏好并不总是一致的。用户经常在表现糟糕时,主观评价却很高。反之亦然。
  8.可用性测试不仅仅是对项目进度的检查。团队应该知道测试的目的是什么,然后执行结果。

posted @ 2014-01-06 13:41 顺其自然EVO 阅读(153) | 评论 (0)编辑 收藏

RFS的web自动化验收测试—菜单栏&工具栏

前一讲已经看到我们最新版本的工具界面了。
  我把RIDE的界面大致分了四个区域:菜单栏、工具栏、案例及资源区、工作区,如下图
  菜单栏:RIDE所有的功能都在这里面;
  工具栏:比较常用的功能,可以快捷操作;
  案例及资源区:这里将会是一个目录一样的树形结构(当前目前是刚打开的样子,里面只有一个空的external resources)
  工作区:这里是我们主要编辑案例,运行案例的操作区。
  其实我一直在想,这个工具怎么讲大家更容易理解,最方便的应该是带着实际的例子结合操作来讲解,这个肯定会有。不过我觉得还是要对工具全面介绍一下先,当然对于菜单栏和工具栏,只是罗列功能描述,因为后面都会用到的;对于案例区和工作区,我会以实际案例进行讲解。
  ==菜单栏&工具栏==
  这里很多大家都熟悉的常用命令就不细说了。其实大部分的命令在后面的讲解中还会出现的。所以每个菜单里我找点重点来说。
  1、File 文件
  Open打开一个文件
  Open Directory打开一个目录
  Reload Directory重新加载目录
  这个功能是一个不错的改进,在用0.42的时候还没看到过,应该是最近新增加的。作用就是重新加载整个目录(或者说工程)。
  在0.42的时候我一般都是用截图里Exit上面的最近打开的工程这个来做用作重新加载。
  Save和Save All,对应图标:,应该不用细说了,你修改了多个文件,用右边的图标可以全部保存。
  2、Edit 编辑
  这里很多功能大家都很熟悉了,不多说了。
3、Tools 工具
  Manage Plugins 管理插件
  Search Unused Keywords 搜索没有使用的关键字
  Preferences 参数配置
  Preview 预览
  Content Assistance 内容助手
  Search Keywords 搜索关键字
  View RIDE Log 查看RIDE日志
  Run Test Suite 运行Test Suite
  Stop Running 停止运行
  常用的:最后2个肯定常用。
  另外我认为比较常用的一个是F5-Search Keywords,对于我们在写案例的时候可以方便的查找测试库的关键字及其参数和样例等。
  另一个是content assistance,不过这个功能有点不太方便,主要是快捷键,因为Ctrl+空格和我们的中英文切换冲突了,而Ctrl+alt+空格又按着不太习惯。我的做法是把输入法的Ctrl+空格改成别的,这样就可以使用了。
  这里有个新增的功能Search unused Keywords=查找没有用过的关键字,关键字多了以后可能会有些没有用过的,这个可以比较方便的查找。

 4、Navigate 导航
  后退和前进,可以方便的在案例区进行跳转,对应图标
  5、Run 运行(其实我觉得这个名字不太合适,8过我也想不出叫啥名字更贴切,功能可以看下面的介绍)
  这个设置我没怎么用过,简单研究了一下,就是可以自己写好一些命令行的语句,可以直接通过菜单来运行。主要是针对通过命令行方式运行的一些命令,可以自定义菜单。
  比如下面我简单配置了2个
  再看run的菜单,就多了这2个了,可以直接点击运行。
  点第二个运行一下看看,他直接在工作区增加了一个tab页,运行结果也显示在上面了,以后有空我们再深入研究这个。
  6、Help 帮助
  这个不用说了吧。
  小结:简单介绍了一下RIDE的菜单功能,后面我们还会用到他们,先熟悉一下。

posted @ 2014-01-06 13:40 顺其自然EVO 阅读(278) | 评论 (0)编辑 收藏

eclipse下使用arquillian对seam项目进行单元测试

版本:
  eclipse: 4.2.0
  seam: 2.3.0.Final
  jboss-as: 7.1.0.Final
  当前ftc项目pom.xml中的dependency已经包含了arquiilian依赖,所以不用再从官网上复制大片xml到自己的pom.xml中了。但要想在eclipse中执行单元测试还需要一点点改动:
  我们首先在cn.ftc.test包下写一个测试类,代码如下:
package cn.ftc.test;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(Arquillian.class)
public class ExcelProcessorTest {
@Deployment
public static JavaArchive createDeployment() {
return ShrinkWrap.create(JavaArchive.class)
.addClass(ExcelProcessorTest.class)
.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
}
@Test
public void should_create_greeting() {
System.out.println("hello");
}
}
  以managed方式运行测试
  此方式下无需事先启动jboss, arquillian会自动启动JBoss,部署测试jar包,运行测试,最后关闭jboss。
  1. 修改arquillian.xml为以下内容:
<container qualifier="jboss" default="true">
<configuration>
<property name="jbossHome">你的JBoss安装目录</property>
</configuration>
</container>
  上述代码的作用是告诉 arquillian JBoss的所在路径,并用这个JBoss运行测试。
2. 在项目根目录下的pom.xml中,找到 id 为 arq-jbossas-7-managed 的profile节点, 在groupId为org.jboss.as的节点中,添加一个version节点,内容为
7.1.1.Final。(7.1.0.Final也行)。
<profile>
<id>arq-jbossas-7-managed</id>
<activation>
<property>
<name>arquillian</name>
<value>jbossas-managed-7</value>
</property>
</activation>
<dependencies>
<dependency>
<groupId>org.jboss.as</groupId>
<artifactId>jboss-as-arquillian-container-managed</artifactId>
<version>7.1.1.Final</version> <!-- 添加这一行 -->
<scope>test</scope>
</dependency>
</dependencies>
  3. 向eclipse导入工程。
  File --> import ,选择 existing maven projects. 如图:
  4. 选择profile:
  在pom.xml上点右键 --> maven --> select maven profiles。在弹出的对话框中构选 arq-jbossas-7-managed。如图:
  完成后,在ExcelProcessorTest类上点击右键 --> Run As --> JUnit Test 即可运行测试。
  以remote方式运行测试
  我们手动启动JBoss,让arquillian以我们启动的JBoss为容器运行测试。
  1. 类似于上面步骤2,打开pom.xml,找到 id 为 arq-jbossas-7-remote 的 profile节点,在dependency中添加version节点,内容为 7.1.1.Final.
<profile>
<id>arq-jbossas-7-remote</id>
<activation>
<property>
<name>arquillian</name>
<value>jbossas-remote-7</value>
</property>
</activation>
<dependencies>
<dependency>
<groupId>org.jboss.as</groupId>
<artifactId>jboss-as-arquillian-container-remote</artifactId>
<version>7.1.1.Final</version> <!-- 添加此行 -->
<scope>test</scope>
</dependency>
</dependencies>
  2. 重复前述步骤4,这次要选择 arq-jbossas-7-remote.
  此时我们先从终端启动JBoss,然后再在测试类上点右键 --> Run As --> JUnit Test 即可运行测试.

posted @ 2014-01-06 13:15 顺其自然EVO 阅读(487) | 评论 (0)编辑 收藏

Mysql数据库乱码问题:Incorrect string value

 使用命令行进入Mysql:
  输入命令"status"查看mysql的有关编码设置:
  这里一共显示了4中字符集,Server characterset是数据库服务器的编码,DB characterset是数据库的编码,client characterset是客户端的编码,conn characterset是建立连接时使用的编码。为了很好的兼容英文和中文,所有的这些选项强烈建议使用utf8。至少应该保证server characterset这个编码是utf8。
  如果这里显示的不是utf8的话,我们可以使用
set character_set_connection = 'utf8';
set character_set_results = 'utf8';
set character_set_client = 'utf8';
  另外,在创建数据库和建表时也需要指定编码字符集为"utf8",以及表中各个字段的格式也为utf8.
  还有,我是用myeclipse写的java文件操作数据库,最好设置myeclipse的编码格式也为utf8.如果是对java文件更改编码格式:
  windows->Preferences->general->ContentTypes->Java Source File->UTF-8 ,建议设置myeclipse的默认编码格式为utf8

posted @ 2014-01-03 13:45 顺其自然EVO 阅读(186) | 评论 (0)编辑 收藏

性能测试分享—LoadRunner篇

 之前写了一篇JMeter的性能测试工具的使用,但是LoadRunner才算是真正重量级的性能测试工具,下面详细介绍一下java vuser协议的使用和环境参数调试。
  LoadRunner性能测试工具使用:
  1、新建脚本,选择java vuser协议。初步结构是
import lrapi.lr;
public class Actions
{
//在init方法里面编写一个虚拟用户循环只执行一次的方法,如可以把协商写在里面,就可以达到每个用户协商一次之后,就不再协商的效果
public int init() throws Throwable {
return 0;
}//end of init
//在aciton方法里面编写需要循环并发的业务方法,如交易的方法,在run_time settings中设置循环的次数。
public int action() throws Throwable {
return 0;
}//end of action
//在end方法里面编写最后要执行的方法,如释放资源,没有可以不写。
public int end() throws Throwable {
return 0;
}//end of end
}
  2、在初始代码的基础上继续编写业务方法。需要注意的是:
  1)把只需要创建一次对象的语句如:Random rd = new Random();放在init,aciton,end方法之外,可以避免在循环中创建很多的对象。但是需要注意的是如果是创建HTTP请求的对象是需要反复创建的,不能单提出来,否则执行一次之后,该连接被释放了,而没有创建新的连接,第二次就执行不下去了。
  2)脚本编写完之后,将该脚本所有import的类的jar包放在一个文件夹下,点击Run Time Settings的classpath,把所有jar包都添加进去。
  3)运行脚本,看看能不能成功执行,按照错误提示调试脚本。
  4)接下来,可以把需要变化的值进行参数化。如商户名和AESKEY。选中值,右键选择replace with a parameter,在parameter list功能里添加需要用到的商户和AESKEY的值,将商户参数的循环方式select next row选择unqie,update value on选择once,表示为个商户只取唯一的值。aeskey的select next row选择same line as merchant。
  5)接下来插入事物,把需要计算业务时间的代码前后都插入事物函数,如lr.start_transaction("pay");lr.end_transaction("pay", lr.AUTO);如果想更加详细的知道每一步操作的时间,可以多插入一些事物,如加密,解密,获取返回值等步骤均插入事物函数。
  6)如果需要并发执行,还需要插入集合点函数lr.rendezvous("pay");这样在场景里并发执行的时候,所有的虚拟用户会等到都准备好之后在一个时间点执行。

  7)接下来就是在场景里执行了。点击tools---create controller scenario。进入场景。并发10个用户执行5分钟。同时监控tomcat的日志。
  在并发的情况下,出现了一些问题,下面针对这些问题给出解决方案。
  遇到的问题1、在并发执行1分钟后,开始有报错,主要的报错是解密失败,同时tomcat挂了,不能在接受新的请求。
  找到问题根源:通过监控tomcat日志,发现后期有很多的报错日志是文件打开过多。
  严重: Socket accept failed java.net.SocketException: 打开的文件过多 at java.net.PlainSocketImpl.socketAccept(Native Method) at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:408) at java.net.ServerSocket.implAccept(ServerSocket.java:462) at java.net.ServerSocket.accept(ServerSocket.java:430) at org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:61) at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:352) at java.lang.Thread.run(Thread.java:662) 2013-5-16 11:38:46 org.apache.tomcat.util.net.JIoEndpoint$Acceptor run 2013-05-16 11:38:44,974 INFO [DefaultRequestDirector.java:586] - I/O exception (java.net.SocketException) caught when connecting to the target host: 打开的文件过多 2013-05-16 11:38:44,974 ERROR [CreditPay.java:167] - 信用卡支付失败 com.yibao.payapi.client.RequestApiException: 请求服务未正常返回[statuscode:404, text:<html><head><title>Apache Tomcat/6.0.29 -
  解决方案:由于建立SOCKET会占用一个系统句柄,效果类似于打开了一个文件。LINUX默认的最大文件打开个数是1024(可能不同内核版本不一样),所以如果并发太多连接时就会报错。需要修改文件打开数设置。
  当前设置最大打开文件数可以通过如下命令查看。    ulimit -n
  这个数字说明了一个普通用户能够在一个单独会话中所能打开最大的文件数目。注意。如果是root,以下操作不能使ulimit -n的输出增加。因为用户root用户不受这个ulimit限制。只有普通用户才会受这个限制。
  为了提高最大打开文件数到默认值1024以上, 需要在系统上修改2个地方。 在这个案例中, 我们将最大打开文件数增加到为65535(系统部给出的建议)。 所有的步骤需要root用户操作。
  1、/etc/pam.d/login 添加 session required     /lib/security/pam_limits.so
  2. 按照最大打开文件数量的需求设置系统, 并且通过检查/proc/sys/fs/file-max文件来确认最大打开文件数已经被正确设置。 echo 65535 > /proc/sys/fs/file-max
  3、在/etc/security/limits.conf文件中设置最大打开文件数,添加2行内容:
  * soft nofile 4096 * hard nofile 4096
  解释:下面是一行提示
  #<domain>      <type>  <item>         <value>添加如下这行。 * - nofile 2048 这行设置了每个用户的默认打开文件数为2048。 注意"nofile"项有两个可能的限制措施。 就是<type>项下的hard和soft。 要使修改过得最大打开文件数生效,必须对这两种限制进行设定。 如果使用"-"字符设定<type>, 则hard和soft设定会同时被设定。
  硬限制表明soft限制中所能设定的最大值。 soft限制指的是当前系统生效的设置值。 hard限制值可以被普通用户降低。但是不能增加。 soft限制不能设置的比hard限制更高。 只有root用户才能够增加hard限制值。
  遇到的问题2:在虚拟用户少的时候并发没有再出现文件打开过多的错误,在并发量达到30,运行时间达到3分钟的时候,有报错:HTTP-500
  找到问题根源:通过查看tomcat和程序的日志,看到有大量的http-500的错误,是nginx已经拒绝了请求。
  解决方案:修改nginx配置文件
  vi /etc/nginx/nginx.conf
  events {
  worker_connections 1024;
  }
  调整为
  events {
  worker_connections 65535;
  }

 最后附上我写的信用卡支付的脚本:
/*
* LoadRunner Java script. (Build: _build_number_)
*
* Script Description:
*
*/
import lrapi.lr;
import http.HttpClient4;
import http.HttpParameter;
import http.HttpResp;
import http.JsonUtil;
import http.Testcredit;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.methods.PostMethod;
import java.util.Random;
import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import com.yeepay.g3.utils.common.encrypt.AES;
import com.yibao.utils.des3.RSA_Encrypt;
public class Actions
{
public  String aes;
Date d = new Date();
Testcredit tc = new Testcredit();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
HttpParameter parameter = new HttpParameter();
public int init() throws Throwable {
String url = "http://xxxxx/xxxxx/consult";
HttpClient4 client =HttpClient4.createDefault();
String data = "";
Calendar now = Calendar.getInstance();
now.setTime(d);
String dateline=format.format(now.getTime());
System.out.println(dateline);
Date date = format.parse(dateline);
String dates=date.getTime()/1000+"";
System.out.println(dates);
try {
data = AES.encryptToBase64(dates, "<aes>");
} catch (Exception e) {
e.printStackTrace();
}
parameter.add("data", data);
parameter.add("merchantaccount", "<merchant>");
HttpResp resp = new HttpResp();
try{
resp=client.doPost(url, parameter, "utf-8");
String respStr= resp.getText("utf-8");
System.out.println(respStr);
aes=AES.decryptFromBase64(respStr, "<aes>");
System.out.println("aes="+aes);
} catch (Exception e) {
e.printStackTrace();
}
client.shutdown();
return 0;
}//end of init
public int action() throws Throwable {
StringBuilder sb = new StringBuilder("");
Random rd = new Random();
for(int i=1;i<=6;i++){
int sr=rd.nextInt(9);
sb.append(String.valueOf(sr));
}
String key=sb.toString();
int rds=rd.nextInt(999999);
lr.start_transaction("pay");
lr.rendezvous("pay");
HttpClient client = new HttpClient();
PostMethod method = new PostMethod("http://xxxxxxxx/xxxxxxx/api/bankcard/credit/pay");
System.out.println(aes);
String PUBLIC_KEY=aes;
System.out.println("PUBLIC_KEY"+PUBLIC_KEY);
String encryptkey = "0123456789"+key;
String merchantAccount = "<merchant>";
//民生
String cardNo = "6XXXXXXXXXXXXXX";
String validthru = "XXXX";
String cvv2 = "XXX";
String phone = "13466745431";
String orderId = rds+"334234223"+key;
System.out.println(orderId);
Integer transtime = (int)(System.currentTimeMillis()/1000);
Integer currency = 156;
String  amount = "50";
String productcatalog = "1";
String productName = "123";
String productDesc = "小丸子";
String userIp = "123.45.45.45";
String identityId = "a";
Integer identityType = 6;
String other = "eeee";
String data = "{\"merchantaccount\":\"" + merchantAccount
+"\",\"cardno\":\"" + cardNo
+ "\",\"validthru\":\"" + validthru
+ "\",\"cvv2\":\"" + cvv2
+ "\",\"phone\":\"" + phone
+ "\",\"orderid\":\"" + orderId
+ "\",\"transtime\":" + transtime
+ ",\"currency\":" + currency
+ ",\"amount\":" + amount
+ ",\"productcatalog\":\"" + productcatalog
+ "\",\"productname\":\"" + productName
+ "\",\"productdesc\":\"" + productDesc
+ "\",\"userip\":\"" + userIp
+ "\",\"identityid\":\"" + identityId
+ "\",\"identitytype\":" + identityType
+ ",\"other\":\"" + other + "\"}";
data = AES.encryptToBase64(data, encryptkey);
try {
method.setParameter("merchantaccount", merchantAccount);
method.setParameter("data", data);
method.setParameter("encryptkey", RSA_Encrypt.encrypt(encryptkey, PUBLIC_KEY));
client.executeMethod(method);
System.out.println(method.getStatusLine());
String respStr = method.getResponseBodyAsString();
System.out.println(respStr);
String result = AES.decryptFromBase64(respStr, encryptkey);
System.out.println(result);
method.releaseConnection();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();}
lr.end_transaction("pay", lr.AUTO);
return 0;
}//end of action
public int end() throws Throwable {
return 0;
}//end of end
}
相关文章:
性能测试分享—JMeter篇

posted @ 2014-01-03 13:42 顺其自然EVO 阅读(417) | 评论 (1)编辑 收藏

用python做测试实现高性能测试工具(2)—优化代码

 在上一篇中我们通过换python的解析器来优化性能。但离实际需求还很远。
  方案2: 优化代码
  工欲善其事,必先利其器。要优化代码,必须先找到代码的瓶颈所在,最土的方法是添加log, 或者print, 调试完成还需要删除,比较麻烦。python里面也提供了很多profile工具:profile, cProfile, hotshot, pystats, 但这些工具提供的结果可读性不是很好,不够直观的一眼就能看到那个函数或者那一行占用时间最多。 python line_profiler 提供了这样的功能,可以很直观的看到哪一行占用的时间最多,可谓“快准狠”,下载地址: http://pythonhosted.org/line_profiler/
  安装完line_profiler后,在C:\Python27\Lib\site-packages 目录下会有一个kernprof.py,在可能存在瓶颈的函数上添加 @profile, 如以下例子:
@profile
def create_msg2(self,H,msg):
li = msg.keys()
msg_type=li[0]
ULR_avps=[]
ULR=HDRItem()
ULR.cmd=self.dia.dictCOMMANDname2code(self.dia.MSG_TERM[msg_type])
if msg_type[-1]=='A':
msg=msg[msg_type]
self.dia.setAVPs_by_dic(msg_type,msg,ULR_avps)
ULR.appId=H.appId
ULR.EndToEnd=H.EndToEnd
ULR.HopByHop=H.HopByHop
msg=self.dia.createRes(ULR,ULR_avps)
else:
self.dia.setAVPs(msg_type,msg,ULR_avps)
ULR.appId=self.dia.APPID
self.dia.initializeHops(ULR)
msg=self.dia.createReq(ULR,ULR_avps)
return msg
  运行此文件: kernprof.py -l -v D:\project\mp\src\protocols\libdiametermt.py, 得到如下结果。 从这图中可以很直观的看到setAVPS方法占用了96.6%的时间,再进一步定位到此函数,再次添加@proflie修饰符(可以一次在多个函数上添加Profile), 可以再进一步看到setAVPS函数中各行代码的占用时间比。
  通过一步步的分析中看到,开源协议库中,setAVPS的方法中,查找avp的属性是从一个3000的循环里面查找的,每个AVP都需要循环3000次,一个diameter消息中至少10个avp,每次encoding一个avp需要循环3W次。 我们初始的解决方法是删除了很多我们性能测试中用不到的avp(没办法,测试开发资源有限,很多时候没有很好的设计,先做出满足需求的东西再说。), 但也只是提高到了150左右,离需求还差的很远。所以我们把AVP都改成了字典方式,可以根据名字快速查找到AVP的属性。
  除了代码的优化,同时还增加了encoding avp的线程数,后面章节将会讲到多线程和多进程,对性能的影响。
相关文章
用python做测试实现高性能测试工具(1)—序

posted @ 2014-01-03 13:42 顺其自然EVO 阅读(430) | 评论 (1)编辑 收藏

RFS的web自动化验收测试—介绍篇

 引言:什么是RFS——RobotFramework+selenium2library,本系列主要介绍web自动化验收测试方面。
  == RobotFramework的一些特性==
  易于使用,采用表格式语法,统一测试用例格式;
  重用性好,可以利用现有关键字来组合新关键字;
  支持变量;
  支持创建基于数据驱动的测试用例。
  结果报告和日志采用HTML格式,易于阅读;
  提供标签以分类和选择将被执行的测试用例;
  平台、应用无关;
  功能全面,支持WEB测试(Selenium)、Java GUI 测试,启动线程、终端、SSH等;
  易于扩展,提供了简单API,用户可以自定义的基于Python或者Java的测试库;
  易于集成,提供了命令行接口和基于XML的输出文件;
  易于与版本管理集成;
  ==RobotFramework的架构方案==
  ==RobotFramework的中文支持==
  由于初始并不支持中文,于是在生成测试报告的时候对于中文的关键字无法识别,使用下面的方法可以正常显示中文。
  在[PythonDir]\Lib\site-packages\robot\utils下的encoding.py文件中,找到def _get_output_encoding(): 原来的编码是’cp437’ 将其改成’ cp936’(简体中文,gbk) 。
  ==目前robotFramework支持的测试库==
  下面这些是可以在robotFramework上支持的测试库,但是要独立安装程序。在安装之后,使用的时候要单独加载测试库。
  SeleniumLibrary - A web testing library that uses popularSelenium tool internally.
  watir-robot - A web testing library that uses popularWatir tool via theremote library interface.
  WatinLibrary - A web testing library that usesWatin tool (a .NET port of Watir) via theremote library interface.
  SwingLibrary - A Swing GUI testing library.
  EclipseLibrary - A library for testing Eclipse RCP applications using SWT widgets.
  AutoItLibrary - Windows GUI testing library that usesAutoIt freeware tool as a driver.
  DatabaseLibrary (Java) - A test library that provides common functionality for testing database contents. Implemented using Java so works only with Jython.
  DatabaseLibrary (Python) - Another library for database testing. Implemented with Python and works also on Jython.
  SSHLibrary - A test library that enables SSH and SFTP.
  HTTP test library using livetest
  HTTP test library using Requests
  How-To: Sikuli and Robot Framework Integration - This is not really a library but these instructions explain how to integrateSikuli tool with Robot Framework

posted @ 2014-01-03 13:40 顺其自然EVO 阅读(354) | 评论 (0)编辑 收藏

QTP的对象识别技术

 在我们在做自动化的时候,经常会遇到的一种情况就是,在同一个页面里, 出现相同类型和名称的对象时,一般需要依赖额外的属性来区分这些相同的对象。
  在QTP 里共有3类这样的顺序标识。
  1. 顺序标识(Ordinal Indentifiers):[location \ Index \ CreationTime]   其中CreationTime 仅适用于Browser对象
  这些顺序标识一般用在描述性编程里面 例如:
'采用Location 是 按对象位置的从上到下的
Browser("").Page("").WebEdit("name:=qtp","location:=2").Set "Eric_1991"
'采用Index 是按对象的位置从左到右的
Browser("").Page("").WebEdit("name:=qtp","index:=3").Set "Eric_1991"
'CreationTime 顺序标识仅能用在Browse对象, 按浏览器的进程产生的时间先后顺序排列
SystemUtil.Run "iexplore.exe", "http://www.HP.com" '这个时候CreationTime 的值是0
SystemUtil.Run "iexplore.exe", "http://www.baidu.com"  '这个时候CreationTiem的值是1
Browser("creationtime:=").Highlight '高亮显示的是HP.com的浏览器
Browser("creationtime:=").Highlight '高亮显示的是baidu.com的浏览器'
  QTP 在碰到对象识别问题的时候,会尝试应用智能识别(Smart Identification)。 如果智能识别能定位到对象,那么脚本就继续运行,否则就会提示错误
  在 对象的智能识别设置  Base Filter Properties  里会进行第一乱的 对象属性的匹配,如果Base Filter Properties 里面的属性不能够定位到该对象,那么QTP就会到该对象的Optional Filter Properties 里面的属性进行逐个去匹配 ,直到能定位到该对象位置, 否则就会发生对象找不到的错误

posted @ 2014-01-03 13:40 顺其自然EVO 阅读(418) | 评论 (0)编辑 收藏

Bug相关属性及等级

 bug一般拥有以下属性:
  重现环境:描述缺陷如何重现?或者说是重现该缺陷的具体操作步骤。
  浏览器:针对B/S架构的系统要描述浏览器的版本。
  操作系统:bug出现的操作系统。
  bug类型
  1.可以按照代码出现的原因划分(代码错误,设计缺陷,界面缺陷,安装部署原因)
  2.可以按照缺陷的类型划分(功能,易用性)
  缺陷等级
  根据需要划分:一般5级已经很完整
  建议:增加用户的体验以及使用起来更方便的建议类型的缺陷。
  轻微:一些不影响系统正常使用的缺陷,如错别字等。
  一般:输入输出,不规范,辅助说明或者描述不够准确的。
  严重:功能未正确实现的,输入输出错位的。
  致命:导致系统崩溃,内存泄露等。
  严重度:(处理的优先级)
  分为低,中,高,紧急
  缺陷状态:
  new:新发现一个缺陷。
  open:确认后打开。
  reopen:修改后经验证尚未改正的。
  rejected:开发人员认为不是缺陷,或者描述不清楚的,此时需要对缺陷回执的原因进行说明。
  fixed:bug修改后尚未被测试的。
  closed:缺陷被修改并被验证后的。

posted @ 2014-01-03 13:39 顺其自然EVO 阅读(486) | 评论 (0)编辑 收藏

仅列出标题
共394页: First 上一页 163 164 165 166 167 168 169 170 171 下一页 Last 
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜