2011-06-07 105 views
44

我在制作Android应用程序方面有相当丰富的经验。对于我的新项目,我们决定进行测试驱动开发(TDD)。我一直在Robotium用户场景测试中弄湿我的手,并且它工作正常并且看起来也很容易。Android测试驱动开发

对于单元测试,我尝试使用(MockContext Android Class)来模拟Context,但我无法这样做。我通过这个博客http://sites.google.com/site/androiddevtesting/,并通过这个http://sdudzin.blogspot.com/2011/01/easy-unit-testing-for-android.html,这表明嘲笑Android应用程序仍然非常有限和困难,并建议使用PowerMock,jMockit,JeasyTest或Roboelectric(与Mockito和Maven结合)甚至RoboGuice。

我想从你们那里得到你认为哪个单元测试框架最适合测试Android应用程序的建议。 (特别是测试Android类,可能会给出模拟上下文和其他模拟功能,以便尽可能使测试用例尽可能独立)。任何建议或指针都会有所帮助。由于

+1

参见[用于TDD资源在Android上](http://stackoverflow.com/questions/2336488/resources-for-tdd-on-android) – rds 2012-12-04 14:23:15

+1

另请参见[单元测试Android应用程序的最佳做法](http://stackoverflow.com/questions/522312/best-practices-for-unit-testing-android-apps) – rds 2012-12-04 14:30:04

回答

30

对于关闭元件测试,看看Robolectric

有关设备的测试,看看Borachio

底线:它仍然是非常,非常困难做好。事情正在改善(今天的情况比6个月前好得多),但Android是我曾经编写程序的最具测试敌对性的环境。

+3

Borachito已弃用。 [Mockito现在有Android支持](http://www.paulbutcher。com/2012/05/mockito-on-android-step-by-step /) – rds 2012-12-04 10:55:59

+3

9个月后,对此有何更新? – 2013-03-14 11:29:54

+0

对Espresso有何建议? – 2013-11-01 15:53:05

4
  • 我在TDD(或BDD)的Activities中使用ActivityInstrumentationTestCase2,并为所有逻辑编写正常的单元测试。这也有助于我将逻辑与活动分开。
  • 自然界的移动应用程序是以用户界面为中心的。因此,即使它使得单元测试看起来像功能测试 一样,但它并不是 可以模拟出UI。
  • 要添加附加意图,您可以设置测试的自定义意图,或通过覆盖设置为所有测试设置。
  • Mock在Android上给了很多问题,所以我使用存根。

一个例子如下。该活动显示的Hello World当你点击一个按钮 -

public class HelloWorldActivityTest extends 
     ActivityInstrumentationTestCase2<HelloWorldActivity> { 

    private HelloWorld activity; 

    public HelloWorldActivityTest() { 
     super(HelloWorldActivityTest.class); 
    } 

    public void testShouldRenderGreetingOnButtonClick() { 
     activity = this.getActivity(); 
     Button button = (Button) activity.findViewById(R.id.btn_greet); 
     TouchUtils.clickView(this, button); 
     assertEquals("Hello World!", 
       ((TextView) activity.findViewById(android.R.id.greeting_text)) 
         .getText()); 
    } 

} 

编辑:因为我张贴的答案事情已经改变了。 Mockito现在对Android有相当不错的支持。对于测试,我们已经从ActivityInstrumentationTestCase2移动到Robolectric,仅仅是为了在开发阶段挖掘JVM的速度。 Android测试框架非常适合集成和功能测试,不适用于单元测试。

17

要做到TDD在Android中,我个人使用以下所有条件:

另外:使用依赖注入库(如DaggerRoboguice)将大大简化您的设备/集成测试。要在多个设备上运行测试,请考虑使用Spoon

+5

在我看来,我们不应该把Robotium - 仪器测试作为TDD的一部分。 TDD的核心规则之一是测试应在几秒钟内提供反馈。
我同意Robotium/Espresso等测试也很重要,但在TDD Red-Green-Refactor过程中不可能使用它。 – 2014-05-12 07:47:07

+0

谢谢你的这些链接,但FEST-android消失了:现在有https://github.com/square/assertj-android这是一个Fest Assert的分支 – vallllll 2015-02-12 19:12:02

+0

@vallllll谢谢,更新了链接 – Nima 2015-03-17 19:33:51