• Spock单元测试框架介绍及在美团优选的实践___第一章


    Spock单元测试框架介绍及在美团优选的实践


    前言

    什么是单元测试,其实单元测试是在我们开发完功能之后,对于业务逻辑用到了第三方的调用,或者对数据库的操作等动作不能够支持的情况下,对业务功能进行以方法为颗粒度进行测试业务逻辑是否与预期的效果数据相等。在很多的一线互联网公司研发人员开发完功能之后都要进行单元测试的,保证行覆盖率、分支覆盖率符合标注之后,才可以上线,以减少线上事故发生。


    提示:以下是本篇文章正文内容,下面案例可供参考

    一、什么是Spock单元测试框架

    帮助大家提高开发测试效率。
    Spock是什么?和JUnit、jMock有什么区别?
    Spock是国外一款优秀的测试框架,基于BDD(行为驱动开发) 思想,功能强大,能够让我们的单元测试代码规范化,结构层次清晰。Spock结合Groovy动态语言的特点以及自身提供的各种标签
    种通用、简单、结构化的描述语言,让编写测试代码更加高效和简洁,
    官方的介绍如下:https://spockframework.org

    二、使用步骤

    1.引入maven依赖

        <!-- spock单元测试框架 -->
        <dependency>
          <groupId>org.spockframework</groupId>
          <artifactId>spock-core</artifactId>
          <version>2.0-groovy-3.0</version>
          <scope>test</scope>
        </dependency>
        <dependency>
          <groupId>org.codehaus.groovy</groupId>
          <artifactId>groovy</artifactId>
          <version>2.4.15</version>
        </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2.创建GoodsService订单业务类进行单测

    说明:
    creativeManagementTunnel.queryCreateUser()是查询数据库订单用户,但是数据库表还没建不支持查询,代码会走这段逻辑但是mock之后不会触发数据库操作。
    orgService.batchQueryUserInfoByMis()是查询数据库订单用户详细信息,但是数据库表还没建不支持查询,代码会走这段逻辑但是mock之后不会触发数据库操作。
    在这里插入图片描述

    3.创建Groovy.class类

    new—>Groovy Class类
    在这里插入图片描述

    4.创建GoodsServiceSpec.java

    创建GoodsServiceSpec类对,queryUserInfo()方法进行单元测试,命名严格要求:要测的类名+Spec
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/49400ee9803a4fc88587359b66d64a56.png在这里插入图片描述

    说明:
    1、创建类之后需要继承extends Specification类
    2、对不支持业务逻辑的操作方法进行mock。比如:OrgService orgService = Mock()
    3、创建业务类的实例,进行方法调用。比如: def goodsService = new GoodsService()
    4、创建测试方法格式如下

    /**
     * 订单用户查询单元测试
     */
    class GoodsServiceSpec extends Specification{
        CreativeManagementTunnel creativeManagementTunnel = Mock()
        OrgService orgService = Mock()
        def goodsService = new GoodsService(
                creativeManagementTunnel: creativeManagementTunnel,
                orgService: orgService,
        )
        def "createCampaignOpData success"() {
            given:"准备数据"
            def user = "小新新"
            def user1 = "三少爷"
            def userList = [new Employee("mis": "xiaoxinxin", "name": "小新新", "userId": "001"),
                           new Employee("mis": "sanshaoye", "name": "三少爷", "userId": "002"),];
            //代表查全部
            def userid = 1
    
            and:"mock方法"
            //[] 含义是代表一个list集合   (_)  表示代表方法入参任意类型
            creativeManagementTunnel.queryCreateUser(_)>>[user,user1]
            orgService.batchQueryUserInfoByMis(_)>>userList
    
            //when  标签代表要测试方法的入口,只能又一个方法
            when:"测试方法"
            def response = goodsService.queryUserInfo(userid)
    
            //then  对结果进行验证
            then:"校验结果"
            response.size() == 2
            response.get(0).getUserId() == "001"
            response.get(0).getName() == "小新新"
            response.get(0).getMis() == "xiaoxinxin"
            response.get(1).getUserId() == "002"
            response.get(1).getName() == "三少爷"
            response.get(1).getMis() == "sanshaoye"
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    实际效果与预期效果一致,表示测试通过。
    在这里插入图片描述
    实际效果与预期效果不一致,表示测试失败
    在这里插入图片描述

    5.groowy简单语法

    where以标准格式开使提供集合
    when调用指定方法函数
    then: 故出断高裝达式
    expect 期站的行为,shen-then的特点
    giveni mock单测中指定mock数信
    throwin:如果在when方法中地出现异常,则在这个子句中会捕玩到异常并返回
    def setupo{}:每个训过运行前的启动方法
    **der cleanupo{}**每个加武运行居的清理万法
    **def setupSpec{}**个测试适祈前的启动方法
    **def cleanupSpec{}**服后一介测试运行后的消理方法

    总结

    以上就是今天要讲的内容,本文仅仅简单介绍了spock的使用,而spock提供了大量能使我们快速便捷地处理数据的函数和方法,后续我将Spock对于异常、void方法,static方法场景经典测试的案例,敬请期待!。

  • 相关阅读:
    BeanFactory与ApplicationContext
    可转债长期持有策略——收益与风险、利息收入、案例研究
    软件定义汽车SDN的五大技术挑战--软件定义汽车产业生态创新白皮书发布
    宝塔站点配置
    5. Linux-riscv内存管理21-24问
    LCR 175.计算二叉树的深度
    Docker (六)【Docker Compose】
    GIS工具maptalks开发手册(二)01-01之Geometry转化为GeoJSON——渲染点
    1776_树莓派简介视频学习小结
    Pycharm编辑器设置提示函数参数
  • 原文地址:https://blog.csdn.net/zhx__/article/details/125344562