黑马程序员技术交流社区

标题: Android工具分享,JUnit入门指南(二) [打印本页]

作者: 张然龙    时间: 2014-7-30 12:25
标题: Android工具分享,JUnit入门指南(二)

因版字数限制,上部分内容请跳转链接:

传送门:Android工具分享,JUnit入门指南(一)


在Android中创建一个JUnit测试用例
Android应用程序通常是由一些Activity类组成的。事实上,每一个ACtivity都可以是一个独立实体,进行测试。Android SDK中包含了几个类来测试ACtivity类。现在我们将使用一个。

右键单击你的测试项目。选择“New”,然后“JUnit Test Case”:


在新建JUnit测试用例对话框上填写,使用超类是android.test.ActivityInstrumentTestCase2,其中T是我们要测试的Activity,如下图:


点击“完成”按钮,这个类就创建成功了。注意:由向导创建的默认构造函数是不正确的。我们需要修改它,让它不带任何参数,调用不同的super()的方法,代码如下:

  1. public ScreenValidation() {
  2.    super("com.mamlambo.testingproject.TestingProjectActivity",
  3.      TestingProjectActivity.class);
  4. }
复制代码


[size=1em][backcolor=rgb(108, 226, 108) !important]
[color=white !important][size=1em]?



setUp()方法中,应配置运行这个测试用例所需的所有东西。Activity实例随时可以被getActivity()方法调用。例如:如果我们想在测试中显示一个TextView在Activity上,我们可以实现setUp()方法,如下:

  1. TextView helloText;
  2. protected void setUp() throws Exception {
  3.   super.setUp();
  4.   helloText = (TextView) getActivity().
  5.      findViewById(R.id.hello_textview);
  6. }
复制代码


[size=1em][backcolor=rgb(108, 226, 108) !important]
[color=white !important][size=1em]?



在Android中添加单元测试
此时你可以创建各种测试。你可以获取到Activity布局上所有控件,以及在应用程序的任何代码。由于使用Activity测试用例,我们可能感兴趣于用户界面,布局,及功能。让我们看看TextView控件显示在屏幕上。

  1. public void testHelloTextVisibility() {
  2.    View container = getActivity().findViewById(R.id.container_layout);
  3.    int boundaryWidth = container.getWidth();
  4.    int boundaryHeight = container.getHeight();

  5.    int[] location = new int[2];
  6.    container.getLocationOnScreen(location);

  7.    int[] helloTextLocation = new int[2];
  8.    helloText.getLocationOnScreen(helloTextLocation);

  9.    Rect textRect = new Rect();
  10.    helloText.getDrawingRect(textRect);

  11.    boolean widerThanBoundary = (textRect.width() > boundaryWidth);
  12.    boolean tallerThanBoundary = (textRect.height() > boundaryHeight);
  13.    boolean extendsOffRight = location[0] + boundaryWidth
  14.      > helloTextLocation[0] + textRect.width();
  15.    assertTrue("Text wider than boundary", widerThanBoundary);
  16.    assertTrue("Text taller than boundary", tallerThanBoundary);
  17.    assertTrue("Text goes off right side", extendsOffRight);

  18.    // ... and so on
复制代码


[size=1em][backcolor=rgb(108, 226, 108) !important]
[color=white !important][size=1em]?



所有的测试方法必须用“test”做前缀。上面,我们已经创建了一个测试名为“HelloTextVisibility”的方法。如果测试通过或失败,assertFalse()都会被调用。(assertTrue()方法只有是true时调用。)

运行JUnit测试用例
运行测试和测试用例,点击Eclipse的Debug,选择Android JUnit测试。如果你喜欢,你还可以创建一个Android JUnit测试配置,自定义这些设置。
如下图,我们的小应用程序在横屏模式下,“Hello Text Visibility”测试通过:

但在竖屏模式下,未能通过测试:

很显然,我们的布局设计在竖屏模式下显示不正确。(注:这可能是设置的宽度像素超过了手机的,而没有使用合适的单位,如DP或是match_parent。)

Android应用程序的质量在于单元测试
创建单元测试时,必须小心谨慎。如果测试用例不正确,测试的东西通过了,也没有价值。这是非常糟糕的,因为它可能掩盖了一些问题。所以测试用例与代码本身一样重要。测试测试用例的主要方式是通过做代码审查,并确保它们确实在测试。

当然,测试Android框架的功能对于你的app来说,没有起到特别大的作用。比如,测试设置文本字段的值,然后读取它,看它是否相同。测试常规的TextView,并不是特别有意义的(除非你的SDK在一个新的设备上使用)。然而,如果是测试你自己实现的TextView,那就有必要了。

这并不是说任何代码框架都是那样的完美无缺,但测试的事情是值得花许多心思的去写测试开始的。如果失败了,比起的你的应用程序,你将有更大的问题。还有是对SDK之间的细微差别的测试,在上面的例子中,我们没有这么做,是因为我们使用了正确的SDK。

因此,如果你是自动化单元测试的新手,我们建议你做一些这方面的课题研究。一个不错的地方是JUnit.org

结论
在本教程中,你已经学会如何快速添加一个新的测试项目,并在Eclipse的Android项目中使用JUnit对你的app执行自动化测试。单元测试可以为逻辑测试,功能测试和用户界面测试等,不再是专门手动测试移动应用。然而,使用一个包含自动化单元测试的套件,有几大好处:它可以节省时间,金钱和资源,以及提供一套可靠的,重复性的测试,并且可以运行在许多不同的设备配置中。



作者: baby14    时间: 2019-5-20 09:35
多谢分享




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2