根据软件开发的过程和由细节到外部的顺序,将软件测试划分为5个阶段:
1)代码质量检查:对代码的格式、潜在的Bug进行检查,常用的工具有Checkstyle、PMD、FindBugs;
2)单元测试:对代码的功能进行测试,常用的工具有JUnit、EasyMock;
3)性能测试:对代码的性能进行测试,常用的工具有JMeter、Profiler;
4)自动构建:对代码进行自动构建和持续集成测试、部署,常用的工具有Ant、Maven、CruiseControl;
5)项目管理:对软件测试中的Bug进行跟踪和知识管理,常用的工具有JIRA、Confluence。
一、代码质量检查
1、Checkstyle是一个开源代码格式的分析工具,侧重于遵循Java编码约定(例如行长度和缩进)而不是Bug模式。
检查内容:
Javadoc注释、命名约定、标题、Import语句、体积大小、空白、修饰符、块、代码问题、类设计、混合检查。
2、PMD是一个开源Java源码分析器,它分析Java源代码并找出潜在的Bug。
检查内容:
1)基本(rulesets/basic.xml)——规则的一个基本合集:catch块不该为空,无论何时重写equals(),都要重写hashCode()等。
2)命名(rulesets/naming.xml)——对标准Java命名规范的测试:变量名称不应太短;方法名称不应过长;类名称应以大写字母开头;方法和字段应当以小写字母开头等。
3)未使用的代码(rulesets/unusedcode.xml)——查找从未使用的私有字段和本地变量、执行不到的语句、从未调用的私有方法等。
4)设计(rulesets/design.xml)——检查各种设计良好的原则,例如switch语句应当有default块,应当避免深度嵌套的if块,不应当给参数重新赋值,不应该对double值进行相等比较。
5)导入语句(rulesets/imports.xml)——检查import语句的问题,比如同一个类被导入两次或者被导入java.lang的类中。
6)JUnit测试(rulesets/junit.xml)——查找测试用例和测试方法的特定问题,例如方法名称的正确拼写,以及suite()方法是不是static和public。
7)字符串(rulesets/string.xml)——找出处理字符串遇到的常见问题,例如重复的字符串标量,调用String构造函数,对String变量调用toString()方法。
8)括号(rulesets/braces.xml)——检查for、if、while和else语句是否使用了括号。
9)代码尺寸(rulesets/codesize.xml)——测试过长的方法、有太多方法的类,以及重构方面的类似问题。
10)JavaBean(rulesets/javabeans.xml)——查看JavaBean组件是否违反JavaBean编码规范,比如没有序列化的Bean类。
11)终结函数(finalizer):因为在Java语言中finalize()方法不是那么普遍,所以它们的使用规则虽然很详细,但是人们对它们不是很熟悉,这类检查查找finalize()方法的各种问题,例如空的终结函数、调用其他方法的finalize()方法、对finalize()的显示调用等。
12)克隆(relesets/clone.xml)——用户clone()方法的新规则,凡是重写clone()方法的类都必须实现Cloneable,clone()方法应该调用super.clone(),而clone()方法应该声明抛出CloneNotSupportedException异常,即使实际上没有抛出异常,也要如此。
13)耦合(rulesets/coupling.xml)——查找类之间过度耦合的迹象,比如导入内容太多;在超类型或接口就已经够用的时候使用子类的类型;类中的字段、变量和返回类型过多等。
14)严格的异常(rulesets/strictexception.xml)——针对异常的测试:不应该声明该方法而抛出java.lang.Exception异常,不应该将异常用于流控制,不应该捕获Throwable等。
15)有争议的(rulesets/controversial.xml)——PMD的有些规则是有能力的Java程序员可以接受的,但还是有一些争议。这个规则集合包含一些更有问题的检验,其中包括把null赋值给变量、方法中有多个返回点,以及从sun包导入等。
16)日志(rulesets/logging-java.xml)——查找java.util.logging.Logger的不当使用,包括非终状态(Nonfinal)、非静态的记录器,以及在一个类中有多个记录器。
3、FindBugs是另一个开源静态代码分析工具,它与PMD的不同之处在于,它分析编译后的字节码,而不是分析源代码。
检查内容:
1)方法名的首字母要小写。
2)类名的首字母要大写。
3)方法没有抛出异常。
4)equals()对数组对象和非数组对象的比较。
5)空对象的检查。
6)Public Static方法暴露内部细节。
7)Inconsistent Synchronization方法的使用。
8)Synchronize使用在同一个变量上。
9)变量违背使用。
10)重复的if测试条件。
11)重复的空置检查。
12)没有抛出异常时却捕获了异常。
二、单元测试
1、以JUnit为核心的测试框架。
1)JUnit:是一个开源的Java单元测试框架,用来编写白盒测试代码。
2)Cactus:一个基于JUnit框架的简单测试框架,能够实现服务端的代码测试,例如Servlet、HttpServletRequest、HttpServletResponse、HttpSession等。
3)DbUnit:为数据库驱动的项目提供的一个对JUnit的扩展,除了提供一些常用功能外,它还可以将你的数据库置于一个测试轮回之间的状态。
4)TestNG:是根据JUnit和NUnit思想而构建的一个测试框架,但是TestNG增加了许多新的功能,使得它变得更加强大与容易使用。
5)XMLUnit:用来比较两张XML之间的不同,展示XML利用XSLT来校验XML。
6)StrutsTestCase:是JunitTestCase类的扩展,提供基于Struts框架的代码测试。
7)SpringUnit:用于Java软件单元和综合测试的开源框架,它把Spring的依赖注入容器与JUnit的测试框架相结合来实现数据驱动测试。
8)Ejb3Unit:是JUnit的一个扩展,用于在容器外对EJB3实体(Entity)和会话(Session)Bean进行自动测试。
2、模拟测试框架。
1)EasyMock:为Mock Objects提供接口并在JUnit测试中利用Java的proxy设计模式生成它们的实例。Mock方法是单元测试中常见的一种技术,它的主要作用是模拟一些在应用中不容易构造或者比较复杂的对象,例如Servlet、HttpServeltRequest、HttpServeltResponse、HttpSession、ResultSet等,从而把测试与测试边界以外的对象隔离开。编写自定义的Mock对象需要额外的编码工作,同时也可能引入错误。EasyMock提供了根据指定接口动态构建Mock对象的方法,避免了手工编写Mock对象。EasyMock是一套通过简单的方法对于指定的接口或类生成Mock(模拟)对象的类库,它能利用对接口或类的模拟来辅助单元测试。它提供对接口的模拟,能够通过录制、回放、检查3步来完成测试过程,可以验证方法的调用种类、次数、顺序,可以令Mock对象返回指定的值或抛出指定的异常。通过EasyMock,我们可以方便地构造Mock对象从而令单元测试顺利进行。
EasyMock采用“记录/回放”的工作模式,基本使用步骤如下:
· 创建Mock对象的控制对象Control;
· 从控制对象中获取所需要的Mock对象;
· 记录测试方法中所使用到的方法和返回值;
· 设置Control对象到“回放”模式;
· 进行测试;
· 在测试完毕后,确认Mock对象已经执行了刚才定义的所有操作。
2)jMock:利用Mock Objects思想来对Java Code进行测试。jMock容易扩展,让你快速简单地定义Mock Objects,因此不必打破程序间的关联;让你超越对象之间交互作用而带来的测试局限,减少你测试的脆弱性。
3)MockLib:是一个很小的包,所以可以轻易地动态创建一个模拟对象,可以从模拟的系统中抛出异常来确保你的系统能够正确处理错误,它同样也是一个线程安全的模拟对象库。
三、性能测试
1、使用JMeter进行压力测试
JMeter是Apache组织的开放源代码项目,可以用于测试静态或者动态资源的性能(JSP文件、Servlets、Perl脚本、Java对象、数据库和查询、FTP服务器或者其他的资源)。JMeter用于模拟在服务器、网络或者其他对象上附加高负载以测试他们提供服务的受压能力,或者分析他们提供的服务在不同负载条件下的总性能情况。要进行测试,首先需要创建测试计划。测试计划描述了执行测试过程中JMeter的执行过程和步骤,一个完整的测试计划包括一个或者多个线程组(Thread Groups)、逻辑控制(Logic Controller)、实例产生控制器(Sample Generating Controllers)、侦听器(Listener)、定时器(Timer)、比较(Assertions)、配置元素(Configure Elements)。打开JMeter时,它已经建立了一个默认的测试计划,一个JMeter应用的实例只能建立或者打开一个测试计划。
2、使用Profiler检查内存泄露
工具有:Optimizeit Profiler、JProbe Profiler、JinSight、Rational公司的Purify等。
四、自动构建
1、Ant已经成为业界的标准,许多的源代码网站都使用Ant作为项目编译的工具,使用它可以进行项目的编译、打包、运行、文档生成等各种任务。
2、Maven是一个Ant为基础的打包工具,Maven的编译及所有的脚本都有一个基础,就是POM(Project Object Model)。Maven对所依赖的包有明确的定义,并且基于中央仓库进行编译。
3、使用CruseContrl进行持续集成。
五、项目管理
1、使用JIRA进行项目的Bug的发布、跟踪和管理
2、使用Confluence构建Wiki知识网站