用 Kotlin 来测试 #1

Spek 框架的贡献者 Laura Kogler 会演示 Kotlin 测试框架的现状,然后讨论一下在测试支持方面我们期望看到的一些特别的优点。

我的名字叫做 Laura,是 Pivotal Labs 的一名工程师。我是一名安卓开发者,这也是我接触到 Kotlin 的原因。我也是名测试驱动开发的狂热支持者。我喜欢 TDD 和测试,这也是我们在 Pivotal Labs 里工作内容的很大一部分。在 Pivotal Labs,我们维护了一系列的开源的测试框架,包括为 Javascript 开发的 Jasmine,和为 Objective-C 开发的 Cedar。

J-Unit 上的 Kotlin

J-Unit 测试有着非常扁平的架构,任何嵌套测试都不能使用。如果你在在 RSpec 的帮助下,学习了基于 Ruby 的 TDD,你就可以把能共享 setup 和 teardown 的测试聚在一起。当我发现 Kotlin 的时候,我想有没有人已经为 Kotlin 写了一个 BDD 的测试框架呢。

Get more development news like this

我创建一个测试类,它必须继承于这里的 Spek 类,然后我们会进入这个代码段。这个代码段是我们定义测试结构的地方。所以我从这个 describe 块开始:

class TestSource : Spek({
    describe("playing rock paper scissiors") {
      val game = RockPaperScissors()
    }
})

我实例化了一个新的 rock-paper-scissors 游戏。然后我会试着描述一些不同的 rock-paper-scissors 游戏的测试环境。我们能在这个叫做 context 的地方完成这些事情:

class TestSource : Spek({
    describe("playing rock paper scissiors") {
      val game = RockPaperScissors()

      context("player one plays rock") {
        beforeEach {
          game.recordMove(player = Player.ONE, move = Move.ROCK)
        }

        context("and player two plays scissors") {
          beforeEach {
            game.recordMove(player = Player.TWO, move = Move.SCISSORS)
          }

          it("declares player one the winner") {
            assertEquals("Player One wins!", game.getResult())
          }
        }
      }
    }
})

所以你可以使用 context 或者 describe ,或者事实上还有一些名词可以使用,比如 givenon 。它们都是同一个事情的缩写,这些都是让你定义测试上下文的地方。在上面这个上下文中,假设玩家一玩的是摇滚。为了定义这个测试的起始条件,我们使用了 beforeEach

请注意我们的上下文是可以任意嵌套的,而且我们可以定义你想要的任意多的层次。意思是说当你想使用 assertEquals 的时候,请测试游戏的结果。

这可以使你定义更加复杂的情况,与此同时,代码还具备可读性而且易读。

未完成的功能

假设你在一个未完成的功能上进行测试。你可以只在它之前输入一个 x ,然后它就会跳过相应的测试。测试不会运行,但是它会和 J-Unit 还有整个测试架构集成。

xcontent("when player one plays rock") {
  beforeEach {
    game.recordMove(player=Player.ONE, move=Move.ROCK)
  }
}

运行一个单独的测试

为了运行一个单独的测试,你可以给一个专项测试增加一个 f

fit(“declares player two the winner”) { assertEquals(“Player Two wins!”, game.getResults()) }

IDE 会只运行我定义的专项测试。

命令行运行

Spek 的另外一个功能是命令行运行模式,这和 J-Unit 是完全独立开来的。我们在 IDE 里面的运行模式是需要 J-Unit runner 的, 它是勾在 J-Unit 架构下的,而且能和任何使用 J-Unit 的工具集成在一起。

如果你不喜欢 J-Unit,你可以在命令行下运行它自己的执行器,它会有一个基本的测试报告,包括文本的输出和 HTML 的输出。失败的地方会显示红色,跳过的测试会显示黄色,而且在最底部还有一些统计报告。

结论

这就是现在 Spek 具有的基础功能集。我认为未来我们的 Spek 还有许多能做的地方,而且我也很愿意看到它的发展。这里是我的 Spek 愿望清单:

  • Robolectric 集成
  • Spring 的支持
  • 改进 CLI
  • 更好的 IDE 的集成

如果你有增强 Spek 的其他的想法,请来这里 非常欢迎 PR

我来评几句
登录后评论

已发表评论数()

相关站点

热门文章