标签归档:测试

Eclipse插件TPTP-程序Profile与分析工具详细教程

来源:http://blog.csdn.net/zq602316498/article/details/38796095

TPTP简介

Eclipse Test & Performance Tools Platform 是Eclipse的一个顶级工程(Top-Level Project),TPTP项目封装了一大堆公共的操作接口与数据,甚至一个远程执行环境,以供其它的TPTP工具使用。另外,它还提供了扩展点以方便进 行定制编码。实际上就是一个依托于Eclipse的JAVA的Profile与分析工具。可以进行程序执行时间的统计分析、内存的监控、对象调用的分析 等。

TPTP插件安装

下面简单说一下安装和使用的步骤:

首先登陆tptp插件的官方地址:http://www.eclipse.org/tptp/

点击图中的最新版本“TPTP 4.7.2”,打开下载页面。

此时我们有两种安装方式全安装和以插件方式安装。

全安装TPTP all-in-one package 的安装方式,里面包含了整合了TPTP的完整的Eclipse软件,下载下来以后直接解压打开Eclipse 就可以使用。

插件方式的安装即 TPTP Plugins for Eclipse 只包含了TPTP插件,需要自己手动安装。最新版TPTP-4.7.2只支持 Eclipse SDK 3.6.2,因此你必须使用这个版本的Eclipse才可以,TPTP依赖的运行环境和插件都需要自己手动下载并安装。

强烈建议选择全安装的方式,这样安装过程中会遇到较少的问题。笔者就是因为自己手动安装,出了好多问题,折腾了半天只好改用全安装的方式。

all-in-one package 下载完成之后,解压到任意目录,打开Eclipse,可以看到如下图中所示的profile按钮,就表示可以使用profile的功能了!

使用TPTP分析Java程序

执行时间分析

选中某一Java程序,点击右键,选择【Profile As】->【Java Application】选项,打开分析配置菜单:


在弹出的配置菜单中,选择【Profile Settings】选项,选中【Execution Time Analysis】选项,点击【OK】。此时Java程序会自动执行,并且tptp会记录其执行的过程。(这个过程要比单纯的执行程序要慢很多 --)

Collect method CPU time information:剖析器都可以收集 CPU 花在执行剖析方法的时间。这不同于上述的任何一种方法,因为 I/O 与等待时间并没有包含在 CPU 时间之中。

当程序执行完成之后,会自动弹出tptp的【Profiling and Logging perspect】窗口,我们可以看到分析完成后的数据表。

此时tptp会自动给出时间消耗前十的方法,并给出详细的调用时间信息。我们可以通过这些信息来判断程序中哪些地方存在着性能问题,进而有的放矢的进行优化。

图中各列指标的含义如下:

Session summary 项提供了拥有最高基底时间的最重要十种方法的概述。但是,所有的数据都是从 Execution Statistics 项中获得的。在这里您可以找到关于方法执行及其统计的具体信息:访问的时间,平均花费的时间,累积的时间等等。

Average Base Time:它是完成一个方法所需要的平均时间。所以,平均看来,这就是一个方法需要完成单个革新所需要的时间(如上面所述的那样,它排除了该方法调用子方法所需要的时间,更具体的说,排除了未筛选子方法的时间)。
Base Time:这就是完成一项方法所需要的总体时间。这就是我们花在该方法上所有时间的混合体(排除了对其他未筛选方法的调用)。

Base Time
For any invocation, the base time is the time taken to execute the invocation, excluding the time spent in other methods that were called during the invocation.

这个时间是执行这个方法是消耗的时间, 不包括这个方法里面调用其他子方法的时间。  例如方法A, 里面调用方法B, 方法c 各一次, 同时调用方法d10次, 那么这个base time 时间是不包括  对方面b,c,d等等的时间调用的时间。 就是纯粹花在方法A的时间
Cumulative Time:累计 CPU 时间代表了花在执行特定方法之上的总体 CPU 时间。但是,JVM 提供的数据的组成性变得更加粗糙,但是却更需要它。结果,如果时间要少于 JVM 所报告的单个特定平台的单元,那么 CPU 时间可能报告为零。同样,CPU 时间不会考虑其他类型的性能瓶颈,例如那些涉及到的交流类型以及 I/O 访问时间。

结论是,基底时间通常可以当作性能瓶颈降低的工具。

Cumulative Time
For any invocation, the cumulative time is the time taken to execute all methods called from an invocation. If an invocation has no additional method calls, then the cumulative time will be equal to the base time.

这个时间就是 执行一个方法上的总的时间,  包括方法调用若干子方法的时间等。

 

Average  xxx 时间    是这个方法的相关时间   / 调用次数的时间

 

总的来说,平均的基底时间好像是决定什么方法降低系统速度的关键数据点。但是,虽然平均基底时间可能会精确指出花费长时间执行的方法,但是并没有考 虑到访问一个方法的次数。对比一下:一个只运行一次的方法并花费 5.0 秒,或者另一个运行 1000 次并花费 0.5 秒?第一种方法的平均基底时间是 5.0 秒,而第二个方法的平均基底时间是 0.5 秒。但是,第一种方法的基底时间是 5.0 秒,而第二种方法的基底时间是 500 秒。将程序的运行时间降低 500 秒要比仅仅降低 5 秒显著的多。因此您可以毫不犹豫地说出,由于基底时间差异的存在,第二种方法要比第一种方法获得更多的关注。因此基底时间是降低一个程序中性能瓶颈的主要 关注点。因为基底时间代表了整个程序运行的混合物,通常所说的降低基底时间就相当于说降低运行时间。

当基底时间只代表了执行方法本身所花的时间(除了对其他方法的访问),累计时间则代表了执行一种方法所花费的总体 时间,包括子访问。所以,举个例子,在单一线程的程序之中, main(…) 方法的累计时间相当于程序中所有其他方法的所有基底时间的总和,因为 main(…) 方法就是程序的起始点,因为它就是所有方法访问的起始点。因此,它就相当于总体的程序运行时间。

在对执行统计数据有了详细的理解之后,让我们看一下分析性能问题的具体形式。为了得到调用什么特定方法的更好理解,以及特定的方法是从哪里调用的, 双击 Execution Statistics 项中想要的方法。这将会打开 Method Invocation Details 项,如下图所示。

Method Invocation Details 项就是每一个方法的统计数据。

项中的第二个表是 Selected method is invoked by,这将会列出程序运行期间访问选择方法的所有方法。

第三个表, Selected method invokes,将会列出选择方法所访问的所有方法。

 

接下来需要注意的一点是 Call Tree 项,当您剖析 Execution Flow 剖析选项时它才可用。

Call Tree 项会为访问特定线程的所有方法分解访问调用。

表格中的第一层次项目是程序运行期间展开的线程。

在它下面是方法调用的混合体,以及树形结构前面层次所访问方法的下一个层次的方法。

在最顶级的层次上,每一个线程的 累计时间 代表了线程在程序中运行的总体时间。那些拥有更高累计时间的线程,就是分析和优化的潜在对象。

Percent Per Thread 字段代表了执行一个方法所花费的总体时间,它用执行线程所花费总体时间所占的百分比来表示。它代表了一个最顶级方法对线程调用的总体累计时间(就是花在执 行线程上的总体时间)。它还提供了其他的统计数据,例如完成对线程执行方法的最大时间,最小时间以及平均时间,以及访问的总体数量。
在顶部的访问树表之下,是方法调用栈的表格,它显示了访问树表中当前所选中项目每一个方法调用的栈的内容。可得到栈的数量,与所列出访问的数量相等。在向分析特定的方法调用实例时这一点十分的重要。
最后,您可以右击方法条目并从任意的视图中选择 Open Source。如果相关的 Java 文件出现在工作区中,工作台文件将会打开,而方法定义也会得到定位。当性能瓶颈得到识别之后,您就可以编辑它们,然后再次进行剖析以查看它们之间的差异。

内存占用分析

选中这个选项,您就能够选择 Object Allocations 视图中的类,并识别这些对象是从哪些方法中创建的。选中 Track Object Allocation Sites 选项的唯一缺点在于,这会极大程度地增加生成的剖析数据的量。如果剖析性能受到了影响,或者工作台响应性受到了影响,那么可以考虑清除这些选项或者使用更新的筛选规则集来降低数据量。


Live instances :被引用的instance数量,instance没有被GC收集
Active size : Live instances 的Size
Total instances and total size:所有对象实例的数量和占用内存大小
Average age:age—GC的次数, Average age=(所有对象的年龄和)/(对象个数)

识别内存泄漏: Live instances相对比较大、持续增长、GC之后age 增长,可能存在内存泄漏,通过Alloction Details视图查看可能的泄漏位置。

线程分析

选择【Thread Analysis】可以对线程的行为进行追踪。

Thread Analysis 视图被分解为了三项 :
Thread Statistics:一个程序启动的每一个线程的统计数据表,不管这些线程是过去的还是现在的。列出的信息还包括线程表格;总体运行时间,等待时间以及堵塞时间;每一个线程堵塞和死锁的数量。
Monitor Statistics:提供了关于类统计数据的具体信息,包括私人监视类的堵塞和等待统计数据。
Threads Visualizer:提供了目标程序中由状态所剖析的所有线程的可视化代表。
所有视图中的线程是由线程组所组织的。线程分析视图中的数据只会在接收到新的线程时间的时候才会更新数据。如果它出现了就好像数据没有得到更新时,这是因为没有接收到新的线程事件,而数据仍然处于它的前一个状态之中。
列出的线程名就是传递给 Thread(String name) 构造器的名字,或者使用 Thread.setName 方法来进行设置。在目标程序中调用这种方法能更容易的识别线程。

线程统计数据是基于所有的 Java 线程来收集的,它包含了 VM 线程,并且可能包含了程序构造器或者程序框架所使用到的线程。幸运的是,您可以选择线程筛选图标(是一个中间黄色箭头划过垂直绿色线的三个箭头 ),来从视图中筛选出去那些您不感兴趣的线程,并清除掉那些不想要的线程。
七种线程状态分别是 :
运行
睡眠: 这种状态下清晰调用 sleep 方法
等待: 这种状态下清晰调用wait 方法,并等待在其监视对象上的 notify 或者 notifyAll 访问
堵塞: 对一个被对象堵塞实例的引用,该对象被另一个线程所使用(例如,一个线程在一个同步化的状态下维护对象监视器的线程)
死锁: 对于目标程序的每一个线程,在每一个线程的层次上收集统计数据。当两个或者更多的线程都含有资源时就会发生死锁现象,其中资源关系图包含了一个循环(这就是说,所有的死锁线程都需要它们所不能获得的额外资源,而不用释放需要资源的其他死锁线程 )。
停止
未知
在 Java 中,在很多种情况下都可以发生死锁现象,例如 :
在两种线程中,两个类中的同步化方法会试着调用同步化的方法。
当一个线程同步化资源 A 并试着在第二个资源 B 上进行同步化,同时第二个线程同步化资源 B 并试着同步化资源 A 时就会发生死锁现象。

Thread Statistics

该项列出了程序的整个生命周期内,当前所运行的所有的线程。线程就算在程序终止以后仍然停留在表格之中。该视图列出了运行时间、等待时间以及堵塞的时间。其中 运行时间 被定义为线程的总体运行时间,减去等待或者堵塞之后的时间。等待时间 被定义为线程花在等待监视上的时间,而 Blocked time 就是线程花在被其他线程监视器拥有权堵塞上的总体时间。另外,还有一些记录的数量 :堵塞数量 以及 死锁数量 分别是线程生命周期之内线程堵塞或者死锁的次数。

Monitor Statistics

Thread Analysis 视图中的第二项是 Monitor Statistics,如下图所示。Java 中所有的对象都有一个相应的监视器,这是 Java 中所有并发操作的基础。当您进入到一个同步化块的内部时,就会调用监视器,或者在调用 wait 或者 notify 方法时,会分别等待可用性的附属或者信号。该项提供了线程-线程基础之上的监视器状态

Thread Statistics 表格包含了剖析程序中的一系列线程,以及来自首项的线程的各种统计数据。选择 Thread Statistics 表格中的一个线程,来显示线程所引用的监视器,包括这些监视器的各种统计数据。然后您可以选择监视器以打开关于其类的信息,包括监视器访问者的块与统计数 据,还有计时与对象信息。这就支持您去识别特定的对象。

Threads Visualizer

在如上图所示的 Threads Visualizer 项中,线程状态由变化的背景栏和线性模式代表。线程根据线程组和线程名来分组。图的 x 轴代表了时间,它的范围可以使用放大或者缩小按钮来进行调整。

表格的每一行都包含了一个代表线程执行情况的工具栏。在每一个栏中都是事件的持续性列表,它代表了线程状态的更改。您可以双击一个事件以在 Call Stack 视图中显示它的访问栈,而且您可以使用 Threads Visualizer 项右上角的 Select Next Event 和 Select Previous Event 按钮,来从一个事件移动到另一个事件。
在图中, Waiting 和 Blocked 状态是由点线代表的,而 Deadlocked 与 Stopped 状态是由一条实线表示的。对于识别性能问题的程序开发员来说,最重要的是 Deadlocked (红色), Waiting (橙色)与 Blocked(黄色)。
一个重要的 UI 注意点:当一个线程终止,它会继续在表格上维护一个暗灰色的代表(而不是从图表中完全地消失掉),可能与预期的行为相反。

线程分析工具栏上的按钮用于将注意力转自或者转至特定的线程。从左到右,,按钮分别是:Legend, Show Call Stack, Reset Timescale,Zoom In/Out,Select Next/Previous Event,Select Next/Previous Thread,Group Threads, Filter Threads 以及 Visualize Thread Interactions。它们中的大多数是不言自明的:例如, Next/Previous Thread 按钮会更改当前选中的线程,而 Select Next/Previous Event 按钮则会将游标移动到下一个项目,或者当前选中线程的前一个事件。另外,您可以根据自己的需要来分组并筛选线程。

当您使用线程剖析功能时,有几点您需要进行考虑一下 :
对于处于工作-睡眠循环状态下的线程,它需要多长的时间来完成循环的工作阶段,又需要多久的时间来完成睡眠阶段呢 ?
对于独立于外部性资源的线程来说,它们堵塞了多长时间以等待可用的资源 ?
在输入-处理-输出型的程序中,例如 Web 程序,不同的线程需要多成的时间以响应用户输入,处理数据,以及产生相应的输出 ?
有一些线程会阶段性地工作,以检查一种状态或者执行一项功能,然后返回至睡眠状态。线程分析允许您使用 Threads Visualizer 来观察这些关系。
您可以使用剖析功能来监视生产者-消费者和读者-作者关系。
线程剖析功能提供了各种的视图,来分析程序线程的性能与行为。这些视图允许您去收集信息,并分析程序执行的各个方面,以得到失败状况的潜在性瓶颈。

筛选

在选择剖析按钮之前,适当的筛选规则应该已经就位,这一点非常重要。大量的剖析数据是作为剖析过程的一部分生成的,因为每一个单个的方法调用,对象分配或者线程事件,都需要生成、转移和处理一个事件。
剖析数据的净数量有时可能是巨大的,不论是对于执行程序来说,还是对于工作台本身来说,如此巨大的数量都是吃不消的。但是,这些数据中只有一部分对于分析 目的是有用的。幸运的是,剖析的数据提供了一个方法去筛选去除掉一些不相关的信息,这样您就可以为剖析程序降低代理数据的量。
例如,在剖析一个 Java 程序的过程中,您可能只关注那些您的程序的方法,以及一些不在执行时间之中的像 java.*、sun.* 等等标准 Java 语言包。使用特定于程序中类的一种筛选非常重要,它可以尽可能多地从外部类中降低剖析的工作负荷。
通过双击【Java Profiling -JRE1.5***】可以打开筛选设置窗口来进行设置,如下图。

在服务器端测试应用程序的性能

当然也可以对WEB系统进行测试,笔者没有使用过这方面的功能,只能找了点资料简单介绍一下步骤,只能是提供一下思路,具体能不能用还要以后有时间去实践。

1、在Eclipse中新建“Dynamic Web Project”(JavaEE视图)。
2、在项目中新建JavaBean和JSP,以tomcat自带的numguess.jsp为例。
3、在Eclipse中新建Server配置,选择tomcat5.5。
4、运行示例程序。
5、在系统环境变量PATH后添加:%Eclipse%\plugins\org.eclipse.hyades.execution._%Version%
6、重启Eclipse。
7、右键点击JSP文件,选择Profile As /Profile on Server。
8、在Profile on Server对话框中添加要测试的类。
9、分析测试结果。

测试的几个工具

测试几个简单工具, 尽管简单但是非常必要, 简单才易用, 易用才好用,好用才有效果!

不是说其他工具不好, 下面的一些方法,基本不需要进行任何培训, 可以让您的很多人员 立马成为合格的测试人员, 比如您的会计可以立即成为测试员进行测试, 比如您的产品经理可以立即参与您的测试等等。

若是学习一套教程后在进行测试, 那么您至少也要招聘到愿意学习的人, 然后让他学习一个星期或者几天。。。。

1. 测试第一工具  截图

各种测试, 都要测试出bug为目的, 测试出bug后一定要告诉相关开发人员, 你如何告诉他们? 时间长了,他还如何记得。另外你是否真的了解你的测试情况,你的测试环境,操作系统环境等等。。。

因此截图是测试的第一工具, 他能记录你想不到, 记不住的, 复杂的, 难说的。。。。 等等各种词汇吧, 总之还是截图!!

截图一定要向大截, 不要仅仅截图一小点, 这样信息太少,会丢失非常重要的信息,最好您截全屏的图, 全尺寸, 信息最多, 这些信息都会对程序员有帮助的。 那些信息没有帮助测试人员一般不知道的, 因此全屏图示最有效的。

截图时,为了更好说明问题, 最好还要在截图中, 用特殊的区域,甚至文字表述问题发生时的情况, 区域,显示等  因此有些专门的工具是用来在图片中 标示特殊区域的

再有有条件的话 可以录屏, 这样程序员就知道您是如何操作的了, 不过这个有点麻烦。

2. 测试第二工具 word或者excel

测试出bug总是要修改的, 修了后, 还要测试人员在检验一下, 时间了长了, 截图也多了, 总是会遗忘等等,因此完善的记录就非常重要了。

word和excel是必备的办公工具了,大家都会用, 到处都能打开, 都不用培训, 因此用他们做记录最方便, 最简单, 最快捷。

定期将发现的bug整理到word或者excel中 然后跟踪bug的修复情况, 然后进行验证,是个很好的办法

3. F5(屏幕刷新)

测试中一个重要的项目就是压力测试, 有很多程序员写的程序, 根本承受不了压力, 一有访问就会访问数据库,压力大了, 数据库马上成为瓶颈。一般压力测试很多人会选择 loadrunner或者jmeter等等工具。

个人感觉这些工具, 学习时间长, 架设不方便, 还得录制脚本,培训等等, 比较麻烦, 最简单实用的 就是我们键盘上的F5了, F5就是刷新,至少在ie下是的, 您点击了刷新, 浏览器会不断请求服务器,瞬间造成很大的压力,有问题马上就发现了。

一个人压力不够,可以多人同时 F5进行刷新了。

另外刷新有时候会重复提交表单, 正好测试服务器的表单重复提交问题!!

4. 乱输入

这个勉强算是一个工具吧, 但是他非常有用, 绝大部分程序员的代码里面 的容错代码很差, 然后他也根本考虑不到测试时用一些特殊的情况进行测试,因此我们在有输入的地方可以 输入乱七八糟的东西, 很快就会发现系统中出现莫明其妙的事情了, 然后你可以截图报告了。

一般好的程序中, 有50%以上的代码是处理一些异常情况的, 这些异常情况包括这些乱输入的情况

5.QQ

 

没错就是QQ, QQ是聊天的, 怎么成为工具了?  您若是测试出再多的bug, 若是不告诉开发人员, 他若是不修改, 也没啥用。 您若是写邮件给开发人员, 可能开发人员下班后或者第二天才来看到, 您那个时候也许忘记些东西了!!

您若是打电话给开人员,没办法把截图传递给程序员, 因此qq是非常方便的工具了!!

他的截图非常方便, 他的截图中 有非常方便的图片编辑功能, 您可以标注各种带颜色的区域, 添加箭头指出问题, 添加文字描述等等。

这些都弄好了, 截图可以直接发到qq群里面, 开发人员会及时看到, 产品会看到, 经理会看到, 大家都看到!  有事情大家会及时问您!!

这样一个交互的处理过程就来了。

当然汇总和跟踪还是非常必要的!!!

 

上面这些工具就是 让更多人能快速参与到测试中,可以快速形成生产能力, 那么其他的正规测试工具也是可以慢慢来的, 等您团队中越来越多的人会使用正规的工具时能力也可以有很大提高。

不过我还是坚持我的观点, 简单易用, 易用好用, 好用有效, 全民皆兵,才有生产力。

 

下面是我收集的一下  测试教程, 包括测试理论, 方法, 工具的 , 大家没事可以慢慢看看了!

http://pan.baidu.com/s/1jGGIEUE    9b78

软件测试简要

原创,转载请保留原文url地址

一 什么是测试

1. 什么是测试

最通俗的说就是检验被测试的软件或者产品是否符合要求。

在具体一点就是检验在 什么条件 下符合要求

更具体一点就是检验在一些条件下符合要求, 超出这些条件后会不会有危害等

在更具体一点,就是 检验在一些条件下是否符合要求, 然后在这个条件下有一些不正常的输入或者扰动是否还能满足要求,并且不会有危害等

可以在继续想,还有那些等等不同扩展项目, 我初步估计做好这些就差不多了,再多成本太高

2. 被测对象的要求

被测对象的要求就是 被测试对象或者产品需要达到的功能,特定条件下的功能, 超出条件后也不能有危害的要求, 即使有些不正确的输入也要尽量满足要求的功能, 即使有些环境的影响也要能正确的本领。

这些要求,个人认为可以分为静态的一些要求和动态的一些要求

  • 静态要求, 就是静态的需求,就是程序或者功能展示界面等的 显示效果, 包括有多少显示页面, 每个页面如何显示, 哪里是文字, 文字大小, 哪里是按钮, 有多少个,这些都应该出现在程序的 需求说明书或者程序的效果图中。
  • 动态要求,就是动态功能, 就是程序各个页面如何切换的, 在那些条件下切换到那些页面, 那些条件不同后,显示不同,大小变化等等

这些都是测试要做的内容,但是不仅仅是测试要做的内容。

3. 被测对象产生的过程

这些东西, 需求提出者,通常都是买单的人要有一定的要求, 他可以没有具体的要求但是要有目标,有打算。

然后需求提出者要委托产品设计人员要进行规划设计,产品设计人员最后要提出上述两项,一个静态的要求,包括原型图, 效果图等等, 同时还要有动态的要求就是一些流程图, 一些说明等等 这些都要具备以后才能是比较完备的解决方案。

这个解决方案还要需求提供者进行相关的验证等等,否则后续的事情都要浪费了,同时这个时候测试人员就要介入了, 技术开发人员也要介入,但是他们仅仅是了解,做个预热。 除非有真的办不到的东西出现。

产品设计人员完成相关工作,一般会出效果图等, 然后技术人员会根据这些效果图进行,需求说明, 流程功能等进行相关开发等。开发中技术人员要不断的检验自己实现的东西是否符合相关要求,因此而展开必要的调试, 测试, 联调, 必要的单元测试, 以及系统的功能测试等。 在这个过程中,主要还是开发人员在进行,但是这个时候测试人员一般会同开发人员保持密切的联系, 并协助做好相关辅助测试等等。

开发人员完成相关开发后, 就要将相关产品进行提交,测试人员就要对这个产品进行检验,检验他符合相关需求的程度等等, 通过各种科学的,完善的手段来进行发现,探索等等

总结一下:  产品输出开发和测试的依据, 开发根据开发依据进行开发, 最后测试根据测试的依据, 对被测对象(技术开发的产品)进行测试。

这三者都做好了才能输出有效的产品。

试想一个汽车厂输出的汽车没有经过严格的测试,哪有人敢用。

一个财务软件没有经过严格有效的测试,哪敢用呀!

 

二 测试的分类

测试是一次实践活动也是一门科学, 测试方法分为很多,在不同情况下, 采用不同的测试手段和方法。

1. 根据对被测对象的了解程度可以分为:

  • 白盒测试, 就是考虑盒子是透明, 测试人员能从外面看到被测对象的里面, 这里有两层含义, 一是了解内部, 二是, 从外面看, 不是修改, 就是测试尽量不干扰被测对象的含义。 当然是尽量不干扰, 其实没有完全不干扰就是把干扰降低到最小。 白盒测试对测试人员的要求最深,成本最高, 时间最长。
  • 黑盒测试, 就是考虑被测对象是个黑盒子, 你没办法了解里面的东西, 你仅仅能根据需求说明书进行测试, 仅仅测试外部特性, 输入输出, 扰动, 环境等进行相关测试与检验。  黑盒测试用的最多, 成本相对较低。
  • 灰盒测试, 就是介于白盒和黑盒之间测试, 也较长采用。

2. 根据对被测对象的重点考察对象分为

  • 功能测试, 就是对被测对象的符合产品需求的程度进行测试, 包括显示, 逻辑等等
  • 性能测试, 就是对被测对象的性能指标进行测试与统计,例如一次相应要多长时间, 打开页面要多少时间等等
  • 压力测试, 就是检验被测对象在多大的压力(多少人用)下能正常工作, 多少压力后,他工作不正常了,在这些情况下是否有危害等等
  • 异常测试, 主要就是针对被测对象的不正确输入, 环境的异常情况进行测试,一般这个测试时非常重要的, 这些异常情况下产品都可能有问题。例如一个产品能否在北极下工作, 即使不工作也不能伤害到人,例如一个产品能否在热带工作, 及时不工作也不能自燃, 否则伤害人。
  • 兼容测试, 主要测试产品在不同设备,不同情况下的工作情况, 也可以考虑产品自身前后的兼容性, 产品的前一个版本同当前版本的情况。 比如一辆车放到车库了, 然后您发财了, 更换豪车,但是发现车库小了, 豪车只能在风雨中,嗨不兼容呀!!

类似的情况还有很多, 可以参考更多资料,下面是一个测试相关的资料可以供大家参考    链接: http://pan.baidu.com/s/1gdlaGYv  密码: dhjv

其实个人感觉, 资料里面的东西太科班了, 按照那个东西搞测试, 产品永远都发布不了,时间太长了。

就像小孩子学说话, 不是全部汉字都学会,学好才说话的, 他在刚刚会点就开始说话的, 他不管是否说对的, 就是说, 总之不断实践, 不断检验, 慢慢就成功了。 小孩子学走路也一样都是这样的。

因此产品, 开发,测试是很微妙的。

3. 根据产品开发的阶段可以分为

  1. 调试,感觉调试原则上不是测试的,但是应该是测试之前的必须进行的,一般程序都很难一下写完, 一下子没bug的, 可以看做测试的前传吧
  2. 单元测试, 单元测试一般都是程序员进行的, 单元测试是白盒测试, 一般是程序员进行,正常情况下是程序员自己写单元测试代码。 好一点的办法是程序员内部的另外程序员之间相互写单元测试代码,相互测试,这样可以避免测试中自己的思维定式在发生影响。
  3. 集成测试, 就是把各个模块等汇集到一起, 一块测试相关功能,重在测试相关模块配合。
  4. 内部测试,一般法就是单位内部相关人员或者其他人员进行的测试工作, 更多情况下是专门的QA团队,针对被测对象进行比较全面的测试工作。 这些测试主要包括:功能测试, 性能测试, 压力测试, 异常测试等等。 通过内部测试后对产品能否满足要求就基本心理有点数了。但是还不够
  5. 内部用户测试, 这里同内部QA的测试是不一样的, 一般是把单位内部员工或者一定的关系单位的人找到一起, 让他们模拟最终用户进行测试。这里的重点是模拟真实用户进行测试,了解用户体验等
  6. 外部用户体验测试, 就是在外面小范围选取一定的人员,让他们参与测试, 更大范围的了解用户的想法了解产品的情况等。

一般bs架构的产品 就需要1~4就可以了, 因为bs架构的产品是部署在自己的服务器上的, 就是发现了bug也可以快速修改, 然后部署, 不需要用户更新自己安装的东西(用户也没安装)。

单机产品和cs架构的东西需要1~6的步骤, 因为有些东西一旦下发,没办法收回的, 或者收回成本太高需要谨慎从事。

三 测试的成本

是不是很牛逼的测试人员就能把全部问题都给测试出来??然后就o了!!!

其实未必,甚至是办不到的,      其实被测对象可以看做为 y = f(x)

x就是被测对象的各种输入, y就是被测对象的输出, 也就是结果, f就是被测对象的功能。 要想完全的测试出相关功能,就需要对 全部x进行遍历,然后依次检验相关输出。

但是有时候, 你不完全了解 有些输入同 输出的关系!!

甚至有时候 x是个 无限的集合如何完全遍历。

另外, 往往, 系统的功能还要受到扰动的影响,因此系统模型可以模拟为

y = f(x, r1, r2, r3,....) 等等  r1, r2, r3 是系统扰动因素, 并且这些扰动有多少不确定。。。

因此完全测试是 不可能, 在牛的测试人员也做不到!!

那么正常的测试时什么      , 我个人认为测试时   在x的无限集合内选取一个  有限的集合 x1 ∈ X  就是在 无限的一个集合内选取一个真子集, 然后计算 y1 = f(x1)

牛一点的测试人员选取的x1会更有代表性,测试会更有针对性。

因此测试不是测试出问题越多越好, 要在测试的成本和测试的结果直接做好平衡。

最后, 来点干货,低成本,高产出的测试方法。

1. 测试同开发平行进行, 就是在开发人员刚刚开始开发就进行测试, 这个过程可能对金钱成本造成浪费, 但是对最宝贵的时间成本是有非常好的节省。 通过在产品需求阶段的参与, 开发阶段的提早参与, 可以更早的了解被测对象, 更早提醒开发人员甚至产品人员, 提早修改bug可以大量节省时间,以及资金成本。

2. 在产品开发初期早做异常测试, 在产品开发的早期, 一般仅仅开发出一些部分模块,没办法进行完整的测试, 因此这个时候进行异常测试, 通常异常情况下的程序处理开发人员未必考虑到, 这个时候可以早点发现, 但是开发人员未必有时间修改,但是早点发现, 在以后有时间时好进行修改, 这样也可以节省时间。

3. 早点做性能、压力测试,性能一旦不达标, 有可能早成软件较大的修改,甚至架构的调整, 因此早做,万一有问题好及时调整。

4. 测试尽量全面测试, 尽可能多的早点反馈各种测试结果

5. 详细记录测试过程和截图层, 这样便于程序员排查

6. 全民结兵, 尽早发动全部员工进行黑盒测试, 早点发现问题,早点解决

7. 专业的压力测试工具等进行详细的测试等

10. 没错,这里是10,缺少了8,9, 缺少的是  测试人员要做的其他测试, 这里的10是最后的测试。 最后的测试是回归的, 全面的测试,在产品最后发布前要把全部功能测试一遍, 重点bug要检验一下, 压力要检验一下, 部署环境要测试一下, 等等。。。。

 

 

 

压力测试工具Grinder

 

来源:互联网

Grinder是一个开源的Java负载测试框架,它通过很多负载注射器来为分布式测试提供了便利。

● 支持用于执行测试脚本的Jython脚本引擎。

HTTP测试可通过HTTP代理进行管理。

该项目主页:

http://grinder.sourceforge.net/

详细资料,软件下载,请浏览上面的主页

工具的使用:

第一步:设置环境变量

下载Grinder,并解压. Download page: http://grinder.sourceforge.net/download.html

设置系统环境变量:

GRINDERPATH=grinder的完整路径

CLASSPATH=%GRINDERPATH%\lib\grinder.jar

(在grinder的目录下新建一个目录叫properties并在该目录下新建文件grinder.propertiesGRINDERPROPERTIES=%GRINDERPATH%\properties\grinder.properties

有关配置文件请参考:http://grinder.sourceforge.net/g3/properties.html

第二步:如何启动ConsoleAgent process

设置好环境变量后就可以启动grinder了,grinder分为三个部分,分别是控制台(console)、代理进程(agent processes)和HTTP代理(HTTPProxy

启动的命令分别为:

Consolejava -cp %CLASSPATH% net.grinder.ConsoleAgent processjava -cp %CLASSPATH% net.grinder.Grinder %GRINDERPROPERTIES%

控制台不会去读grinder.properties配置文件,它有自己的设置会话窗口,你可用它设置会话地址和端口。控制台可以触发测试脚本,然后代理进程会产生工人线程进行测试。

Agent process启动后会自动连接控制台,相当于客户机连接服务器,所有的代理 进程由控制台统一控制,所以控制台只能启动一个,但代理进程可以启动多个并位于不同的机器上。控制台可以指定所有代理进程使用的测试脚本,如果控制台没有 指定代理进程要使用的测试脚本,代理进程会去读取自己本地的 grinder.properties配置文件中指定的脚本执行测试。

有关测试脚本的编写请参考:http://grinder.sourceforge.net/g3/tutorial-perks.html

第三步:使用TCP代理生成测试脚本:

如果你想创建一个用于网站或WEB工程的测试脚本,可以使用TCP代理。GrinderTCP代理简单的说就是截获用户在浏览器的操作,然后将其记录成脚本供测试使用。

启动代理的命令如下:

java -cp %CLASSPATH% net.grinder.TCPProxy -console -http > grinder.py

-console参数会显示一个简单的控制窗口,用于使TCP代理可以干净的关闭。这是必要的,要为一些终端的shell不允许JAVA进程干净的中断。

这条命令会启动GrinderHTTP代理并在当前目录生成脚本文件,文件名为grinder.py

启动后控制台会输出如下信息:

07-4-2 11:33:36 (tcpproxy): Initialising as an HTTP/HTTPS proxy with theparameters:

Request filters: HTTPRequestFilter

Response filters: HTTPResponseFilter

Local address: localhost:8001

07-4-2 11:33:37 (tcpproxy): Engine initialised, listening on port 8001

我们可以看到,其默认端口为8001,接下来我们设置浏览器的代理:

IE中打开设置窗口:Tools -> Internet Options -> Connections -> Local Area Network Settings->advanced... 按上面控制台输出的信息填入代理。(IE7可能操作步骤略有不同)

设置好之后清除IE的缓存,并将缓存大小设为最小,且选中每次都重新读取页面。

然后打开你要测试的网站或工程,你的操作会被自动记录到当前目录的grinder.py脚本中。

第四步:开始测试

一旦你记录了测试脚本,你有二种方法执行:

1、 你可以在每个Agent process的本地grinder.properties文件中用grinder.script参数指定要执行的脚本。例:

grinder.script. = grinder.py

2、 你可以在控制台分发你的脚本到每个Agent process, 然后运行。每个Agent process仍然需要其本机上的简单grinder.properties文件,只是不用指定grinder.script参数了。

选择要分发到客户端的脚本 > 分发脚本 > 测试执行中 >结果

如果有需要,你可以手工更改生成的脚本文件。

@@@@@@@@@@@@@@@@@@@@@@@

 

The Grinder试用记录一-脚本录制
The Grinder
是开源性能测试工具,用Java编写,其脚本语言用Jython编写,脚本编辑的界面不友好,但是脚本编写比较灵活,可以支持参数化和关联操作。跟openSTA一样,其脚本录制功能也可以录制dwr请求。支持分布式负载,测试过程中没有提供对服务器的监控方式。可以运行在windowliunx环境。脚本采用Jython,所以需要测试员有Jython经验,上手比较难。
http://grinder.sourceforge.net 网站下载The Grinder 3,解压后放到C盘下面,文件夹改名为grinder。该文件夹下面可以看到contribetcexamplelib文件夹,新建一个bin文件夹,用于存放生成的cmd可执行文件。
The Grinder
的脚本采用专用工具TCPProxy录制。具体步骤如下:
1
、编写一个setGrinderEnv.cmd文件,放在bin文件夹下面,用于设置环境变量,内容如下:
set GRINDERPATH=C:\grinder
set GRINDERPROPERTIES=C:\grinder\etc\grinder.properties
2
、编写一个startProxy.cmd文件,放在bin文件夹下面,用于启动TCPProxy,内容如下:
call C:\grinder\bin\setGrinderEnv.cmd
java net.grinder.TCPProxy -console -http > %GRINDERPATH%\grinder.py
pause
功能是录制http请求,把录制得到的脚本存储在grinder.py文件中。
3
、双击startProxy.cmd文件后,录制启动,出现一个java程序窗口 TCPProxy Console。在这个窗口,你可以控制停止录制,也可以随时给脚本加评论。打开浏览器,设置代理服务器的地址为127.0.0.1,端口8001,然后 地址栏输入被测试服务的url,进行录制,录制过程中,可以随时用“Insert comment”按钮在脚本中插入评论。录制完成后,点击窗口中的“Stop”按钮,录制停止。
4
、录制停止后,进入C:\grinder,找到文件 grinder.py,该文件就是录制得到的测试脚本。
The Grinder
试用记录二-分布式测试
The Grinder
的分布式测试操作很简单,步骤如下:
1
、客户端(192.168.0.101)建立一个C:\grinder\etc\grinder.properties配置文件,该文件是一个配置文 件,指定运行的测试脚本,运行的进程,线程数,循环次数,并指定分布式测试的控制服务器地址和端口(默认为6372,端口值可以通过 文件-选项 修改)。例如:
grinder.processes=2
grinder.threads=3
grinder.runs=4
grinder.logDirectory=log
grinder.numberOfOldLogs=2
grinder.consoleHost=192.168.0.100
grinder.consolePort=6372
grinder.useConsole=true
grinder.script=grinder.py
2
、控制端(192.168.0.100)建立一个startConsole.cmd文件并启动,启动后会出现一个“The Grinder控制台”窗口。文件内容如下:
call C:\grinder\bin\setGrinderEnv.cmd
java net.grinder.Console
pause
3
、客户端(192.168.0.101)建立一个startAgent.cmd文件并启动,文件内容如下:
call C:\grinder\bin\setGrinderEnv.cmd
java net.grinder.Grinder %GRINDERPROPERTIES%
pause
把测试脚本 grinder.py拷贝到和startAgent.cmd同一个文件夹下面。
4
、客户端启动后,会根据grinder.properties文件的配置连接控制端,连接上以后,控制端的 动作-启动进程 选项变成可选,点击该选项,客户端的测试进程启动,开始测试。测试过程中,控制端能看到各个测试项运行的状态。
5
、测试结束后,查看bin文件夹下面的log文件夹,可以看到各个测试进程,各个测试项的统计指标。
如果不想用分布式测试,把控制端和客户端都放到一个机器下运行就可以。
字号: 大  中  小
The Grinder
试用记录三-脚本编辑
如果懂Jython语法,那么操作脚本(包括参数化和关联)是非常简单的事情,下面这个脚本向blog.163.com发送一个dwr请求,并把response内容保存到文件。
from net.grinder.script import Test
from net.grinder.script.Grinder import grinder
from net.grinder.plugin.http import HTTPPluginControl, HTTPRequest
from HTTPClient import NVPair
connectionDefaults = HTTPPluginControl.getConnectionDefaults()
httpUtilities = HTTPPluginControl.getHTTPUtilities()
# To use a proxy server, uncomment the next line and set the host and port.
# connectionDefaults.setProxyServer("localhost", 8001)
# These definitions at the top level of the file are evaluated once,
# when the worker process is started.
connectionDefaults.defaultHeaders = \
( NVPair('User-Agent', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)'), )
headers3= \
( NVPair('Accept', '*/*'),
NVPair('Referer', 'http://blog.163.com/'),
NVPair('Accept-Language', 'zh-c'), )
url7 = 'http://blog.163.com:80'
# Create an HTTPRequest for each request, then replace the
# reference to the HTTPRequest with an instrumented version.
# You can access the unadorned instance using request101.__target__.
request1001 = HTTPRequest(url=url7, headers=headers3)
request1001 = Test(1001, 'POST UserBean.getProvinceAndCity.dwr').wrap(request1001)
class TestRunner:
"""A TestRunner instance is created for each worker thread."""
def page10(self):
"""POST UserBean.getProvinceAndCity.dwr (request 1001)."""
result = request1001.POST('/dwr/call/plaincall/UserBean.getProvinceAndCity.dwr',
'''callCount=1\n\
page=/\n\
httpSessionId=\n\
scriptSessionId=4FC528EBDD341FE22046F074D587F3733\n\
c0-scriptName=UserBean\n\
c0-methodName=getProvinceAndCity\n\
c0-id=0\n\
c0-param0=boolean:false\n\
c0-param1=boolean:false\n\
batchId=0\n\
''',       ( NVPair('Content-Type', 'text/plain'), ))
return result
def __call__(self):
"""This method is called for every run performed by the worker thread."""
result1=self.page10()     # POST UserBean.getProvinceAndCity.dwr (request 1001)
writeToFile(result1.getText())
def writeToFile(text):
filename = grinder.getFilenameFactory().createFilename(
"page", "-%d.html" % grinder.runNumber)
file = open(filename, "w")
print >> file, text
file.close()
参考资料:
1
、官方介绍资料:http://grinder.sourceforge.net/g3/scripts.html
2
Script API http://grinder.sourceforge.net/g3/script-javadoc/index.html
3
、官方例子:http://grinder.sourceforge.net/g3/script-gallery.html
4
Jython学习资料:https://www6.software.ibm.com/developerworks/cn/education/java/j-jython2/tutorial/
* grinder.properties
参数设置详解 http://grinder.sourceforge.net/g3/properties.html
*****
小整理
.脚本录制
1.
设置代理HTTPSSL选择localhost 端口8001
2.
脚本录制java net.grinder.TCPProxy -console -http>xx.py
3.
执行USECASE 点击STOP完成脚本录制
.执行脚本
1.
打开CONSOLEjava net.grinder.console
2.CMD
到脚本目录,java net.grinder.Grinder
grinder.properties
grinder.processes=50//
进程数
grinder.threads=1//
线程数
grinder.runs=6000//
循环执行的次数
grinder.useConsole=true
grinder.logDirectory=log
grinder.numberOfOldLogs=1
#grinder.consoleHost=10.0.0.66 //CONSOLE
66
#grinder.consolePort=6372
//
30秒增加2个进程
grinder.processIncrement=2
grinder.processIncrementInterval=30000
grinder.initialProcesses=6//
起初运行的进程数
grinder.duration=600000//
脚本执行10分钟
grinder.reportTimesToConsole=false
#grinder.initialSleepTime=500
#grinder.sleepTimeFactor=0.01
#grinder.sleepTimeVariation=0.005
grinder.jvm.arguments=-mx512m
#grinder.script=dmryrz.py
#grinder.script=pingzhengdaochu.py
#grinder.script=xinzidaochu.py
grinder.script=jiaoyi3.py
.根据生成的LOG文件分析系统
1.
条件
需要工具grinderAnalyzer(下载地址),jython_installer-2.2.1.jar 可以到相应网站下载
2.
grinder生成的data.log文件放到E:\grinderAnalyzer.V2.b9目录下,同时选择一其中一个out.log文件(out.log只需要一个且不限定哪个,只要是同个测试的log
3.CMD
E:\grinderAnalyzer.V2.b9目录 执行命令jython analyzer.py E:\grinderAnalyzer.V2.b9\data_0.log E:\grinderAnalyzer.V2.b9\data_1.log E:\grinderAnalyzer.V2.b9\data_2.log E:\grinderAnalyzer.V2.b9\out_0.log 1 其中1代表agent的数量
4.
grinderReport下有生成的结果repot.html

Web网站测试方法

来源:互联网

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

本文将 web 测试分为 6 个部分:

1. 功能测试

2. 性能测试(包括负载/压力测试)

3. 用户界面测试

4. 兼容性测试

5. 安全测试

6. 接口测试

本文的目的是覆盖 web 测试的各个方面,未就某一主题进行深入说明。

1 功能测试

1.1 链接测试

链接是Web应用系统的一个主要特征,它是在页面之间切换和指导用户去一些不知道地址的页面的主要手段。链接测试可分为三个方面。首先,测试所有链接是否按指示的那样确实链接到了该链接的页面;其次,测试所链接的页面是否存在;最后,保证Web应用系统上没有孤立的页面,所谓孤立页面是指没有链接指向该页面,只有知道正确的URL地址才能访问。

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

采取措施:采用自动检测网站链接的软件来进行。

推荐软件:

Xenu Link Sleuth 免费 绿色免安装软件

HTML Link Validator 共享(30天试用)

1.2 表单测试

当用户通过表单提交信息的时候,都希望表单能正常工作。

如果使用表单来进行在线注册,要确保提交按钮能正常工作,当注册完成后应返回注册成功的消息。如果使用表单收集配送信息,应确保程序能够正确处理这些数据,最后能让顾客能让客户收到包裹。要测试这些程序,需要验证服务器能正确保存这些数据,而且后台运行的程序能正确解释和使用这些信息。

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

1.3 数据校验

如果系根据业务规则需要对用户输入进行校验,需要保证这些校验功能正常工作。例如,省份的字段可以用一个有效列表进行校验。在这种情况下,需要验证列表完整而且程序正确调用了该列表(例如在列表中添加一个测试值,确定系统能够接受这个测试值)。

在测试表单时,该项测试和表单测试可能会有一些重复。

1.2和1.3的采取措施:第一个完整的版本采用手动检查,同时形成WinRunner(QTP)脚本;回归测试以及升级版本主要靠WinRunner(QTP)自动回放测试。

1.4 cookies测试

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

如果Web应用系统使用了Cookies,就必须检查Cookies是否能正常工作。测试的内容可包括Cookies是否起作用,是否按预定的时间进行保存,刷新对Cookies有什么影响等。如果在 cookies 中保存了注册信息,请确认该 cookie能够正常工作而且已对这些信息已经加密。如果使用 cookie 来统计次数,需要验证次数累计正确。

采取措施:

1 采用黑盒测试:采用上面提到的方法进行测试

2 采用查看cookies的软件进行(初步的想法)

可以选择采用的软件

IECookiesView v1.50

Cookies Manager v1.1

1.5 数据库测试

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

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

采取措施:暂时没有更好的测试方法

考虑结合到1.2和1.3的测试中

1.6 应用程序特定的功能需求

最重要的是,测试人员需要对应用程序特定的功能需求进行验证。尝试用户可能进行的所有操作:下订单、更改订单、取消订单、核对订单状态、在货物发送之前更改送货信息、在线支付等等。这是用户之所以使用网站的原因,一定要确认网站能像广告宣传的那样神奇。

采取措施:深刻理解需求说明文档

1.7 设计语言测试

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

4 兼容性测试

4.1 平台测试

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

4.2 浏览器测试

浏览器是Web客户端最核心的构件,来自不同厂商的浏览器对Java,、JavaScript、 ActiveX、 plug-ins或不同的HTML规格有不同的支持。例如,ActiveX是Microsoft的产品,是为Internet Explorer而设计的,JavaScript是Netscape的产品,Java是Sun的产品等等。另外,框架和层次结构风格在不同的浏览器中也有不同的显示,甚至根本不显示。不同的浏览器对安全性和Java的设置也不一样。
测试浏览器兼容性的一个方法是创建一个兼容性矩阵。在这个矩阵中,测试不同厂商、不同版本的浏览器对某些构件和设置的适应性。

4.3 分辨率测试

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

4.4 Modem/连接速率

是否有这种情况,用户使用28.8 modem下载一个页面需要10分钟,但测试人员在测试的时候使用的是T1专线? 用户在下载文章或演示的时候,可能会等待比较长的时间,但却不会耐心等待首页的出现。最后,需要确认图片不会太大。

4.5 打印机

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

4.6 组合测试

最后需要进行组合测试。600x800的分辨率在 MAC 机上可能不错,但是在IBM 兼容机上却很难看。在IBM机器上使用Netscape能正常显示,但却无法使用Lynx 来浏览。如果是内部使用的web 站点,测试可能会轻松一些。如果公司指定使用某个类型的浏览器,那么只需在该浏览器上进行测试。如果所有的人都使用 T1 专线,可能不需要测试下载施加。(但需要注意的是,可能会有员工从家里拨号进入系统) 有些内部应用程序,开发部门可能在系统需求中声明不支持某些系统而只支持一些那些已设置的系统。但是,理想的情况是,系统能在所有机器上运行,这样就不会限制将来的发展和变动。

采取措施:根据实际情况,采取等价划分的方法,列出兼容性矩阵

5 安全测试

即使站点不接受信用卡支付,安全问题也是非常重要的。Web 站点收集的用户资料只能在公司内部使用。如果用户信息被黑客泄露,客户在进行交易时,就不会有安全感。

5.1 目录设置

Web 安全的第一步就是正确设置目录。每个目录下应该有 index.html 或 main.html 页面,这样就不会显示该目录下的所有内容。我服务的一个公司没有执行这条规则。我选中一幅图片,单击鼠标右键,找到该图片所在的路径"…com/objects/images"。然后在浏览器地址栏中手工输入该路径,发现该站点所有图片的列表。这可能没什么关系。我进入下一级目录 "…com/objects" ,点击 jackpot。在该目录下有很多资料,其中引起我注意的是已过期页面。该公司每个月都要更改产品价格,并且保存过期页面。我翻看了一下这些记录,就可以估计他们的边际利润以及他们为了争取一个合同还有多大的降价空间。如果某个客户在谈判之前查看了这些信息,他们在谈判桌上肯定处于上风。

5.2 SSL

很多站点使用 SSL 进行安全传送。你知道你进入一个 SSL 站点是因为浏览器出现了警告消息,而且在地址栏中的 HTTP 变成 HTTPS。如果开发部门使用了SSL,测试人员需要确定是否有相应的替代页面(适用于3.0 以下版本的浏览器,这些浏览器不支持SSL。当用户进入或离开安全站点的时候,请确认有相应的提示信息。是否有连接时间限制?超过限制时间后出现什么情况?

5.3 登录

有些站点需要用户进行登录,以验证他们的身份。这样对用户是方便的,他们不需要每次都输入个人资料。你需要验证系统阻止非法的用户名/口令登录,而能够通过有效登录。用户登录是否有次数限制? 是否限制从某些 IP 地址登录? 如果允许登录失败的次数为3,你在第三次登录的时候输入正确的用户名和口令,能通过验证吗? 口令选择有规则限制吗?  是否可以不登陆而直接浏览某个页面?

Web应用系统是否有超时的限制,也就是说,用户登陆后在一定时间内(例如15分钟)没有点击任何页面,是否需要重新登陆才能正常使用。

5.4 日志文件

在后台,要注意验证服务器日志工作正常。日志是否记所有的事务处理? 是否记录失败的注册企图? 是否记录被盗信用卡的使用? 是否在每次事务完成的时候都进行保存? 记录IP 地址吗? 记录用户名吗?

5.5 脚本语言

脚本语言是常见的安全隐患。每种语言的细节有所不同。有些脚本允许访问根目录。其他只允许访问邮件服务器,但是经验丰富的黑客可以将服务器用户名和口令发送给他们自己。找出站点使用了哪些脚本语言,并研究该语言的缺陷。还要需要测试没有经过授权,就不能在服务器端放置和编辑脚本的问题。最好的办法是订阅一个讨论站点使用的脚本语言安全性的新闻组。

6 接口测试

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

6.1服务器接口

第一个需要测试的接口是浏览器与服务器的接口。测试人员提交事务,然后查看服务器记录,并验证在浏览器上看到的正好是服务器上发生的。测试人员还可以查询数据库,确认事务数据已正确保存。

这种测试可以归到功能测试中的表单测试和数据校验测试中

6.2 外部接口

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

这种情况在远程抄表中可能会体现到

6.3 错误处理

最容易被测试人员忽略的地方是接口错误处理。通常我们试图确认系统能够处理所有错误,但却无法预期系统所有可能的错误。尝试在处理过程中中断事务,看看会发生什么情况?订单是否完成?尝试中断用户到服务器的网络连接。尝试中断 web 服务器到信用卡验证服务器的连接。在这些情况下,系统能否正确处理这些错误?是否已对信用卡进行收费?如果用户自己中断事务处理,在订单已保存而用户没有返回网站确认的时候,需要由客户代表致电用户进行订单确认。

采取措施:在理解需求的基础上,充分发挥想象力,尽量比较全面的列出各种异常情况

Web网站测试流程

1测试流程与方法
1.1测试流程
进行正式测试之前,应先确定如何开展测试,不可盲目的测试。一般网站的测试,应按以下流程来进行:
1)使用HTML Link Validator将网站中的错误链接找出来;
2)测试的顺序为:自顶向下、从左到右;
3)查看页面title是否正确。(不只首页,所有页面都要查看);
4)LOGO图片是否正确显示;
5)LOGO下的一级栏目、二级栏目的链接是否正确;
6)首页登录、注册的功能是否实现;
7)首页左侧栏目下的文章标题、图片等链接是否正确;
8)首页中间栏目下的文章标题、图片等链接是否正确;
9)首页右侧栏目下的文章标题、图片等链接是否正确;
10)首页最下方的【友情链接】、【关于我们】等链接是否正确;
11)进入一级栏目或二级栏目的列表页。查看左侧栏目名称,右侧文章列表是否正确;
12)列表页的分页功能是否实现、样式是否统一;
13)查看文章详细页面的内容是否存在乱码、页面样式是否统一;
14)站内搜索(各个页面都要查看)功能是否实现;
15)前后台交互的部分,数据传递是否正确;
16) 默认按钮要支持Enter及选操作,即按Enter后自动执行默认按钮对应操作。
1.2 UI测试
UI测试包括的内容有如下几方面:
1)各个页面的样式风格是否统一;
2)各个页面的大小是否一致;同样的LOGO图片在各个页面中显示是否大小一致;页面及图片是否居中显示;
3)各个页面的title是否正确;
4)栏目名称、文章内容等处的文字是否正确,有无错别字或乱码;同一级别的字体、大小、颜色是否统一;
5)提示、警告或错误说明应清楚易懂,用词准确,摒弃模棱两可的字眼;
6)切换窗口大小,将窗口缩小后,页面是否按比例缩小或出现滚动条;各个页面缩小的风格是否一致,文字是否窜行;
7)父窗体或主窗体的中心位置应该在对角线焦点附近;子窗体位置应该在主窗体的左上角或正中;多个子窗体弹出时应该依次向右下方偏移,以显示出窗体标题为宜;
8)按钮大小基本相近,忌用太长的名称,免得占用过多的界面位置;避免空旷的界面上放置很大的按钮;按钮的样式风格要统一;按钮之间的间距要一致;
9)页面颜色是否统一;前景与背景色搭配合理协调,反差不宜太大,最好少用深色或刺目的颜色;
10)若有滚动信息或图片,将鼠标放置其上,查看滚动信息或图片是否停止;
11)导航处是否按相应的栏目级别显示;导航文字是否在同一行显示;
12)所有的图片是否都被正确装载,在不同的浏览器、分辨率下图片是否能正确显示(包括位置、大小);
13)文章列表页,左侧的栏目是否与一级、二级栏目的名称、顺序一致;
14) 调整分辨率验证页面格式是否错位现象;
15)鼠标移动到Flash焦点上特效是否实现,移出焦点特效是否消失;
16) 文字颜色与页面配色协调,不使用与背景色相近的颜色。
17) 每个非首页静态页面含图片字节不超过300K,全尺寸banner第一个场景控制在200k以内 二个场景在300K,三个场景在400K以此类推
18) 同一界面上的控件数最好不要超过10个,多于10个时可以考虑使用分页界面显示。
19) 超过一屏的内容,在底部应有go top按钮
20) 超过三屏的内容,应在头部设提纲,直接链接到文内锚点
21) 首页,各栏目一级页面之间互链,各栏目一级和本栏目二级页面之间互链
22) 导航的文字要简明扼要,字数限制在一行以内
23) 报表显示时应考虑数据显示宽度的自适应或自动换行。
24) 所有有数据展现的界面(如统计、查询、编辑录入、打印预览、打印等),必须使测试数据的记录数超过一屏/一页,以验证满屏/页时其窗体是否有横向、纵向滚动条或换页打(L)印,界面显示是否正常;
25) 如有多个系统展现同一数据源时,应保证其一致性;
26) 对于报表中的所有字段值都应该有明确的定义,对于无意义的字段值,不应该显示空,应显示“--”或“/”,表示该字段值无意义。
27) 对统计的数据应按用户习惯进行分类、排序。
28) 界面内容更新后系统应提供刷新功能。
29) 用户在退出系统后重新登陆时应考虑是否需要自动返回到上次退出系统时的界面;
30)在多个业务功能组成的一个业务流程中,如果各个功能之间的执行顺序有一定的制约条件,应通过界面提示用户。
31)用户提示信息应具有一定的指导性,在应用程序正在进行关键业务的处理时,应考虑在前台界面提示用户应用程序正在进行的处理,以及相应的处理过程,在处理结束后再提示用户处理完毕。
32)在某些数据输入界面,如果要求输入的数据符合某项规则,应在输入界面提供相应的规则描述;当输入数据不符合规则时应提示用户是否继续。
33)在对任何配置信息修改后,都应该在用户退出该界面时提示用户保存(如果用户没有主动保存的情况下);
34)在对某些查询功能进行测试时,应考虑查询条件的设置的合理性以及查询结果的互补性。如某些后台处理时间不应该作为查询条件。
35)界面测试时,应考虑某一界面上按钮先后使用的顺序问题,以免用户对此产生迷惑。例如只能在查询成功后显示执行按钮。
36)界面测试时,应验证窗口与窗口之间、字段与字段之间的浏览顺序是否正确;
37)在某些对数据进行处理的操作界面,应考虑用户可能对数据进行处理的频繁程度和工作量,考虑是否可以进行批量操作。
38)界面测试时应验证所有窗体中的对象状态是否正常,是否符合相关的业务规则需要。
49)应验证各种对象访问方法(Tab 健、鼠标移动和快捷键)是否可正常使用,并且在一个激活界面中快捷键无重复;
40)界面测试不光要考虑合理的键盘输入,还应考虑是否可以通过鼠标拷贝粘贴输入。
41)对于统计查询功能的查询结果应验证其是否只能通过界面上的查询或刷新按键人工触发,应避免其他形式的触发。
42)对界面上的任何对象进行拖拉,然后进行查询、打印,应保证查询打印结果不变;
43)确保数据精度显示的统一:如单价0元,应显示为0.00元;
44)确保时间及日期显示格式的统一;
45)确保相同含义属性/字段名的统一;
46)对所有可能产生的提示信息界面内容和位置进行验证,确保所有的提示信息界面应居中。
1.3链接测试
链接测试主要分为以下几个方面:
1)页面是否有无法连接的内容;图片是否能正确显示,有无冗余图片,代码是否规范,页面是否存死链接(可以用HTML Link Validator工具查找);
2)图片上是否有无用的链接;点击图片上的链接是否跳转到正确的页面;
3)首页点击LOGO下的一级栏目或二级栏目名称,是否可进入相应的栏目;
4)点击首页或列表页的文章标题的链接,是否可进入相应的文章的详细页面;
5)点击首页栏目名称后的【更多】链接,是否正确跳转到相应页面;
6)文章列表页,左侧的栏目的链接,是否可正确跳转到相应的栏目页面;
7)导航链接的页面是否正确;是否可按栏目级别跳转到相应的页面;
(例:【首页->服务与支持->客服中心】,分别点击“首页”、“服务与支持”、“客服中心”,查看是否可跳转到相应页面;)
8) 新闻、信息类内容通常用新开窗口方式打开。
9) 顶部导航、底部导航通常采取在本页打开。
1.4搜索测试
搜索测试主要分为以下几个方面:
1)搜索按钮功能是否实现;
2)输入网站中存在的信息,能否正确搜索出结果;
3)输入键盘中所有特殊字符,是否报错;特别关注:_ ? ’ . • \  / -- ;特殊字符
4)系统是否支持键盘回车键、Tab键;
5)搜索出的结果页面是否与其他页面风格一致;
6)在输入域输入空格,点击搜索系统是否报错;
7)本站内搜索输入域中不输入任何内容,是否搜索出的是全部信息或者给予提示信息;
8)精确查询还是模糊查询,如果是模糊查询输入:中%国。查询结果是不是都包含中国两个字的信息;
9)焦点放置搜索框中,搜索框内容是否被清空;
10)搜索输入域是否实现回车键监听事件;
1.5表单测试
表单测试主要分为以下几个方面:
1)注册、登录功能是否实现;
2)提交、清空按钮功能是否实现;
3)修改表单与注册页面数据项是否相同,修改表单是否对重名做验证;
4)提交的数据是否能正确保存到后台数据库中(后台数据库中的数据应与前台录入内容完全一致,数据不会丢失或被改变);
5)表单提交,删除,修改后是否有提示信息;提示、警告、或错误说明应该清楚、明了、恰当。
6)浏览器的前进、后退、刷新按钮,是否会造成数据重现或页面报错;
7)提交表单是否支持回车键和Tab键;Tab键的顺序与控件排列顺序要一致,目前流行总体从上倒下,同时行间从左到右的方式
8)下拉列表功能是否实现和数据是否完整(例如:省份和市区下拉列表数据是否互动);
1.6输入域测试
输入域测试主要分为以下几个方面:
1)对于手机、邮箱、证件号等的输入是否有长度及类型的控制;
2)输入中文、英文、数字、特殊字符(特别注意单引号和反斜杠)及这四类的混合输入,是否会报错;
3)输入空格、空格+数据、数据+空格,是否报错;
4)输入html语言的<head>,是否能正确显示;
5)输入全角、半角的英文、数字、特殊字符等,是否报错;
6)是否有必填项的控制;不输入必填项,是否有友好提示信息;
7)输入超长字段,页面是否被撑开;
8)分别输入大于、等于、小于数据表规定字段长度的数据,是否报错;
9)输入非数据表中规定的数据类型的字符,是否有友好提示信息;
10)在文本框中输入回车键,显示时是否回车换行;
11) 非法的输入或操作应有足够的提示说明。
1.7分页测试
分页测试主要分为以下几个方面:
1)当没有数据时,首页、上一页、下一页、尾页标签全部置灰;
2)在首页时,“首页”“上一页”标签置灰;在尾页时,“下一页”“尾页”标签置灰;在中间页时,四个标签均可点击,且跳转正确;
3)翻页后,列表中的数据是否扔按照指定的顺序进行了排序;
4)各个分页标签是否在同一水平线上;
5)各个页面的分页标签样式是否一致;
6)分页的总页数及当前页数显示是否正确;
7)是否能正确跳转到指定的页数;
8)在分页处输入非数字的字符(英文、特殊字符等),输入0或超出总页数的数字,是否有友好提示信息;
9)是否支持回车键的监听;
1.8 交互性数据测试
1)前台的数据操作是否对后台产生相应正确的影响
(如:查看详细信息时,需扣除用户相应的授权点数);
2)可实现前后台数据的交互(如:在线咨询,能否实现数据的交互实时更新);数据传递是否正确;前后台大数据量信息传递数据是否丢失(如500个字符);多用户交流时用户信息控制是否严谨;
3)用户的权限,是否随着授权而变化;
4)数据未审核时,前台应不显示;审核通过后,前台应可显示该条数据;
功能测试中还需注意以下几点内容:
1)点击【收藏我们】,标题是否出现乱码;收藏的url与网站的url是否一致;能否通过收藏夹来访问网站;
2)对于修改、删除等可能造成数据无法恢复的操作必须提供确认信息,给用户放弃选择的机会;
3)在文章详细页面,验证字体大小改变、打印、返回、关闭等功能是否实现;
2安全性测试
2.1目录设置
目录测试主要分为以下几个方面:
1)在测试路径上出现:http://218.61.30.17:7001/dzgh/xwzx/khzl/2008/11/13/58127.html 把/2008/11/13/58127.html去掉,看是否能出现目录下文件;
2)访问文件目录如果出现403错误,说明网页加以限制拒绝访问;
3)访问文件目录如果出现SSH其他根目录路径,说明有漏洞缺陷;
4)用X-Scan-v3.2-cn工具对网站服务器扫描。可以对网站参透出开启的端口号,SSH弱口令,网站是否存在高风险;比如:在扫描参数中输入测试网站的地址,点击扫描。如果扫描出网站端口号高风险或SSH弱口令可以与开发人员沟通进行修改;
5)测试有效和无效的用户名和密码,要注意到是否大小写敏感,可以试多少次的限制,是否可以不登陆而直接浏览某个页面等。
6)Web应用系统是否有超时的限制,也就是说,用户登陆后在一定时间内(例如15分钟)没有点击任何页面,是否需要重新登陆才能正常使用。
7)为了保证Web应用系统的安全性,日志文件是至关重要的。需要测试相关信息是否写进了日志文件、是否可追踪。
8)当使用了安全套接字时,还要测试加密是否正确,检查信息的完整性。
9)服务器端的脚本常常构成安全漏洞,这些漏洞又常常被黑客利用。所以,还要测试没有经过授权,就不能在服务器端放置和编辑脚本的问题。
10)网页加载速度测试可以采用HttpWatch软件等,可以知道那些内容影响网站整体速度。