Spek 框架的贡献者 Laura Kogler 会演示 Kotlin 测试框架的现状,然后讨论一下在测试支持方面我们期望看到的一些特别的优点。
我的名字叫做 Laura,是 Pivotal Labs 的一名工程师。我是一名安卓开发者,这也是我接触到 Kotlin 的原因。我也是名测试驱动开发的狂热支持者。我喜欢 TDD 和测试,这也是我们在 Pivotal Labs 里工作内容的很大一部分。在 Pivotal Labs,我们维护了一系列的开源的测试框架,包括为 Javascript 开发的 Jasmine,和为 Objective-C 开发的 Cedar。
J-Unit 测试有着非常扁平的架构,任何嵌套测试都不能使用。如果你在在 RSpec 的帮助下,学习了基于 Ruby 的 TDD,你就可以把能共享 setup 和 teardown 的测试聚在一起。当我发现 Kotlin 的时候,我想有没有人已经为 Kotlin 写了一个 BDD 的测试框架呢。
我创建一个测试类,它必须继承于这里的 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
,或者事实上还有一些名词可以使用,比如 given
和 on
。它们都是同一个事情的缩写,这些都是让你定义测试上下文的地方。在上面这个上下文中,假设玩家一玩的是摇滚。为了定义这个测试的起始条件,我们使用了 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 愿望清单:
如果你有增强 Spek 的其他的想法,请来这里 非常欢迎 PR 。
See the discussion on Hacker News .