1. 概述

ScalaTest是scala生态系统中最流行和灵活的测试工具,可以测试scala、js、java代码。

2. ScalaTest的特性

a. ScalaTest的核心是套件(suite),即0到多个测试的集合
b. 测试可以是含有一个名称的任意内容,该名称可以用来启动、待处理或取消,也可表示成功或失败等
c. trait Suite声明run和其他"生命周期"的方法,这些方法定义编写和执行测试的默认方式;"生命周期"方法可被重写,以定制测试如何编写和运行
d. ScalaTest提供继承Suite的样式traits,并且重写生命周期方法来支持不同的测试类型。它提供了混合(mixin)特性,重写生命周期方法,以满足特定测试需求
e. 你可以通过组合Suite样式和混合traits来定义测试类;可以通过组合Suite实例来定义测试套件。

3. Maven依赖

Maven项目中增加ScalaTest,只需引入如下依赖即可
<dependency>
<groupId>org.scalatest</groupId>
<artifactId>scalatest_2.11</artifactId>
<version>3.0.8</version>
<scope>test</scope>
</dependency>

4. 选取测试样式的不成文约定

a. 推荐为每个项目选择一组满足团队的测试样式,同时保持项目代码的一致性
b. 推荐为单元测试选择一个主样式,而验收测试选择另一样式
c. 一般情况下,推荐使用FlatSpec样式用于单元测试和集成测试,FeatureSpec用于验收测试。
注意:选择的样式只是表明测试声明的外观,无论选择哪种样式,ScalaTest中的其他内容,均以相同的方式工作

5. 样式Trait

(1) FunSuite和XUnit类似,可以轻松编写描述性测试名称,自然地编写集中测试,并生成类似规范输出,促进相关利益者沟通。
(2) FlatSpec的结构类似于XUnit,但是测试名称必须写成规定样式,如X should Y, A must be等
(3) FunSpec类似于Ruby的RSpec工具,对于偏好BDD的团队来说,FunSpec的嵌套和温和的结构化文本指南(使用describe和it)为编写规范式测试提供了极好的通用选择。
(4) 对于来资源specs或spec2的团队,WordSpec将会感觉很熟悉。WordSpec在如何编写文本方面非常规范,因此非常适合于希望在规范文本上强制执行高度管理的团队。
(5) FreeSpec在如何编写规范文档中方面相对自由
(6) PropSpec适合想要在属性检查方面专门编写测试的团队,当选择不同的样式特征作为主要单元测试样式时,也是编写偶尔测试矩阵的好选择
(7) FeatureSpec主要用于验收测试,包括促进程序员与非程序员一起工作以确定验收要求的过程
(8) RefSpec允许将测试类定义为方法,与将测试表示为函数的样式类相比,每个测试保存一个函数文字。更少的函数文字转换为更快的编译时间和更少的生成的类文件,这可以帮助最小化构建时间。
因此,在构建时间受到关注的大型项目中以及通过静态代码生成器以编程方式生成大量测试时,使用Spec可能是一个不错的选择。

6. 定义基类

(1) 为工程创建你最常使用混合特性的抽象基类,而非重复的复制代码来混合相同的trait,如:
a. 创建抽象基类
import org.scalatest._
abstract class UnitSpec extends FlatSpec with Matchers with OptionValues with Inside with Inspectors
b. 继承抽象类
import org.scalatest._
class MySpec extends UnitSpec{
// 测试类
}

7. 编写第一个测试

(1) 使用ScalaTest时,定义一个类,且继承一个样式类如FlatSpec
(2) 在FlatSpec中的每个测试由句子构成,该句子指定了一些所需行为和一个测试它的代码块。
a. 该句子需要一个主题,如" A Stack"
b. 一个动词,如should, must, can
示例:"A Stack" should "pop values in last-in-first-out order"
c. 如果多个测试的主题相同,可以使用it来指代之前的主题,如:
it should "throw NoSuchElementException if an empty stack is popped"
d. 句子后面需要增加"in",其后紧跟着以{}括起来的测试代码示例:

package com.ws.spark.study.scalatest

import org.scalatest.FlatSpec

import scala.collection.mutable

class StackSpec extends FlatSpec{

  "A Stack" should "pop values in last-in-first-out order" in {
    val stack = new mutable.Stack[Int]
    stack.push(1)
    stack.push(2)
    assert(stack.pop() == 2)
    assert(stack.pop() == 1)
  }

  // it 表示之前的主题 "A Stack", 适用于主题相同的情况
  it should "throw NoSuchElementException if an empty stack is popped" in {
    val emptyStack = new mutable.Stack[Int]
    assertThrows[NoSuchElementException]{
      emptyStack.pop()
    }
  }
}
View Code

相关文章: