`

【转】单元测试——基础概念

 
阅读更多

单元测试——基础概念

 

前言

我们都写过的某种测试

不要惊讶,你已经进行过某种程度的单元测试。你见过提交代码前不做测试的开发人员吗?
在传统测试中,开发人员使用一个图形用户界面触发要测试的类的某个行为,然后检验结果。

那什么是单元测试,什么不是单元测试呢?

为什么不写单元测试

不想做

往往说不想的,其实是因为还不会。因为不会,所以想一想就很麻烦,还不如手工测试呢。

多余

我已经写好代码,然后还要去确认写好的逻辑,好多余

  • 我们不能确保我们的代码是100%正确的。有可能因为精神不好,原因需要抛异常的地方,忘了写一个throw呢?结果原来需要回滚的事业,没正常回滚。
  • 我们在写实现的有很多逻辑,甚至有一些异常处理。因为我们在假设某些场景。其实这些场景就是简单的单元测试。所以又写一遍会觉得很多余。
  • 代码都实现完了,写单元测试干什么。其实代码还没有实现完!有可能还要重构,有可能你还需要排错,有可能别人接手你的代码。但是你没有一个办法保证你的代码一直是正确的。

因为我们没有遵循正确的TDD实践,所以觉得不舒服和多余。

经常修改

单元测试一旦通过,不会经常修改。一般有两大类经常修改情况:

  • 确实需要修改单元测试,因为接口需求变更了。所以有些单元测试没有某些业务的考虑,所以要删除或者修改这些单元测试,否则反而会报红。
  • 但是往往更多的是第二类。接口需求不变,重构的时候因为报红了,所以强行修改单元测试。因为依赖变了,甚至有些顺序变了,所以原来的单元测试报红了。那说明本来的被单元测试的代码本身就依赖性太强。一般需要修改的是重构代码本身。而且单元测试的每个case最好是隔离的。

太浪费时间

是的,单元测试确实会增加编码的时间。但是从整个软件的交付时间比来说,有好的单元测试的时间会交付更快。一般有健全的单元测试,在测试阶段和维护阶段会花费更少的时间。我们在做的是一个完整的软件,所以时间应该算总的周期
另外一个原因,有可能是因为不熟练或者没有合适的工具,所以花了大量时间在重复的工作之上。

不务正业

其实咱们一直在做不务正业的事。调试代码,给代码加注释,画流程图,上网解决问题等等。这些其实都是开发者的日常工作。所以单元测试也是!!

这里也有一篇文章,也比较有意思:为什么要进行烦人的单元测试?

什么是单元测试

那到底什么是单元测试呢?

一个单元测试是一段自动化的代码,这段代码调用被测试的。这段代码调用被测试的工作单元,之后对这个单元的单个最终结果的某些假设进行检验。单元测试几乎都是用单元测试框架编写的。单元测试容易编写,能快速运行。单元测试可可靠、可读,并且可维护。只要产品代码不发生变化,单元测试的结果是稳定的。

特性

  • 它应该是自动化的,可重复执行。
  • 它应该很容易实现
  • 它应该第二天还有意义
  • 任何人都应该能一键运行它
  • 它应该运行速度很快
  • 它的结果应该是稳定的(如果运行之间没有进行修改的话,多次运行一个测试应该总是返回同样的结果)
  • 它应该能完全控制被测试的单元
  • 它应该是完全隔离的(独立于其他测试的运行)
  • 如果它失败了,我们应该很容易发现什么是期待的结果,进而定位问题所在

包含行为

  1. 准备(Arrange)对象,创建对象,进行必要的设置
  2. 操作(Act)对象
  3. 断言(Assert)某件事情是预期的。

结果类型

从调用系统的一个公共方法到产生一个测试可见的最终结果,其间这个系统发生的行为总称为一个工作单元。一个最终结果有三种形式

  1. 带有返回值的。即基于值的测试。
  2. 在方法调用前后,系统的状态或者行为有可见的变化 ,这种变化无需查询私有状态即可判断。即基于状态测试。
  3. 调用一个不受测试控制的第三方系统,这个第三方系统不返回任何值,或者返回值都被忽略。即交互测试。

验证

很多人把进行软件测试的行为和单元测试概念混为一谈。要澄清这个误解,你首先应该回顾自己以前写过的测试,问自己如下问题。

  1. 我两周前写的一单元测试,今天还能运行并得到结果吗?几个月前的呢?几年前的呢?
  2. 我两个月前写的单元测试,我团队里任何一个人都能运行它们并得到结果吗?
  3. 我能在几分钟内跑完我写过的所有单元测试吗?
  4. 我能一键运行我写过的所有单元测试吗?
  5. 我能在几分钟写出一个基本的测试吗?
    如果能的话,那就是单元测试。如果不能,那有可能就是集成测试。

什么是集成测试

那到底什么是集成测试呢?

集成测试是对一个工作单元进行的测试,这个测试对被测试的工作单元没有完全的控制,并使用该单元的一个或者多个真实依赖物,何如时间、网络、数据库、线程或者随机数产生器等
总的来说,集成测试会使用真实依赖物,而单元测试则把测试单元和基依赖物隔离开,以保证单元测试结果高度稳定

并不是说集成测试不重要!单元测试和集成测试具有同等重要的地位,但是这两个测试应该彼此分开,以营造一种“绿色安全区”的感觉

什么是TDD

上面说的是什么是单元测试。那么什么时候编写测试呢?很多人觉得为软件编写单元测试的最佳时机是软件编码完成以后,但是越来越多的人选择在产品代码编写之前写单元测试。这种方法称为测试优先或测试驱动开发(Test-Driven Development, TDD)。
执行步骤:

  1. 编写一个会失败的测试,以证明产品中代码或功能的缺失。编写测试的时候,要假设产品代码已经能工作了,这样测试的失败就说明产品代码中有缺陷。
  2. 编写符合测试预期的产品代码,使测试通过。产品代码应该尽量简单。
  3. 重构代码。如果测试通过了,你就可以编写下一个单元测试,或者进行重构,使代码可读性更强,或者去除重复代码等。

红-->绿-->重构


本文的概念大部分出自于《单元测试的艺术》,特此说明。因为书里的概念讲得是我想要的,比网上搜的其他资源要适合自己些。
更具体的概念可以翻阅《单元测试的艺术》。

分享到:
评论

相关推荐

    单元测试之道C#版——使用Nunit pdf格式

    总而言之,《单元测试之道C#版——使用Nunit》是C#开发者掌握单元测试和NUnit框架的宝贵资源,它将帮助你建立坚实的质量保证基础,提升代码的稳定性和可靠性。通过深入学习并实践书中的知识,你将能够更好地运用TDD...

    车载电子电器架构 —— 基础技术概念开发.docx

    ### 车载电子电器架构——基础技术概念开发 #### 一、基础技术概念介绍 在车载电子电器架构中,基础技术概念对于整个系统的开发至关重要。这部分内容将详细介绍与基础技术相关的各个概念及其作用。 - **...

    单元测试培训资料 Xunit系列示例 单元测试基础培训

    单元测试是软件开发过程中的重要环节,它旨在验证代码中的最小可测试单元——通常是函数、方法或类——是否按照预期工作。Xunit是一组用于多种编程语言的单元测试框架,其中包括C#、Java、Python等。这个“单元测试...

    软件测试资料——从基础开始

    这份名为“软件测试资料——从基础开始”的资源包,旨在为初学者提供一个全面了解软件测试的起点,涵盖了从基本概念到实践方法的多个方面。让我们深入探讨一下其中可能涉及的知识点。 首先,软件测试基础是学习任何...

    软件测试——基于JAVA的医院挂号系统的开发与测试.docx

    ### 软件测试——基于JAVA的医院挂号系统的开发与测试 #### 一、课程设计目的与任务 软件测试作为软件开发过程中不可或缺的一环,对于确保软件质量具有至关重要的作用。该课程设计的主要目的是让学生通过实际操作...

    有关单元测试的培训资料

    单元测试是一种软件开发过程中的重要环节,它主要针对软件中的最小可测试单元——通常是函数、方法或类——进行验证,确保这些单元按照预期工作。在本“有关单元测试的培训资料”中,我们将深入探讨单元测试的核心...

    软件测试——名词解释

    1. **测试类别**:测试类别包括单元测试、集成测试、系统测试和确认测试。单元测试专注于程序的最小可测试单元,通常是函数或方法。集成测试关注多个模块之间的交互,确保它们能协同工作。系统测试是对整个系统功能...

    单元测试相关文档两则_wwt

    单元测试是软件开发过程中的重要环节,它主要针对软件中的最小可测试单元——函数、方法或类进行验证,确保它们按预期工作。本压缩包包含两份关于单元测试的文档,分别为“单元测试.doc”和“单元测试基础知识.mht”...

    [Android Studio应用开发——基础入门与应用实战][方欣,杨勃][电子课件]

    【Android Studio应用开发——基础入门与应用实战】是针对初学者和希望提升Android应用程序开发技能的人群设计的一门课程。这门课程由专家方欣和杨勃共同编写,旨在通过电子课件的形式,深入浅出地讲解Android ...

    单元测试的艺术 源代码

    下面,我们将深入探讨单元测试的核心概念、相关工具、最佳实践以及Roy Osherove在书中强调的一些关键点。 单元测试是一种软件质量保证方法,它涉及到编写自动化测试用例来验证程序的最小可测试单元——通常是函数、...

    最全面的软件测试教程——第一部分

    在“最全面的软件测试教程——第一部分”中,我们将会深入探讨软件测试的基本概念、重要性以及如何进行有效的测试工作。软件测试是确保软件质量的关键环节,它旨在发现并修复程序中的错误、缺陷和遗漏,以提高产品的...

    北大青鸟Java学士后第二单元项目——u2超市管理系统项目

    【北大青鸟Java学士后第二单元项目——u2超市管理系统项目】 该项目是北大青鸟教育机构在Java学士后课程中的第二个单元实践项目,旨在帮助学员深化对Java编程语言的理解,尤其是其在实际业务场景中的应用。通过设计...

    单元测试最佳实践(JAVA)

    单元测试是软件测试的一个重要分支,它专注于对软件中的最小可测试单元——通常是方法或函数进行测试。通过单元测试,开发者能够验证代码的各个部分是否按照预期工作。 面向对象的概念首先与面向过程相对,面向过程...

    中山大学软件测试之单元测试课件

    中山大学软件测试之单元测试课件涵盖了软件测试领域的核心概念之一,即单元测试。单元测试是软件开发过程中非常重要的一个环节,它主要针对软件中的最小可测试单元——软件单元进行检查和验证。软件单元通常指的是...

    黑盒测试-白盒测试-单元测试.7z

    在软件测试领域,黑盒测试、白盒测试和单元测试是三个至关重要的概念,它们各自承担着不同的职责,确保软件产品的质量和可靠性。下面将详细解释这三个测试方法。 首先,我们来了解一下**黑盒测试**。黑盒测试,也...

    车载电子电器架构 —— 基础技术开发概述.docx

    ### 车载电子电器架构——基础技术开发概述 #### 一、基础技术开发概述 车载电子电器架构作为现代汽车的重要组成部分,对于提升车辆的安全性、舒适性以及智能化水平具有重要意义。随着汽车行业的快速发展,车载...

    单元测试详解

    #### 五、案例分析——ECshop中的单元测试实践 在ECshop这样一个基于PHP的电子商务平台中,我们将以JavaScript脚本语言中的`checkSearchForm`函数为例进行单元测试。 ##### 1. 函数介绍 `checkSearchForm`函数的...

    软件测试基础知识——适合初学者

    1. 单元测试:检查单个模块或组件的功能。 2. 集成测试:将模块组合成系统或子系统后进行测试,特别关注模块间的接口。 3. 系统测试:将整个软件系统看作一个整体,进行功能、性能和软硬件环境的全面测试。 4. ...

Global site tag (gtag.js) - Google Analytics