《精通移动App测试实战:技术、工具和案例》一2.2 JUnit在Android开发中的应用-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

《精通移动App测试实战:技术、工具和案例》一2.2 JUnit在Android开发中的应用

简介:

本节书摘来自异步社区《精通移动App测试实战:技术、工具和案例》一书中的第2章,第2.2节,作者 于涌 , 王磊 , 曹向志,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.2 JUnit在Android开发中的应用

2.2.1 单元测试的重要性

前面我们提到了单元测试,那么什么叫单元测试呢?单元测试(Unit Testing),是指对软件中的最小可测试单元进行的检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如在Java中单元指一个类,在C语言里单元指一个函数等。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。通常,我们在编写大型应用系统的时候,都要写成千上万个方法或函数,这些方法或函数的功能通常都是有限的,但是它们却是这个应用系统的根基,只有确保每一个函数或者方法都实现了其意图,才能保证整个系统能够正常、准确地运行。千里之堤溃于蚁穴,如果我们没有对每一个细小的函数或者方法进行系统的单元测试,很有可能最后直接导致整个系统最终被淘汰的结果。由此可见,单元测试十分重要,也非常必要。

2.2.2 单元测试实施者

我们在进行软件开发过程中,发现在不同的软件企业可能会经常提到一个问题就是“单元测试”应该由谁来做?不同的软件企业可能答案也是不一样的,有的公司单元测试是由程序编写人员实施,有的企业则是由测试人员来实施,我们说其实施的形式无所谓,关键是针对单元测试一定要有实施效果,经过单元测试后的源代码的健壮性、稳定性、执行效率等方面一定要有提升的才是关键所在。也许我们听说过有很多著名的国际软件公司,它们的开发与测试人员的比例是10比1 ,20比1,有的甚至是50比1。看到这个数字,也许我们第一反应就是怎么可能?绝对不会吧?试想一下,如果自己的单位也这样去做后果是什么样呢?最后,我们可以得出一个一致的结论,对于我们公司若是这样的人员配比,开发的软件产品一定是一坨“屎”。结合作者以往在国内的一些中小型软件企业的工作经历来讲,也同意大家得出的最后结论。为什么同样的人员配比,在不同的软件企业得到的最终产品会有如此之大的差异呢?根本原因就是大家对待单元测试的态度不同,最终导致的结果不同。在国内很多程序编写人员认为凡是涉及到测试的,都应该由测试人员来做,不管是单元测试、功能测试、性能测试、安全性测试等统统应该由测试人员来搞,然而大多数公司在人员招聘的时候对测试人员的要求偏低,招聘的人员数量也较少,试想在招聘的时候仅仅要求做功能测试,公司3、5个人测试一个庞大的系统软件,在时间少、任务重的情况下,这些测试人员哪有时间进行其他类型的测试,同时在没有白盒测试经验的积累情况下,突然要求测试人员做基于源代码的单元测试工作是不是有点更加“搞笑”呢。与之不同,在国际上出名的一些大公司,它们的程序编写人员是具备单元测试理论和实践知识的,他们在编写程序代码的时候,就会对其实现的类的方法和模块功能进行单元测试,他们不仅仅把实现其负责的软件功能作为自己的工作内容,还把单元测试同样作为其重要职责之一。而专业的测试人员则主要针对软件集成、一些重要的容易被忽视的测试关键技术的应用做测试,这当然就减少了测试人员的工作量,也相应会提升测试产品的质量了。

由此,我们是不是能够得到一些启发呢?

单元测试应该是程序编写人员必备的一项基本素质,所有的程序编写人员应该把其作为自己工作内容的一部分,而专业的白盒测试人员也应该加强对程序编写人员相关单元测试理论和实践经验的培训与指导,不断提升程序编写人员的理论和实践经验。同时白盒测试人员应该更加关注系统的集成测试、接口测试和那些容易被程序编写人员忽视的一些地方的测试工作。

2.2.3 单元测试测试哪些内容

我们在进行单元测试时,通常应把以下内容作为单元测试的重点。

(1)核心的类方法。

(2)异常处理内容。

(3)边界条件。

(4)算法效率。

(5)业务逻辑。

(6)需求变动频繁之处。

2.2.4 单元测试不测试哪些内容

我们在进行单元测试时,通常不应把以下内容作为单元测试的内容。

(1)不测构造函数。

(2)不测Setter()、Getter()方法。

(3)不测框架。

2.2.5 创建基于Android的测试项目

前面我们介绍了一些关于单元测试的知识,相信大家都已经理解了,现在就让我们结合在1.5节实现的样例程序,如图2-2所示,作为我们使用JUnit进行单元测试的例子,来详细向大家介绍JUnit在基于Android项目进行单元测试的应用。


44cda24fa8bb31ac72766bc5c0f6555456c9993f

让我们再看一下这个小应用的完整实现源代码。

MainActivity.java文件内容如下。

package com.yuy.calculatoroftwonum;

import android.R.string;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {

  public int add(int num1,int num2){
    return num1+num2;
  }

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button calc = (Button)findViewById(R.id.btncalc);
    calc.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        // TODO Auto-generated method stub
        EditText t1 = (EditText)findViewById(R.id.edtnum1);
        EditText t2 = (EditText)findViewById(R.id.edtnum2);

        int a= Integer.parseInt(t1.getText().toString());
        int b= Integer.parseInt(t2.getText().toString());  
        String s= Integer.toString(add(a, b));
        Toast.makeText(MainActivity.this,s, Toast.LENGTH_LONG).show();
      }
    }
    );
    Button exit = (Button)findViewById(R.id.btnexit);    
    exit.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        finish();
      }
    });
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
      return true;
    }
    return super.onOptionsItemSelected(item);
  }
}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享: