文档章节

测试异步任务的小技巧

c
 chenming
发布于 2014/04/23 14:46
字数 366
阅读 56
收藏 4
点赞 0
评论 0

测试异步任务时常常遇到后台线程还没完成,但测试线程已结束的情况。这时往往不能得到正确的测试结果。

最简单的办法是预估测试可能消耗的时间,比如为 5000毫秒,然后在开始测试后调用 Thread.sleep() 方法让测试线程休眠,防止测试过快结束。

public void testDoWork() throws Exception {

	// 启动异步测试任务
	doWork();

	Thread.sleep(6000);
}

上面的做法主要问题是异步任务执行时间可能不确定,休眠时间无法预估。其实使用 CountDownLatch 可以非常优雅地解决这个问题,代码如下:

public class TestDummy extends TestCase {

	private Dummy dummy;

	@Override
	protected void setUp() throws Exception {
		super.setUp();
		dummy = new Dummy();
	}

	public void testFoo() throws Exception {
		final CountDownLatch signal = new CountDownLatch(2);
		
		dummy.downloadInBg("正确的密码", new OnFinishListener() {

			@Override
			public void onFinish(boolean ok) {
				assertTrue(ok);
				signal.countDown();
			}
		});

		dummy.downloadInBg("不正确的密码", new OnFinishListener() {

			@Override
			public void onFinish(boolean ok) {
				assertFalse(ok);
				signal.countDown();
			}
		});

		signal.await();
	}
}

class Dummy {

	void downloadInBg(final String password, final OnFinishListener listener) {
		new Thread() {
			public void run() {
				download(password, listener);
			}
		}.start();
	}
	
	void download(String password, OnFinishListener listener) {
		try {
			// 模拟建立连接
			TimeUnit.SECONDS.sleep(1);
			if (!password.equals("正确的密码")) {
				throw new Exception();
			}

			// 模拟下载
			TimeUnit.SECONDS.sleep(5);
			listener.onFinish(true);
		} catch (InterruptedException e) {
			listener.onFinish(false);
		} catch (Exception e) {
			listener.onFinish(false);
		}
	}

	interface OnFinishListener {
		void onFinish(boolean ok);
	}
}

参考: 在Android上测试异步任务

© 著作权归作者所有

共有 人打赏支持
c
粉丝 2
博文 25
码字总数 24719
作品 0
南宁
NodeJS开发者-资质分级评判标准

这回须纯属本人杜撰,但也是参考过诸多Node资料之后的断言,仅供参考。 》》初级 独立完成node开发环境在制定系统平台的安装配置;熟悉javascript语言语法规范;熟悉JSON数据结构;了解Commo...

Channely ⋅ 2015/07/22 ⋅ 0

@EnableAsync和@Async开始异步任务支持

Spring通过任务执行器(TaskExecutor)来实现多线程和并发编程。使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor.在开发中实现异步任务,我们可以在配置类中添加@EnableAsyn...

u014231523 ⋅ 2017/07/28 ⋅ 0

Spring Boot使用@Async实现异步调用:使用Future以及定义超时

之前连续写了几篇关于使用实现异步调用的内容,也得到不少童鞋的反馈,其中问题比较多的就是关于返回的使用方法以及对异步执行的超时控制,所以这篇就来一起讲讲这两个问题的处理。 如果您对...

翟永超 ⋅ 04/15 ⋅ 0

Promise的前世今生和妙用技巧

浏览器事件模型和回调机制 JavaScript作为单线程运行于浏览器之中,这是每本JavaScript教科书中都会被提到的。同时出于对UI线程操作的安全性考虑,JavaScript和UI线程也处于同一个线程中。因...

zting科技 ⋅ 2017/01/09 ⋅ 0

深入分析 Java I/O 的工作机制(四)

I/O 调优 下面就磁盘 I/O 和网络 I/O 的一些常用的优化技巧进行总结如下: 磁盘 I/O 优化 性能检测 我们的应用程序通常都需要访问磁盘读取数据,而磁盘 I/O 通常都很耗时,我们要判断 I/O 是...

Mysoft ⋅ 2015/09/24 ⋅ 0

软件测试江湖(三)心得技巧篇

有人的地方就有江湖,有江湖的地方就有恩怨。有的恩怨避无可避,有的本可以避免,只是因为年轻不懂事,不懂得江湖的规矩,惹下许多的是非。软件测试江湖也是江湖,也有一些小技巧。 1) Bug记...

萌虎萌虎 ⋅ 2017/05/12 ⋅ 0

Spring Boot教程(三十二)异步方法

创建工程 在pom文件引入相关依赖: 创建一个请求的 githib的service: 通过,RestTemplate去请求,另外加上类@Async 表明是一个异步任务。 开启异步任务: 通过@EnableAsync开启异步任务;并...

abbie265 ⋅ 02/27 ⋅ 0

JavaScript异步执行辅助工具--ocSteps

ocSteps 是一个JavaScript异步执行辅助工具,主要用于支持 Node.js 中的大量异步API以及操作,以及前端浏览器里的异步任务(例如Ajax)。如果你听说过“回调地狱”这个词,那么,ocSteps 的用...

周谦 ⋅ 2013/05/11 ⋅ 0

一篇文章读懂JavaScript的EventLoop

JavaScript的单线程 众所周知JavaScript程序是单线程的执行,也就是说,同一时刻只能做一件事,这也是由于JavaScript本身就是为了浏览器而生,主要用途是用户交互和操作dom,为什么是单线程?...

阳光的记忆 ⋅ 05/10 ⋅ 0

小计使用多线程和gevent来提高celery性能及稳定性

前言: 有朋友问我,我那个任务队列是怎么实现,他的疑问其实主要是celery不支持多线程。先说说我那实现的方法,其实我的做法和celery、rq这样的框架很像的,都是把任务push到队列里面,然后...

rfyiamcool ⋅ 2014/07/27 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 20分钟前 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 29分钟前 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 38分钟前 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 50分钟前 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 今天 ⋅ 0

到底会改名吗?微软GVFS 改名之争

微软去年透露了 Git Virtual File System(GVFS)项目,GVFS 是 Git 版本控制系统的一个开源插件,允许 Git 处理 TB 规模的代码库,比如 270 GB 的 Windows 代码库。该项目公布之初就引发了争...

linux-tao ⋅ 今天 ⋅ 0

笔试题之Java基础部分【简】【二】

1.静态变量和实例变量的区别 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变...

anlve ⋅ 今天 ⋅ 0

Lombok简单介绍及使用

官网 通过简单注解来精简代码达到消除冗长代码的目的 优点 提高编程效率 使代码更简洁 消除冗长代码 避免修改字段名字时忘记修改方法名 4.idea中安装lombnok pom.xml引入 <dependency> <grou...

to_ln ⋅ 今天 ⋅ 0

【转】JS浮点数运算Bug的解决办法

37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数) 我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998 怎么会这样,两个只有一位小数的数字相乘,怎...

NickSoki ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部