可能是全网最好的 Spock 单测入门文章!

01fa081c8d3df49b6fbc08336ebbd7e8.png

Spock 是非常简洁规范的单元测试框架,网上很多资料都不齐全,例子也很难懂。我自己经过一段时间的学习,梳理了这篇文章,不仅讲解层次递进,而且还有非常简洁明了的例子,小白都能懂!

快速入门 Spock

使用 Spock 非常简单,只需要引入对应的 Spock 依赖包就可以写 Spock 单测代码了。下面我将演示一个使用 Spock 进行单测的最小项目,帮助大家最快上手 Spock。本文档所有例子可在 Github 项目中找到,地址:chenyurong/quick-start-of-spock: 深入浅出 Spock 单测

首先,我们使用 Spring Initializr 初始化一个项目,不需要引入任何依赖应用,这里我命名为 quick-start-of-spock。项目初始化完成之后,在 pom.xml 文件中添加 Spock 依赖,如下代码所示。

<dependency>
    <groupId>org.spockframework</groupId>
    <artifactId>spock-core</artifactId>
    <version>1.2-groovy-2.4</version>
</dependency>

接着,我们编写一个计算器类,用来演示 Spock 单测的使用,代码如下所示。

package tech.shuyi.qsos

public class Calculator {
    public int add(int num1, int num2) {  
        return num1 + num2;  
    }
    public int sub(int num1, int num2) {  
        return num1 - num2;  
    }
    public int mul(int num1, int num2) {  
        return num1 * num2;  
    }
    public int div(int num1, int num2) {  
        return num1 / num2;  
    }  
}

接着,我们为 Calculator 生成一个测试类,放在 test 目录下即可,名称命名为 CalculatorTest.groovy,代码如下所示。

package tech.shuyi.qsos

import spock.lang.Specification

class CalculatorTest extends Specification {

    Calculator calculator = new Calculator()

    def "test add method, 1 add 1 should equals 2."() {
        given: "init input data"
            def num1 = 1
            def num2 = 1
        when: "call add method"
            def result = calculator.add(num1, num2)
        then: "result should equals 2"
            result == 2
    }

    def "test sub"() {
        expect:
            calculator.sub(5, 4) == 1
    }

    def "test mul"() {
        expect:
            calculator.mul(5, 4) == 20
    }

    def "test div"() {
        when:
            calculator.div(1, 0)
        then:
            def ex = thrown(ArithmeticException)
            ex.message == "/ by zero"
    }
}

这个测试类中,针对 Calculator 类的 4 个加减乘除方法都配置了对应的单测用例。到这里,Spock 的代码就编写完成了。我们直接点击 CalculatorTest 类左边的运行按钮即可运行整个单测用例,如下图所示。

f63930b0fec01e9ac0d9af8e4a968d95.jpeg

正常情况下,所有单测用例都应该通过测试,都显示绿色的图标,如下图所示。

089bd0167369403552a347128c1529f6.jpeg

我们还可以用来计算一下单测覆盖率,运行入口如下图所示。

66bf5ccdacb793b3f481bf8e54aef709.jpeg

点击运行之后,会弹出单测覆盖率结果,我这里对所有方法都覆盖了,因此覆盖率是 100%,如下图所示。

0ce50af41ce100594cc49064fe9b6d02.jpeg

到这里,一个最小单元的 Spock 示例项目就结束了。

Spock 语法块

对于 Spock 来说,其最大的特点是使用 give-when-then 等结构来规范了单测的写法,这也是一种非常好的单测规范。因此,了解 Spock 的语法块,知道每个关键词代表的意思就显得非常重要了。

基础语法

对于 Spock 来说,最常用的几个语法块关键词有:

  • given

  • when

  • then

  • and

  • expect

given

given 代码块通常用来进行数据准备,以及准备 mock 数据。例如上面计算器加法单测的例子:

def "test add method, 1 add 1 should equals 2."() {
    giv
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在进行Spock单元测试时,如果需要测试多表关联,可以使用Django提供的强大而直观的查询方式来处理关联关系。通过使用关联的模型字段的名称,并使用双下划线分隔,可以跨越关联关系,直到达到所需的字段。这样可以在后台自动处理JOIN操作。\[1\] 在进行多表关联查询时,可以使用内连接查询和外连接查询。内连接查询只会查询满足连接条件的数据,不满足连接条件的数据无法查询出来。隐式内连接查询可以使用"from 主表, 从表 where 从表的外键 = 主表的主键"的语法进行查询。显式内连接查询可以使用"from 主表 inner join 从表 on 从表的外键 = 主表的主键"的语法进行查询。\[3\] 如果需要进行全外连接查询,可以使用union联合查询来实现。全外连接查询会将左表和右表的数据都查询出来,并按照连接条件进行连接。\[2\] 在Spock单元测试中,可以根据具体的需求选择合适的连接方式来进行多表关联查询。可以使用Django提供的查询语法来编写测试代码,以验证多表关联的正确性。 #### 引用[.reference_title] - *1* [28.多表查询——跨关联关系的多表查询](https://blog.csdn.net/qq_44907926/article/details/120018985)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [MySQL的多表关联查询](https://blog.csdn.net/HunterArley/article/details/127685224)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值