利用 Eclipse 进行单元测试

  categories:资料  tags:  author:
来源:互联网

简介: 您的传统代码是不是要求使用匹配的类测试套件才能针对其源代码库运行?针对此类目的,jMock 堪称是一个优秀的测试框架。但是,并不是所有情况都能够适用,尤其是必须以 jMock 不期望的方式构造对象时。为避免生成自定义模拟对象套件才能支持应用程序中的单元测试的麻烦,可以调整 RMock,与 jMock 无缝地结合使用,从而解决这一问题。

模拟对象将模仿出于指导代码执行的惟一目的而编写的类的行为,以便它在测试时符合代码执行要求。最终,模拟对象数目可以随着应用程序类数目的增长而增长。使用 jMock、RMock 甚至 EasyMock 等框架有助于消除对物理的独立存在的模拟对象集的需求。

EasyMock 框架的一个主要缺点是不能模拟具体类 —— 而只能模拟接口。在本文中,我将向您展示怎样使用 jMock 框架来模拟具体类 接口,以及如何用 RMock 测试某些模糊的情况。

Eclipse 平台为使用 jMock 和 RMock 测试框架提供了一种易于使用的机制。

在 Eclipse IDE 中配置 jMock 和 RMock

注:有关 … 阅读全文

Junit的多线程测试

  categories:资料  tags:  author:

来源:互联网
有关Junit的多线程测试 Junit和许多 开源 软件项目集成在一起,但是Junit执行多线程的 单元测试 有一些问题。这篇文章介绍Junit的一个扩展类库———GroboUtils,这个类库被设计为来解决这些问题,并且使在Junit中进行单元测试成为 可能。对Junit和线程有一个

有关Junit的多线程测试

Junit和许多开源软件项目集成在一起,但是Junit执行多线程的单元测试有一些问题。这篇文章介绍Junit的一个扩展类库———GroboUtils,这个类库被设计为来解决这些问题,并且使在Junit中进行单元测试成为可能。对Junit和线程有一个基本的理解是有好处的,但对于本篇文章的读者来说不是必需的。

介绍
如果你已经在一个开源的Java项目上工作,或者读了许多有关“极限编程”和其它“快速开发模式”的书籍,那么,你很有可能已经听说过有关Junit的事情。它是由Erich Gamma和Kent Beck编写的,Junit是一个Java的自动测试的框架,它允许你为你的软件定义的“单元测试”———不管是测试程序还是功能代码,通常都是基于方法调用方法的。

Junit能在很多方面帮助你的开发团队———在一些文章中已经包含了很多这方面的介绍。但从一个开者到另一个开发者,Junit实际上只专箸于两件事:

1、它强制你使用自己的代码。你的测试代码只是作为你的产品代码的客户端,从客户端的描述所获得的对你的软件的了解,能够帮助你标识出在API中的错误以及怎样改进代码,使其最终达到可以使用的目的。

2、它会给你对软件中改变带来信心,如果你的测试用例被中断,你就是立刻知道错误。在一天工作结束的时候,如果测试提示是绿色的,则代码是正确,你可以自信的检查它。

但是Junit不是解决所有软件测试中问题,第三方的扩展类库,例如HttpUnit,JwebUnit,XMLUnit等,已经认识到这些框架中不足,并且通过添加功能弥补不足,这些不足之一就是Junit不包含多线程的单元测试。

在 这篇文章中,我们会看到一个很少有人知道的解决这个问题的扩展类库。我们通过建立Junit框架开始,并且运行一个例子来展示Junit在线程没试中的不 足。在我们认识了Junit在线程测试方面的不足之后,我们通过一个使用GroboUtils框架的例子来讨论GroboUnitls

线程回顾

对于那些不熟悉线程的人来说,在这一点上是非常不安的(一点都不夸大),离开你的系统,我们将对线做一个简单的介绍。线程允许你的软件有多个任务,也就是说可以同时可做两件事情。
在Khalid Mugal和Rolf Rasmussen的书(A Programmer’s Guide to Java Certification)中,对线程做了下面这样的简短描述:
一个线程是一个程序中的可执行单元,它是被独立执行的。在运行时,在程序中的线程
有一个公共的内存空间,因此,能够共享数据和代码;也就是说,它们是轻量级的。它
也共享正在运行程序的进程。
Java 线程使运行时环境异步,它允许不同的任务同时被执行。(p.272)

在web应用程序中,许多用户可能同时发请求给你的软件。当你写单元测试对你的代码进行压力测试时,你需要模拟许多并发事件,如果你在开发健壮的中间件,这样做是尤其重要的。对于这些组件,使用线程测试是一个好的想法。

不幸的是,Junit在这方面是不足的。

有关Junit和多线程测试的问题

如果你想验证下列代码,你需要下载并安装Junit。按着指示去做,以便能够在Junit的网站能够找到它。不要过分追求细节,我们将简要的介绍Junit是怎样工作的。要写一个Junit的测试,你必须首先创建一个扩展于junit.framework.TestCase(Juint中的基本测试类)的测试类。… 阅读全文

单元性能测试和使用JUnitPerf测试多线程并发

  categories:资料  tags:  author:

来源:互联网

单元测试和性能测试在测试领域属于要 求相对较高的测试活动,也是测试工程师成长、向上发展的反向。单元测试评测我们的代码实现功能的情况,性能测试则企图分析应用程序的性能表现和负载能力。 那么“单元性能测试”能做什么?我们可以这样说,单元性能测试以单元测试的形式对代码进行性能测试。单元性能测试像单元测试一样,需要测试人员编写测试代 码,但现在关注的不是代码的功能实现情况了,而是想得到被测试代码的性能数据,包括执行方法耗时、多线程并发是否线程安全、内存是否泄漏、是否存在短期循 环对象等。单元性能测试相对于系统性能测试更容易定位问题,对关键的方法进行测试,可以降低系统性能风险,减少系统集成后系统性能测试的工作量。本篇文档 演示如何使用JUnitPerf程序包对代码进行多线程并发测试。

待测代码DateUtil:
我们待测的程序代码为com.loggingselenium.DateUtil类。这个类中有一个私有静态成员timeFormator和一个静态方法compareDateTime(String dateTime1, String dateTime2)。

package com.loggingselenium;
import java.util.Date;
import java.text.SimpleDateFormat;
public class DateUtil {
	private  static SimpleDateFormat timeFormator =
		new SimpleDateFormat("yyyyMMdd HH:mm:ss");
	public synchronized static int compareDateTime(String dateTime1, String dateTime2) {
		try 
阅读全文

使用 Spring 进行单元测试

  categories:资料  tags:  author:
来源:http://www.ibm.com/developerworks/cn/java/j-lo-springunitest/index.html?ca=drs-简介: 通过本文,您能够在较短的时间内掌握使用 Spring 单元测试框架测试基于 Spring 的应用程序的方法,这套方法主要涵盖如何使用 Spring 测试注释来进行常见的 Junit4 或者 TestNG 的单元测试,同时支持访问 Spring 的 beanFactory 和进行自动化的事务管理。

概述

单元测试和集成测试在我们的软件开发整个流程中占有举足轻重的地位,一方面,程序员通过编写单元测试来验证自己程序的有效性,另外一方面,管 理者通过持续自动的执行单元测试和分析单元测试的覆盖率等来确保软件本身的质量。这里,我们先不谈单元测试本身的重要性,对于目前大多数的基于 Java 的企业应用软件来说,Spring 已经成为了标准配置,一方面它实现了程序之间的低耦合度,另外也通过一些配置减少了企业软件集成的工作量,例如和 Hibernate、Struts 等的集成。那么,有个问题,在普遍使用 Spring 的应用程序中,我们如何去做单元测试?或者说,我们怎么样能高效的在 Spring 生态系统中实现各种单元测试手段?这就是本文章要告诉大家的事情。

单元测试目前主要的框架包括 Junit、TestNG,还有些 MOCK 框架,例如 Jmock、Easymock、PowerMock 等,这些都是单元测试的利器,但是当把他们用在 Spring 的开发环境中,还是那么高效么?还好,Spring 提供了单元测试的强大支持,主要特性包括:

  • 支持主流的测试框架 Junit
阅读全文

EasyMock 使用方法与原理剖析

  categories:资料  tags:  author:

来源:互联网

简介: EasyMock 是一套通过简单的方法对于指定的接口或类生成 Mock 对象的类库,它能利用对接口或类的模拟来辅助单元测试。本文将对 EasyMock 的功能和原理进行介绍,并通过示例来说明如何使用 EasyMock 进行单元测试。

Mock 方法是单元测试中常见的一种技术,它的主要作用是模拟一些在应用中不容易构造或者比较复杂的对象,从而把测试与测试边界以外的对象隔离开。

编写自定义的 Mock 对象需要额外的编码工作,同时也可能引入错误。EasyMock 提供了根据指定接口动态构建 Mock 对象的方法,避免了手工编写 Mock 对象。本文将向您展示如何使用 EasyMock 进行单元测试,并对 EasyMock 的原理进行分析。

1.Mock 对象与 EasyMock 简介

单元测试与 Mock 方法

单元测试是对应用中的某一个模块的功能进行验证。在单元测试中,我们常遇到的问题是应用中其它的协同模块尚未开发完成,或 者被测试模块需要和一些不容易构造、比较复杂的对象进行交互。另外,由于不能肯定其它模块的正确性,我们也无法确定测试中发现的问题是由哪个模块引起的。

Mock 对象能够模拟其它协同模块的行为,被测试模块通过与 Mock 对象协作,可以获得一个孤立的测试环境。此外,使用 Mock 对象还可以模拟在应用中不容易构造(如 HttpServletRequest … 阅读全文

使用EasyMock和jmock模拟

  categories:资料  tags:  author:

来源:互联网

今日做单元测试遇到一个问题。在java web application程序里面有一个函数doGet(HttpServletRequest request, HttpServletResponse response),要给它做单元测试,首先想到的就是mock出request和response,这不麻烦,但是该函数代码里面出现了Manifest mainfest = new Manifest(getServletContext().getResourceAsStream(MANIFEST_PATH));这样的句子,于是不得不还要mock出ServletContext。受益于http://www.liaoxuefeng.com/archives/52这篇文章,我找到了解决方法。

仍然采用网上的一个例子:

一个用户验证的LoginServlet类:

package mock.test;

import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet{
public void doPost(HttpServletRequest request,
HttpServletResponse response) … 阅读全文

JUnit4概述

  categories:资料  tags:,   author:

来源:互联网

JUnit4是JUnit框架有史以来的最大改进,其主要目标便是利用Java5的Annotation特性简化测试用例的编写。

先 简单解释一下什么是Annotation,这个单词一般是翻译成元数据。元数据是什么?元数据就是描述数据的数据。也就是说,这个东西在Java里面可以 用来和public、static等关键字一样来修饰类名、方法名、变量名。修饰的作用描述这个数据是做什么用的,差不多和public描述这个数据是公 有的一样。想具体了解可以看Core    Java2。废话不多说了,直接进入正题。

我们先看一下在JUnit 3中我们是怎样写一个单元测试的。比如下面一个类:
public class AddOperation {
public int add(int x,int y){
return x+y;
}
}

我们要测试add这个方法,我们写单元测试得这么写:
import junit.framework.TestCase;
import static org.junit.Assert.*;
public class AddOperationTest extends TestCase{

public void setUp() throws Exception {
}… 阅读全文

突破JUnit的局限

  categories:资料  tags:,   author:

来源:互联网

“没有人喜欢bug。”大多数关于单元测试的文章以这句话开篇。的确,我们都希望代码如设计的那样准确地执行,但是就好像叛逆孩子一样,程序在完成之后产生的行为将难以控制。比那些家长们幸运的是,我们可以运用工具以确保程序达到预期效果。

市 面上有很多用于测试,分析以及debug程式的工具,其中以JUnit最为有名。这是一个协助软件工程师,QA(品质监管)工程师测试阶段性代码的平台。 几乎每个接触过JUnit的人都对它有强烈的感情:要么喜欢,要么讨厌。主要的抱怨之一是它缺少做复杂场景测试的能力。

通过突破传统模式 的思考,这一问题可以得到解决。这篇文章将介绍JUnit如何利用Pisces来实现复杂测试。Pisces是一个开源项目,作为JUnit的扩展,它可 以让你写出由一些JUnit测试组成的测试单元,每个测试单元可以以串行或并行的方式运行在一个远程主机上。Pisces可以让你构成、运行复杂场景,并 在一个地点协调它们。

JUnit 基础
JUnit 中有两个基本对象,TestCase和TestSuite。TestCase通过提供一组方法来实现一系列测试。例如,setup()方法用来在每项测试 开始前建立测试所需的测试环境,而teardown()方法用来在测试后销毁该环境。其他的方法都会完成各式各样的任务,例如,在测试中进行性能检测,判 断变量是否为null,比较变量以及捕捉异常。
要创建测试程序,需要继承TestCase类,覆写setup和teardown方法,然后添加自己的测试函数,这些函数通常以“test测试名”的形式命名。

下面是一个测试程序的例子:

public class MyTestCase extends TestCase {

/**
* call super constructor with a test name
* string argument.
* @param testName the name … 阅读全文

互联网上的试验田——A/B测试小论

  categories:资料  tags:  author:

来源:http://mux.baidu.com/?p=1664

top

A/B 测试通常用来测量两个或多个方案在某一单一维度上的绩效表现。通俗的说,就是用尽可能科学严谨的方法,对比方案之间的优劣。这种方法虽然是穿白大褂的科学家发明并用于科学实验,但现在它已经被善于借鉴的市场专家、用户体验专家们广泛地应用在市场研究、产品界面方案评估等更“感性”的领域。

01
对于界面改进设计,A/B测试通常由控制版本和对照版本组成,即A为当前线上方案,B为改进方案。通过小流量线上平台测试,考察对方案评估比较重要的绩效数据,如点击率、停留时间、出错率等。

为什么要进行A/B测试?

首先,在用户体验行业,哪个方案好哪个方案要被拍掉这样的讨论、辩论、争论无时无刻不在世界各地重复上演。不知道听谁的,主要是因为大家的理由都来自于“推理”。虽然UCD已经深入人心,但仍然避免不了博弈各方自诩为用户代言人,推想用户的行为。而此时,A/B测试的威力就变得特别显眼。它在用于界面方案评估时可以提供客观、准确的数据。哪种方案点击率高、哪种方案更有利于将用户的点击转化为在线购买行为等问题,可以通过数据获得清晰、明确的结论。让数据说话,大家不知道要少费多少口舌,为公司省下多少矿泉水呢。
02
第二,A/B测试不仅可以回答哪种方案好的问题,更有可能回答好多少的问题。在日常设计中,经常出现这样的困扰:在一番厮杀博弈后,已经没有人怀疑新设计方案能比原方案有更好的效果。但至此,还不能天真地认为万事大吉了。方案仍然会被质疑:“为了这一点效果的改善,是否值得动用宝贵的开发资源?”如果此时可以使用A/B测试,定量的回答新方案比原方案在关键指标上的改善率,则可以有效的评估成本和效益,帮助进行设计决策。值不值得给研发密密麻麻的排期表上再添一行,大家心里都更清楚了一些。
03

测试哪些内容?

总体上说,任何可以让用户的行为造成变化的内容都可以进行A/B测试。但在界面设计中,经常进行以下内容的测试:

  • 按键大小、颜色、位置
  • 标题、文案风格
  • 文字长度、大小、间隔
  • 表单数量、字段类型
  • 页面布局、结构
  • ……

04
一次只改变一个变量

在设计A/B测试时,每次测试,无论对比方案有多少,都只能在一个地方进行改动。

如果你发现,按钮大小和颜色都可能影响该按钮的点击率,那么你需要分别进行三组测试。第一组,只变化按钮的大小,其他方面均保持不变;第二组实验则只变化按钮颜色。如果你对比的方案中,既有按钮大小的变化又有按钮颜色的变化,那么在分析结果时则完全无法分清,某方案的绩效改善到底是由哪个因素决定的。
05

足够的流量

在很多时候,A/B测试不是一种快速的研究方法,你需要耐心的积累数据流量。如果流量不够,我们则无法区分考察点的绩效差异是由于方案不同造成的还是由于样本量的偶然因素造成的。此外,还应该避免流量的巨大波动。往往访问量的异动通常是受到某些突发偶然事件的影响,无法真实反映出实验的效果。
06

拉开方案之间的距离

测试方案之间应该保证一定程度的差异,这样可以最大程度地提高测试的效率。如果对比方案间差异过小,一方面测试结果有可能无法发现统计学上有意义的明显差异。另一方面,即使方案差异明显,也不易进行下一步测试。举个例子,如果你发现12X12的图标比11X11的图标方案效果更好,那么你是不是需要实验一下13X13呢?如果13X13好,那么14X14呢?这样下去可能需要太多轮测试,你才能发现原来20X20的图标效果最好。所以,步子迈得大一些,可以更快的找到答案。
07
总之,AB测试是一种行之有效、丰俭由人、可庞大可迷你的不错的研究方法。正确的使用会带来事半功倍的效果。从今天开始,大胆的AB一下吧!AB测试是一种态度,AB测试是一种生活方式…… 阅读全文

测试用例的设计方法

  categories:资料  tags:  author:

来源:互联网

等价类划分方法:

一.方法简介
1.定义
是把所有可能的输入数据,即程序的输入域划分成若干部分(子集),然后从每一个子集中选取少数具有代表性的数据作为测试用例。该方法是一种重要的,常用的黑盒测试用例设计方法。
2.划分等价类:
等价类是指某个输入域的子集合。在该子集合中,各个输入数据对于揭露程序中的错误都是等效的,并合理地假定:测试某等价类的代表值就等于对这一类其它值的测试,因此,可以把全部输入数据合理划分为若干等价类,在每一个等价类中取一个数据作为测试的输入条件就可以用少量代表性的测试数据取得较好的测试结果。等价类划分可有两种不同的情况:有效等价类和无效等价类。
1)有效等价类
是指对于程序的规格说明来说是合理的、有意义的输入数据构成的集合。利用有效等价类可检验程序是否实现了规格说明中所规定的功能和性能。
2)无效等价类
与有效等价类的定义恰巧相反。无效等价类指对程序的规格说明是不合理的或无意义的输入数据所构成的集合。对于具体的问题,无效等价类至少应有一个,也可能有多个。
设计测试用例时,要同时考虑这两种等价类。因为软件不仅要能接收合理的数据,也要能经受意外的考验,这样的测试才能确保软件具有更高的可靠性。
3.划分等价类的标准:
1)完备测试、避免冗余;
2)划分等价类重要的是:集合的划分,划分为互不相交的一组子集,而子集的并是整个集合;
3)并是整个集合:完备性;
4)子集互不相交:保证一种形式的无冗余性;
5)同一类中标识(选择)一个测试用例,同一等价类中,往往处理相同,相同处理映射到”相同的执行路径”。

4.划分等价类的方法
1)在输入条件规定了取值范围或值的个数的情况下,则可以确立一个有效等价类和两个无效等价类。如:输入值是学生成绩,范围是0~100;

wps_clip_image-28567[3][1]

2)在输入条件规定了输入值的集合或者规定了”必须如何”的条件的情况下,可确立一个有效等价类和一个无效等价类;
3)在输入条件是一个布尔量的情况下,可确定一个有效等价类和一个无效等价类。
4)在规定了输入数据的一组值(假定n个),并且程序要对每一个输入值分别处理的情况下,可确立n个有效等价类和一个无效等价类。
例:输入条件说明学历可为:专科、本科、硕士、博士四种之一,则分别取这四种这四个值作为四个有效等价类,另外把四种学历之外的任何学历作为无效等价类。
5)在规定了输入数据必须遵守的规则的情况下,可确立一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则);
6)在确知已划分的等价类中各元素在程序处理中的方式不同的情况下,则应再将该等价类进一步的划分为更小的等价类。
5.设计测试用例
在确立了等价类后,可建立等价类表,列出所有划分出的等价类输入条件:有效等价类、无效等价类,然后从划分出的等价类中按以下三个原则设计测试用例:
1)为每一个等价类规定一个唯一的编号;
2)设计一个新的测试用例,使其尽可能多地覆盖尚未被覆盖地有效等价类,重复这一步,直到所有的有效等价类都被覆盖为止;
3)设计一个新的测试用例,使其仅覆盖一个尚未被覆盖的无效等价类,重复这一步,直到所有的无效等价类都被覆盖为止。
二.实战演习
1.某程序规定:”输入三个整数 a 、 b 、 c 分别作为三边的边长构成三角形。通过程序判定所构成的三角形的类型,当此三角形为一般三角形、等腰三角形及等边三角形时,分别作计算 … … 阅读全文




快乐成长 每天进步一点点      京ICP备18032580号-1