如何在Android上测试异步任务

移动开发 Android
Android中的测试(宽泛的定义)是一个单元测试集合的扩展。涉及初始化、关闭测试,包含setUp()和tearDown()操作,使用反射 的方式推断出不同的测试方式(从JUnit4开始我们就可以使用注释来指定的优先级和执行所有测试)。

最近,在Sixt(德国比较大的一个汽车租赁网站)上,我们把我们的开发环境从Eclipse迁移到Android Studio。这也就意味着我们进入了新的编译系统——Gradle,并且把TDD(测试驱动开发)和CI(持续集成)纳入我们的软件开发流程。这里不是 讨论在软件开发中引入CI会带来怎样的好处,而是讨论在Android中当测试UI之外的线程时会出现的问题。

Android中的测试(宽泛的定义)是一个单元测试集合的扩展。涉及初始化、关闭测试,包含setUp()和tearDown()操作,使用反射 的方式推断出不同的测试方式(从JUnit4开始我们就可以使用注释来指定的优先级和执行所有测试)。一个典型的测试结构如下:

  1. public class MyManagerTest extends ActivityTestCase { 
  2.    
  3.     public MyManagerTest(String name) { 
  4.         super(name); 
  5.     } 
  6.    
  7.     protected void setUp() throws Exception { 
  8.         super.setUp(); 
  9.     } 
  10.    
  11.     protected void tearDown() throws Exception { 
  12.         super.tearDown(); 
  13.     } 
  14.    
  15.     public void testDummyTest() { 
  16.         fail("Failing test"); 
  17.     } 
  18.    

这是一个非常明显的示例:实际开发中,我们想要测试例如HTTP响应、SQL存储等等。在Sixt我们遵从一种Manager/Model方法:每 个Model包含一个实体(车、顾客等)的表现。每个Manager用不同的模型(例如,我们的LoginManager可能需要用户与之交互的模型)聚 合成一套功能。

大多数的Manager集中执行HTTP请求是要从后台获取数据。例如,我们用下面的代码来执行用户的登录:

  1. mLoginManager.performLoginWithUsername("username""password"new OnLoginListener() { 
  2.     @Override 
  3.     public void onFailure(Throwable throwable) { 
  4.         fail(); 
  5.     } 
  6.   
  7.     Override 
  8.     public void onSuccess(User customer) { 
  9.     //.. 
  10.     } 
  11. }); 

应用到我们自己的测试集合后,当得到预期之外的结果时,只是让这一结果失败。我们可以看到为什么在onFailure()函数中我们调用了 fail()。接下来,即使我用一个错误的用户名也能通过这个测试。思前想后,测试似乎是按照代码顺序执行的,但并没有等到回调函数的结果返回再向下执 行。

这显然不是一个好方法。因为现在的程序经常通过异步任务和回调方法从后台获取数据。尝试UIThread测试仍然不行。

***,我发现下面这种方法可以行得通。只是用简单的CountDownLatch信号对象来实现wait-notify机制(你也可以用syncronized(lock){... lock.notify();},只是这样代码并不美观而已)

那么之前的代码就变成了下面的模样:

  1. final CountDownLatch signal = new CountDownLatch(1); 
  2. mLoginManager.performLoginWithUsername("username""password"new OnLoginListener() { 
  3.     @Override 
  4.     public void onFailure(Throwable throwable) { 
  5.         fail(); 
  6.         signal.countDown(); 
  7.     } 
  8.   
  9.     Override 
  10.     public void onSuccess(User customer) { 
  11.         signal.countDown(); 
  12.     } 
  13. }); 
  14. signal.await(); 

 

责任编辑:闫佳明 来源: blog.jobbole
相关推荐

2022-08-30 19:14:31

LinuxBash

2022-09-13 08:40:24

AndroidLinux

2019-05-29 08:00:00

Linux计划任务cron

2017-02-27 18:26:45

UbuntuADBAndroid

2019-04-29 10:00:50

Windows 10全屏模式任务栏

2013-08-07 09:58:01

2015-12-29 13:59:53

Ubuntu 15.0CentOS 7Android Stu

2011-10-31 15:40:07

TouchpadAndroid

2023-07-31 08:05:30

Spring任务调度

2019-10-23 10:40:06

Windows 10任务栏截图工具

2018-07-30 09:42:09

AndroidWineWindows App

2019-01-04 10:45:31

Windows 10Android应用程序

2023-11-26 16:23:16

FedoraVSCodium

2021-07-10 11:20:44

FreeDOS归档文件

2018-10-15 15:23:50

UbuntupipPython

2020-04-21 14:21:31

LinuxPython

2018-12-11 11:00:50

Linux字体命令

2019-07-22 08:05:21

MacOSElasticsear

2020-06-22 08:50:15

WindowsPython编程语言

2019-08-30 11:20:28

UbuntuVirtualBoxLinux
点赞
收藏

51CTO技术栈公众号