spock介绍part 1

1. 介绍

今天跟大家介绍一个测试框架Spock,框架是基于Groovy。Spock主要是提供比传统的Junit框架更多丰富的功能。

Groovy是一种基于JVM的语言,可以与Java无缝集成。 在互操作性的基础上,它提供了额外的语言概念,如动态的,可选的类型和元编程。

通过使用Groovy,Spock引入了测试我们的Java应用程序的新的和富有表现力的方式,这在普通的Java代码中是不可能的。 我们将在本文中以一些实用示例来逐步探讨Spock的一些高级概念。

2. Maven Dependency

开始之前,让我们把依赖添加到pom

<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
<version>1.0-groovy-2.4</version>
<scope>test</scope>
</dependency>

<dependency>
    <groupId>org.codehaus.groovy</groupId>
    <artifactId>groovy-all</artifactId>
    <version>2.4.7</version>
    <scope>test</scope>
</dependency>

与任何标准库一样,我们已经添加了Spock和Groovy。 但是,由于Groovy是一种新的JVM语言,因此我们需要包含gmavenplus插件以便能够编译和运行它:

<plugin>
    <groupId>org.codehaus.gmavenplus</groupId>
    <artifactId>gmavenplus-plugin</artifactId>
    <version>1.5</version>
    <executions>
        <execution>
            <goals>
                <goal>compile</goal>
                <goal>testCompile</goal>
            </goals>
        </execution>
     </executions>
</plugin>

现在我们准备写我们的第一个Spock测试,它将用Groovy代码编写。 请注意,我们仅将Groovy和Spock用于测试目的,这就是为什么这些依赖项是测试范围的原因。

3. Spcok 的基本测试架构

3.1 Specifications 和 特性

当我们在Groovy中编写测试时,我们需要将它们添加到src / test / groovy目录中,而不是src / test / java。 让我们在这个目录中创建我们的第一个测试,命名为FirstSpecification.groovy:

class FirstSpecification extends Specification {
 
}

请注意,我们的类继承Specification 接口。 每个Spock类都必须扩展它以使框架可用。 这样做可以让我们实现我们的第一个功能:

def "one plus one should equal two"() {
  expect:
  1 + 1 == 2
}

在解释代码之前,还值得注意的是,在Spock中,我们所说的功能与我们在JUnit中看到的测试有些同义。所以每当我们提到一个特性时,我们实际上都是指一个测试。

现在,我们来分析一下我们的功能。在这样做的时候,我们应该立即看到它和Java之间的一些差异。

第一个区别是特征方法名称被写为普通字符串。在JUnit中,我们可能会有一个使用驼峰或者下划线来分隔单词的方法名称,但是这些单词并不会富有表达性或可读性。

接下来是我们的测试代码存在于预期中。我们很快会更详细地介绍块(block),但本质上它们是分解测试不同步骤的合理方法。

最后,我们意识到没有断言。这是因为断言是隐含的,当我们的语句等于真时测试便会通过,当它等于假时失败。再次,我们很快就会更详细地介绍断言。

3.2. 块(Blocks)

有时在编写JUnit测试时,我们可能会注意到没有将它分解成多个部分的表达方式。 例如,如果我们遵循行为驱动的开发,那么当使用注释的时候,我们最终可能会指出给定的部分:

@Test
public void givenTwoAndTwo_whenAdding_thenResultIsFour() {
   // Given
   int first = 2;
   int second = 4;
 
   // When
   int result = 2 + 2;
 
   // Then
   assertTrue(result == 4)
}

Spock用块来解决这个问题。 块是使用标签打破我们测试阶段的Spock原始方式。 他们为我们提供了given,when和then等:

  1. setup(由给定的别名) - 在这里我们执行测试运行前所需的任何设置。 这是一个隐含的块,代码完全不在任何块中
  2. when - 这是我们提供真正需要测试的方法的地方。 换句话说,我们在哪里调用我们的测试方法
  3. then - 这是断言所属的地方。 在Spock中,这些被评估为纯布尔断言,我们将会在后面介绍到
  4. expect - 这是在同一个区块内执行我们测试方法和断言的一种方式。 根据我们的测试方式,我们可能会选择不使用此块
  5. cleanup - 在这里,我们清除任何依赖于测试的资源,否则这些资源将被抛弃。 例如,我们可能希望从文件系统中删除任何文件或删除写入数据库的测试数据

让我们再次尝试我们的测试,这次充分利用块:

def "two plus two should equal four"() {
    given:
        int left = 2
        int right = 2
 
    when:
        int result = left + right
 
    then:
        result == 4
}

正如我们所看到的,块可以帮助我们的测试变得更加可读。

好了,今天就先到这里,后面的我们会加上Spock的特色功能。喜欢的记得关注。更多Java相关的技术分享,可以添加微信:youliaodao_zc,拉进群一起学习

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值