• 0
  • 0
分享

在构建软件系统时,测试是软件开发工作流程的必不可少的部分之一。作为软件开发人员,都希望编写的程序按预期工作。程序没有BUG,测试可以协助这个目标的达成。

本文将讨论一种称为单元测试的测试方法。什么是单元测试?应该如何实施?单测优点和局限性是什么?

什么是单元测试

单元测试的目标是隔离程序的每个部分并显示各个部分按预期工作。单元测试是由软件开发人员编写和运行的自动化测试,以确保应用程序的一部分(称为单元)按预期工作。

单元是可以在系统中逻辑隔离的最小代码段。这可以是单个函数、方法、过程、模块、类或对象。通常,一个单元有几个输入和一个输出。单元测试由软件开发人员在应用程序的开发(编码阶段)期间完成。

只有各个部分运行良好,整个系统才能运行良好。通过为最小的可测试单元编写测试,软件开发人员建立了整个系统将按预期工作的信心。一旦软件开发人员编写了单元测试,他们就可以在本地机器上运行它以检查测试是否通过。他们还可以运行所有其他预先存在的测试来检查它们是否仍然通过。

单元测试框架

软件开发人员通常使用单元测试框架来开发用于单元测试的自动化测试用例。单元测试框架是支持编写和运行单元测试的软件工具,包括构建测试的基础以及执行测试和报告结果的功能。有最流行的编程语言的单元测试框架。

在测试用例执行期间,框架记录未通过任何标准的测试并在摘要中报告它们。根据故障的严重程度,框架可能会停止后续测试。

单元测试还可以设置为在代码发布到暂存或生产环境之前在每个新构建上执行。通过这种方式,软件开发人员可以确保只有通过所有单元测试的代码才能进入实时环境。如果在构建过程中任何单元测试失败,软件开发人员可以在尝试再次发布之前先修复问题。

单元测试示例

下面是一个非常简单的例子,说明单元测试如何工作。我们有一个简单的add函数,它接收两个数字作为参数并返回两个数字相加的结果。这里我使用最近新学(其实复习)的Groovy单元测试框架Spock来演示。有兴趣的同学看看旧文章:

  • Maven和Gradle中配置单元测试框架Spock
  • Groovy单元测试框架spock基础功能Demo
  • Groovy单元测试框架spock数据驱动Demo
  • 人生苦短?试试Groovy进行单元测试
  • Spock 2.0 M1版本初探
  • 单元测试框架spock和Mockito应用
  • Groovy动态添加方法和属性及Spock单测
  •     static int add(int i, int j) {

  •         return i + j

  •     }

我们对add函数的非常简单的第一个单元测试如下。

    def "测试add方法"() {
        given: "Have Fun ~ Tester !"

        expect:
        sum == add(i, j)

        where:
        sum | i  | j
        2   | 1  | 1
        1   | -1 | 2
        0   | 0  | 0
    }

然后,我们可以为add函数添加更多单元测试,并使用其他示例输入来覆盖不同的情况,例如负数或无效的输入参数,以检查错误是否得到正确处理。这是一个非常简单的例子,但是,它在实践中展示了单元测试是如何工作的。

单元测试的好处

单元测试是一种软件测试方法,其中测试软件的各个单元、组件或模块以确定它们是否适合使用。因此,它有很多好处。随着软件系统的发展,软件开发人员从单元测试中获益更多。如果在早期开发中进行了适当的单元测试,最终将节省软件开发人员的时间和金钱。

单元测试在开发周期的早期发现问题。这包括软件开发人员实施中的错误。在开始编码之前或首次编写代码时发现错误的成本远低于稍后检测、识别和纠正错误的成本。

单元测试帮助软件开发人员创建更好的软件设计。如果编写得不好,代码可能无法或难以进行单元测试,因此单元测试可以迫使软件开发人员以更好的方式构建功能和对象。编写一套完整的测试的过程迫使软件开发人员仔细考虑输入、输出和错误条件,从而更清晰地定义单元所需的行为。

由于单元测试的模块化特性,软件开发人员可以测试软件系统的各个部分,而无需等待其他部分完成。这将帮助软件开发人员以小的敏捷增量创建他们的软件。

单元测试允许软件开发人员在以后轻松重构代码或升级系统库,并确保现有代码仍然正常工作。软件开发人员所做的任何导致现有单元测试失败的更改都可以快速识别并解决。单元测试检测可能破坏现有工作代码的更改。

单元测试创建系统文档作为积极的副作用。希望了解单元提供哪些功能以及如何使用它的软件开发人员可以查看单元测试以获得对单元接口 (API) 的基本了解。

单元测试限制

尽管单元测试有很多好处,但它也有一些局限性。

单元测试不会捕获软件系统中的每个错误。除非它是一个非常简单的系统,否则很难评估软件系统中的每个执行路径。单元测试仅限于测试单元本身的功能。它不会捕获其他错误,例如集成错误或性能错误。

如果被测单元的核心功能是与系统外部的事物交互,则设置单元测试可能很困难。在单元测试时,诸如数据库、文件系统或外部 API 之类的外部事物可能会带来挑战。软件开发人员可能不得不模拟与外部方的交互,这可能具有挑战性,而且作为测试还不够详尽。

Last

编写单元测试作为系统开发的一部分通常会让人感觉成本高昂且速度缓慢。需要编写更多代码,编写好的单元测试需要时间和精力。开发团队常犯的错误是跳过单元测试。

随着大多数软件系统的增长,它们将受益于广泛的单元测试覆盖范围。单元测试有助于更轻松地添加新功能、重构现有功能以及了解系统的现有单个组件。尽早添加单元测试最终将节省软件开发人员时间以提升效率。


  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 2017年8月开始接手做持续集成平台的工作,该平台包含打包发布,每日构建,稳定测试  首先收集现状,源码管理混乱,底层打包空间共用,apk打包在本地,没有稳定性测试,专项测试。需求整理,需要做源码管理,分离底层共用的空间,打包统一使用服务器打包,增加自动化测试 下面说下我们的每日构建跟稳定性测试:1.客户端每日构建  1.1、单元测试  单元测试主要是由开发负责编写的,主要是因为开发对产品更加的了解,同时测试开发团队人太少了,要做的事情好多,优先做其他的。关于框架选择,最初想要使用的方案是robolectric + junit4 + mockito + dagger2,然后被项目经理及总监否定...
            2 2 3029
            分享
          •   1 一个项目用敏捷管理还是瀑布式管理?  这可能是项目管理专业人士也会有疑惑的问题,早期的PMP认证还是讲五大过程组,讲瀑布式管理,但这两年的的pmp认证加入了更多的敏捷管理的部分。那我们项目到底是用敏捷还是瀑布式管理?  这取决于项目的特征?  学过PMP的的都知道,对于那种传统的、外部环境相对稳定、外部变更较少的项目来说,使用传统的瀑布式管理是可以的。对于需要快速响应市场变化,聚焦客户价值(在初期客户并不一定清楚项目价值),更快更准地发布可以使用的产品,那么使用敏捷管理显然更合适。然后瀑布和敏捷并非互斥的,这两者是可以随着项目的情况,进行一定的融合。 比如大瀑布里的小敏捷,大敏捷里的小...
            0 0 953
            分享
          •   新浪科技讯 北京时间1月16日晚间消息,据报道,微软正考虑对旧金山人工智能(AI)研究公司OpenAI投资100亿美元。分析人士称,这笔潜在交易有可能成为人工智能新时代的决定性交易。  如果微软对人工智能技术深远影响的押注是正确的,那么这笔交易还可能引发人工智能世界的一场重组,因为其他科技公司也竞相在“生成式人工智能”(Generative AI)的新领域争夺自己的位置。  上个月,OpenAI因为推出了一款智能聊天机器人系统ChatGPT而成为了全球关注的焦点。ChatGPT是一套人工智能系统,可以回答问题,并用听起来十分自然的语言生成文本。  ChatGPT很快就得到了微软的关注。微软...
            0 0 1080
            分享
          •   最近几年软件测试行业在如火如荼的发展壮大,互联网以及其他传统公司都需要大批量的软件测试人员,但是20年的疫情导致大规模裁员,让人觉得行业寒冬已来,软件测试人员的职业规划值得我们深度思考。  大家都比较看好软件测试行业,只是因为表面上看起来:钱多事少加班少。其实这个都是针对个人运气好的童鞋才会有此待遇。在不同的阶段做好不同阶段的事情,才有可能离这个目标更近,作为一枚软件测试人员,也许下面才是我们最真实的写照。  第一年  当年也是一头撞进了软件测试行业。迫切的想要了解这个行业,它的升职模式,如何才能薪资更高。但是以过来人的经历,告诉你:做好当前的事情。把上司交给你的每一份任务都仔细认真的去完...
            0 0 888
            分享
          • 冒泡排序算法的原理如下:比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。如图所示:代码实现如下:def buddle_sort(l): n=len(l) #把计算长度写到遍历外,可以避免每次都重新计算 for i in range(n-1): #从第一个遍历到倒数第二个 for i in r...
            0 0 1108
            分享
      • 51testing软件测试圈微信