UT in groovy

本文探讨了单元测试(UT)在软件开发中的重要性,并澄清了一些误解,强调UT并非只是测试人员的工作,而是可以减少后期修复bug的时间和成本。接着,作者转向Groovy的UT,特别是介绍了基于Groovy的Spock框架,指出其简洁和强大的特点,并概述了Spock项目搭建、成员变量声明及初始化、测试实例创建等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

UT(unit test)在软件开发中扮演着非常关键的作用,以前和朋友聊天时也有讨论过UT,但似乎对UT的重要性并没有那么强烈的认知。从我个人经验讲,我本人是从事java后端开发的工作,刚开始和很多人的认识一样,把UT看成一种应付,因为很多公司都特别强调UT覆盖率,我也见过很多团队为了应付老板制定的指标而一段时间内专门补UT,但是我认为对软件的最终质量并没有什么效果。

个人认为,关于UT存在以下事实与谬误
1.UT应该是测试的工作。一般而言,测试人员更多地关注功能的测试和性能测试,而且很多测试用例是基于需求说明开发的,因此测试人员只需要对需求说明上的功能点进行测试。所导致的后果就是,目前很多项目没有需求说明,或需求说明不规范只包含部分关键功能,从而依靠开发或产品与测试人员进行交流,这种主观性极大增加了bug出现的几率。
2.UT增加了软件开发的工作周期。很多人想当然的认为,UT开发的时间延长了项目的deadline,通常UT的开发占用实际开发量的将近1/3,但项目实施中占用最多的并不是开发,而是需求、设计与后期的维护,因此,第一点:UT并不会占用更多的时间,第二点:UT减少了后续修复bug的成本(时间和金钱),UT将更多的问题暴露在前期。

前言讲述了UT的事实与谬误,希望更多的同行能从根本上意识到UT的重要性。言归正传,这次我主要希望与大家分享基于Groovy的UT。写过java的想必都应该使用过junit测试框架,那今天我给大家介绍另外一种基于groovy的框架Spock框架。其中的简洁强大在下面的介绍中自会体悟到。

一:Spock项目搭建。
主要包括pom文件的引入及类的新建,需要继承Specification类。

   //引入框架对应的pom文件
   <dependency>
      <groupId>com.dianping.spc</groupId>
      <artifactId>spc-common</artifactId>
      <version>0.4.1</version>
    </dependency> 

   //新建Spock项目
   class SpockTest extends Specification { 
   /**
    code section
   */

二.成员变量的声明及初始化

    //声明成员变量
    TestAction testActionStub //目标测试类
    TestService testServiceMock//目标测试类依赖的外部服务

    //初始化工作
    void setup() {
        testServiceMock = Mock()//不关心外部服务的实现,因此直接使用Mock
        tealSaleActionStub = [] //相当于new了一个对象
        testActionStub.testService = testServiceMock
    }

三.新建测试实例

     @Unroll
    def "testFun"(Integer param1, Integer param2, String param3) {
        /**
        *1.given部分用于测试用例运行之前初始化运行信息
        */
        given:
        //case1.初始化静态类的方法
        StaticClass.staticFun() >>Mock(String)
        ActionContext.getContext() >>Mock(ActionContext)
        //case2.mock父类的方法
        testActionStub.metaClass.fatherFun = {
            if (param1 <= 0) {
                return 0
            } else {
                return param1
            }
        }
        //case3.mock远程的方法
        testServiceMock.mockFun(_ as Long) >> { Long s ->
        }
        testServiceMock.mockFun(_) >> {}
        testServiceMock.mockFun(_ as List, _ ,_)>> {List i ->
            def list = i[0]
            if(list[0] == 1) {
                [1]
            }
        }
        /**
        *2.expect:待测试方法
        */
        expect:
        size == testActionStub.fun1().size()
        title == testActionStub.fun1().get(2).title
        /**
        *3.where:期望的输入和输出
        */
        where:
        param1 | param2 | param3
        1      | 3      | "团购立减"
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值