《精通移动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);
  }
}
相关文章
|
13天前
|
数据采集 JSON JavaScript
Cypress 插件实战:让测试更稳定,不再“偶尔掉链子”
本文分享如何通过自定义Cypress插件解决测试不稳定的痛点。插件可实现智能等待、数据预处理等能力,替代传统硬性等待,有效减少偶发性失败,提升测试效率和可维护性。文内包含具体实现方法与最佳实践。
|
2月前
|
存储 关系型数据库 测试技术
玩转n8n测试自动化:核心节点详解与测试实战指南
n8n中节点是自动化测试的核心,涵盖触发器、数据操作、逻辑控制和工具节点。通过组合节点,测试工程师可构建高效、智能的测试流程,提升测试自动化能力。
|
3月前
|
Web App开发 人工智能 JavaScript
主流自动化测试框架的技术解析与实战指南
本内容深入解析主流测试框架Playwright、Selenium与Cypress的核心架构与适用场景,对比其在SPA测试、CI/CD、跨浏览器兼容性等方面的表现。同时探讨Playwright在AI增强测试、录制回放、企业部署等领域的实战优势,以及Selenium在老旧系统和IE兼容性中的坚守场景。结合六大典型场景,提供技术选型决策指南,并展望AI赋能下的未来测试体系。
|
3月前
|
存储 人工智能 算法
AI测试平台实战:深入解析自动化评分和多模型对比评测
在AI技术迅猛发展的今天,测试工程师面临着如何高效评估大模型性能的全新挑战。本文将深入探讨AI测试平台中自动化评分与多模型对比评测的关键技术与实践方法,为测试工程师提供可落地的解决方案。
|
27天前
|
人工智能 自然语言处理 JavaScript
Playwright MCP在UI回归测试中的实战:构建AI自主测试智能体
Playwright MCP结合AI智能体,革新UI回归测试:通过自然语言驱动浏览器操作,降低脚本编写门槛,提升测试效率与覆盖范围。借助快照解析、智能定位与Jira等工具集成,实现从需求描述到自动化执行的闭环,推动测试迈向智能化、民主化新阶段。
|
3月前
|
人工智能 缓存 测试技术
Playwright进阶指南 (6) | 自动化测试实战
2025企业级测试解决方案全面解析:从单元测试到千级并发,构建高可用测试体系。结合Playwright智能工具,解决传统测试维护成本高、环境依赖强、执行效率低等痛点,提升测试成功率,内容从测试架构设计、电商系统实战框架、高级测试策略、Docker化部署、CI/CD集成及AI测试应用,助力测试工程师掌握前沿技术,打造高效稳定的测试流程。
Playwright进阶指南 (6) | 自动化测试实战
|
2月前
|
人工智能 数据可视化 测试技术
AI 时代 API 自动化测试实战:Postman 断言的核心技巧与实战应用
AI 时代 API 自动化测试实战:Postman 断言的核心技巧与实战应用
397 11
|
2月前
|
人工智能 Java 测试技术
单元测试覆盖率的自动控制技术
Jacoco是Java程序覆盖率工具,可以在pom.xml通过配置来自动控制程序的覆盖率
66 5
|
2月前
|
存储 测试技术 API
数据驱动开发软件测试脚本
今天刚提交了我的新作《带着ChatGPT玩转软件开发》给出版社,在写作期间跟着ChatGPT学到许多新知识。下面分享数据驱动开发软件测试脚本。
68 0
|
3月前
|
算法 测试技术 API
从自学到实战:一位测试工程师的成长之路
在技术快速发展的今天,自动化测试已成为提升职场竞争力的关键技能。本文讲述了一位测试工程师从自学到实战的成长之路,分享他在学习UI、APP和API自动化过程中遇到的挑战,以及如何通过实际项目磨炼技术、突破瓶颈。他从最初自学的迷茫,到实战中发现问题、解决问题,再到得到导师指导,逐步掌握测试开发的核心思维,并向测试平台建设方向迈进。文章总结了他从理论到实践、从执行到思考的转变经验,强调了实战、导师指导和技术服务于业务的重要性。最后,邀请读者分享自己的技术突破故事,共同交流成长。