《精通移动App测试实战:技术、工具和案例》一2.2 JUnit在Android开发中的应用
本节书摘来自异步社区《精通移动App测试实战:技术、工具和案例》一书中的第2章,第2.2节,作者 于涌 , 王磊 , 曹向志,更多章节内容可以访问云栖社区“异步社区”公众号查看
前面我们提到了单元测试,那么什么叫单元测试呢?单元测试(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](https://yqfile.alicdn.com/44cda24fa8bb31ac72766bc5c0f6555456c9993f.png)
让我们再看一下这个小应用的完整实现源代码。
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); }
异步社区 异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
相关文章
- [Android Pro] 完美解决 No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android
- [Android] 解析android framework下利用app_process来调用java写的命令及示例
- WP7和Android控件对照表
- Android自定义控件----RadioGroup实现APP首页底部Tab的切换
- Android群英传笔记——第八章:Activity与Activity调用栈分析
- 《android开发艺术探索》读书笔记(十一)--Android的线程和线程池
- SAP UI5 应用开发教程之五十 - 如何使用 Cordova 将 SAP UI5 应用生成一个能在 Android 手机上安装的混合应用试读版
- Android实战之app版本更新升级全文章(三)
- android系统目录结构
- Android【报错】. lang。android.app ClassCastException。SharedPreferencesImpl不能被强制转换为android.content.Shared
- Android实现相对布局的个人界面
- Android 12.0 ResolverActivity.java多个app选择界面去掉始终保留仅有一次
- Android 12.0 第三方无源码app根据包名默认横屏显示
- Android app实现高斯模糊背景功能
- android 自定义圆形水波纹进度条
- Android 10.0 展讯lowmemorykiller低内存保活白名单,避免app在低内存被杀进程
- Android 10.0 根据包名授予app所需的权限
- Android 进入其他app和退出App杀死进程的方法详解
- 【Kotlin 协程】Flow 异步流 ② ( 使用 Flow 异步流持续获取不同返回值 | Flow 异步流获取返回值方式与其它方式对比 | 在 Android 中使用 Flow 异步流下载文件 )
- 【Android Gradle 插件】Gradle 自定义 Plugin 插件 ③ ( 自定义插件作用 | Android Gradle 插件的扩展 | 自定义 Extension 扩展 )
- 【错误记录】Android Studio 编译时 lint 检查报错 ( WARNING: DSL element ‘android.dataBinding.enabled‘ is obsolet )
- Android培训班(8)
- Android培训班(35)
- app自动化测试(Android)--App 控件定位
- Android性能优化系列 + Android官方培训课程中文版
- Android面试-Android性能优化和内存优化、APP启动速度一线大厂的实战案例解析
- android(安卓) 修改app应用图标
- android外设开发实战-音乐播放器