每个testCase都需要使用某一种初始化比较耗时的对象(资源),举例如数据库连接、Spring Context。我们遇到的问题是Selenium测试中开启和关闭浏览器,如果一个test启动关闭(我们的程序还需要登录和注销),这样测试的时间会拖的很长,给持续集成带来了困难。
所以,我们需要在每组不会冲突的test中间共享一个浏览器窗口,这样也就需要一个全局的setUp和tearDown。问题是JUnit 3.8.1里面的setUp和tearDown是在每个test之前和之后运行的,如果在里面初始化和关闭浏览器就会造成上面所说的问题。要解决它,就产生了如下3种思路:
1、升级,使用JUnit4
JUnit4从TestNG里面吸取了两个注释:@BeforeClass和@AfterClass
用它们注释过的方法就会只初始化一次,完全符合我们的需求。
public class SeleniumTestCase extends SeleneseTestCase4 {
protected static final Log log = LogFactory.getLog(SeleniumTestCase.class);
protected static Selenium selenium = null;
/** *//**
* 包含了登录的代码,保证在一个测试内部只执行一次开启浏览器并登录操作
* @throws Exception
*/
@BeforeClass
public static void startSelenium() throws Exception {
log.debug("Starting Selenium");
selenium = SeleniumSession.getCurrentSession().getSelenium();
}
/** *//**
* 在该类包含的所有测试结束之后关闭浏览器
* @throws Exception
*/
@AfterClass
public static void stopSelenium() throws Exception {
log.debug("Stoping Selenium");
selenium.stop();
}
}
这个里面的selenium = SeleniumSession.getCurrentSession().getSelenium();其实是个singleton,第一次open new,后来就直接返回selenium的instance(具体参考其它文章)。
这样做非常舒服,因为完全不是Trick,而是新的feature,用起来踏实。这样,这个类的所有@Test就会公用一个selenium打开的浏览器了。
那么缺点是什么呢?缺点是放到CI环境的时候如果使用我们习惯的Ant写执行脚本的话必须将Ant升级到1.7Beta3,因为Ant 1.6.5的Junit task不支持JUnit4……当然升级并不会带来代码的变化,但是问题在于Ant 1.7还是Beta,而且JUnit4需要JDK5的Annotation,你的PM估计要撇嘴了
2、JVM级别钩子法
因为JVM支持关闭时执行制定代码的钩子,而static代码会在类初始化时执行,再加上Ant调用的是类似命令行的java命令,实际上每一个测试运行在一个完整的JVM启动关闭周期里面,所以也就产生了这种解决方案。
public abstract class SomeTestCase extends TestCase {
static {
// perform the "global" set up logic
//这里的代码会在类初始化时执行,所以相当于BeforeClass
log.debug("Starting Selenium");
selenium = SeleniumSession.getCurrentSession().getSelenium();
// and now register the shutdown hook for tear down logic
//将一个匿名方法写到这里,就相当于AfterClass
Runtime.getRuntime().addShutdownHook(
new Thread(){
public void run() {
log.debug("Stoping Selenium");
selenium.stop();
}
}
);
}
}
3、还有别的方法,这个来自Selenium网站,似乎是不错的中庸方案。
import junit.framework.*;
import junit.extensions.TestSetup;
public class AllTestsOneTimeSetup {
public static Test suite() {
TestSuite suite = new TestSuite();
suite.addTest(SomeTest.suite());
suite.addTest(AnotherTest.suite());
TestSetup wrapper = new TestSetup(suite) {
protected void setUp() {
oneTimeSetUp();
}
protected void tearDown() {
oneTimeTearDown();
}
};
return wrapper;
}
public static void oneTimeSetUp() {
// one-time initialization code
}
public static void oneTimeTearDown() {
// one-time cleanup code
}
}
这个好像是比较正统的方案,不好意思我并没有试验,但是看起来这的确可能是限定用JDK 1.4或JUnit 3.8.1的最佳解决方案。欢迎尝试。相关的连接参考这里:http://www.cs.wm.edu/~noonan/junit/doc/faq/faq.htm#organize_3
转自 :http://www.blogjava.net/iamtin/archive/2006/11/17/81802.html
分享到:
相关推荐
个非常强大的单元测试包,可以对一个/多个类的单个/多个方法测试,还可以将不同的 TestCase组合成 TestSuit,使测试任务自动化。Eclipse同样集成了 JUnit,可以非常方便 地编写 TestCase。 我们创建一个 Java...
5.重载setUp()和tearDown()方法,setUp()方法用于执行每个测试用例是进行环境的初始化工作(比如打开数据库连接)。 6.tearDown()方法用于执行每个测试用后清除环境(比如关闭数据库连接) 7.编写每个测试用例,写...
因此我们要使用junit测试void方法,必须找到一个有实际返回值的方法来暂时替代void方法,但此方法只作为被测void方法的入口和出口,测试程序所调用的仍旧是原void方法。为了实现这种测试方式,我们按照如下步骤进行...
JUnit 是一个开源的测试框架,由 Kent Beck 和 Erich Gamma 于 2000 年开发。JUnit 的主要目标是提供一个简单、灵活的测试框架,帮助开发者编写可靠的测试用例。JUnit 的核心组件包括 TestRunner、TestCase 和 ...
JUnit 在调用每个@Test 方法之前,为测试类创建一个新的实例,以确保测试方法之间的独立性。 测试集 测试集是一组相关测试的集合,可以将多个测试类归入一组,方便管理和运行测试。测试集可以使用_suite_类来表示...
当一个测试方法还没有具备测试条件时可以先标志为忽略的测试方法 @BeforeClass:在所有测试方法执行前执行,只执行一次 ,且必须为static void,一般用于初始化一些共享的实例或加载共享的资源 @AfterClass:在所有...
南邮软件工程实验 Junit测试 在软件工程领域中,单元测试是一个...本实验为软件工程领域中的单元测试提供了一个实践示例,展示了Junit的使用方法和单元测试的基本概念,并为后续的软件开发和测试提供了有价值的经验。
@Before:在每一个测试方法执行前执行的方法,用于初始化方法 @After:在第一个测试方法执行后执行的方法,用于释放资源 @Test:标志该方法为测试方法,在此可以测试期望异常和超时时间 @Ignore:标志该方法为忽略的...
Junit 通常用于那些有明确返回值的方法的测试...因此我们要使用junit测试void方法,必须找到一个有实际返回值的 方法来暂时替代void方法,但此方法只作为被测void方法的入口和出口,测试程序所调用的仍旧是原void方法。
@BeforeClass 全局只会执行一次,而且是第一个运行 @Before 在测试方法运行之前运行(每个测试方法之前都会执行一次) @Test 测试方法 @After 在测试方法运行之后允许(每个测试方法之后都会执行一次) @AfterClass ...
JUnit 在测试驱动的开发方面有很重要的发展,是起源于 JUnit 的一个统称为 xUnit 的单元测试框架之一。 2 单元测试概念 单元:在Java中,一个类就是一个单元 单元测试:程序猿编写的一小段代码,用来对某个类中的...
junit.extensions.TestSetup.class junit.extensions.package-info.class junit.framework.Assert.class junit.framework.AssertionFailedError.class junit.framework.ComparisonCompactor.class junit.framework....
Android 单元测试,JUnit的4大功能 1. 管理测试用例。修改了哪些代码,这些代码的修改...以上4大功能,在JUnit的框架中是如何实现的了,在下一篇幅JUnit例子分析中,通过一个简要的例子,详细说明4大功能是如何实现的。
在编写测试用例时,我们还需要实现 setUp 和 tearDown 这两个方法,前者在每个测试方法开始之前执行,多用来做初始化;后者在每个测试方法完成之后执行,多用来清理资源。 本教程为初学者提供了一个基本的 NetBeans...
介绍有关Junit和多线程测试的问题。Junit和许多开源软件项目集成在一起,但是Junit执行多线程的单元测试有一些问题。这篇文章介绍Junit的一个扩展类库———GroboUtils
Junit 5中文帮助指南,JUnit 5跟以前的JUnit版本不一样,它由几...此外,平台还提供了一个从命令行或者 Gradle 和 Maven 插件来启动的 控制台启动器 ,它就好比一个 基于JUnit 4的Runner 在平台上运行任何TestEngine。
它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中最为成功的一个。 JUnit有它自己的JUnit扩展生态圈。多数Java的开发环境都已经集成了JUnit作为单元测试的工具。 [1] JUnit是由 Erich ...
它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中最为成功的一个。 JUnit有它自己的JUnit扩展生态圈。多数Java的开发环境都已经集成了JUnit作为单元测试的工具。 [1] JUnit是由 Erich ...
Junit中的基本注解(教学视频) Junit中的基本注解,是必须掌握的。 @BeforeClass – 表示在类中的任意public static void方法执行之前执行 ...@Test – 使用该注解标注的public void方法会表示为一个测试方法
JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage,包含依赖包:junit-jupiter-5.5.1.jar,junit-jupiter-engine-5.5.1.jar,junit-...JUnit Vintage提供了一个在平台上运行JUnit 3和JUnit 4的TestEngine 。