Kau testing kotlin 1 kogler

用 Kotlin 来测试 #1

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


介绍 (0:00)

我的名字叫做 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 的测试框架呢。

实例 (3:25)

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

Receive news and updates from Realm straight to your inbox


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 的时候,请测试游戏的结果。

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

新功能 (8:05)

未完成的功能

假设你在一个未完成的功能上进行测试。你可以只在它之前输入一个 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

About the content

This content has been published here with the express permission of the author.

Laura Kogler

Laura Kogler

Laura Kogler is a scientist turned software engineer based in the San Francisco Bay Area. In her free time, she enjoys making pretty things (and sometimes setting them on fire).

4 design patterns for a RESTless mobile integration »

close