在 Pharo 学习轨道上测试

了解如何在 Exercism 上测试你的 Pharo 练习


在最基本的层面上,Exercism 的一切都围绕测试以及测试方法展开,它推动你一步步完成实现,并告诉你一个练习何时算是完成。

即时反馈

Pharo 对测试有很好的支持,还支持增量测试!你只要点击测试用例类或方法旁边的圆点,就能运行该练习的任意测试。

浏览器中的测试圆点

测试圆点会根据上一次测试运行的结果显示不同颜色:

  • 绿色表示通过
  • 黄色表示断言失败
  • 红色表示运行时错误或异常

有序测试

Exercism 练习中的测试都被刻意编了号,以给出明确的执行顺序(例如 test01_verifySomeProperty、test02_verifyAnotherProperty 等等)。

在做练习时,建议你先点击第一个测试的圆点,理解失败的原因以及需要做什么才能让它通过,然后再把代码加到你的解答里,让它通过。在 Pharo 中,直接在调试器里做这些修改是很正常的,因为在那里你既能使用代码编辑器,又能查看所有变量和参数,帮助你理解问题。

注意:给测试加顺序前缀并不是常见的做法,在为自己项目编写测试时,你也不应该这样做。

即使代码有问题也能运行

Pharo 乐于运行有问题的代码,遇到错误(无论是语法错误、错误的值,还是缺少的类或方法)时,调试器会直接重新打开。这一技巧是测试驱动开发的主要灵感来源,你在尝试运行任意练习的第一个测试时,就能体会到这种做法。调试器会立刻显示找不到你的解答类(因为你还没写任何东西)。方便的是,有一个“Create”按钮能帮你添加缺失的类,并继续运行,直到它结束,或者遇到另一个错误。

在调试器中创建类

运行第一个测试时,你接着会遇到第二个错误,因为你还没写任何方法。同样,调试器里的“Create”按钮让你可以定义一个方法,并继续运行。此时,你还可以沿着堆栈跟踪往下点击,查看失败测试的要求,然后修改你新建的方法,让它通过。

爱上调试器

在开发过程的后期,你可能会发现在堆栈中往回点击,并使用“Restart”按钮让程序在更早的位置继续执行,也很有用,这样你就能单步执行程序,看看发生了什么。这是理解程序为何出问题的一个重要且实用的方法。

除了在调试器中查看变量,你还可以选中任意语句,点击 inspect/print 查看它的求值结果。这在测试某个方法的返回值,或者检查对象的内部状态时很有用。

检查语句

别忘了,你还可以在调试器中修改正在运行的代码,保存修改后,执行会在刚刚保存的那个方法里重新开始。这样你就能在还“身临其境”的时候试验改动并查看结果。

总的来说,不要害怕在 Pharo 中使用调试器,我们把它视为一个帮助你理解和试验问题的宝贵工具。

更大的测试组与自动化

如果你需要运行更大规模的测试组,也可以从 Package 菜单运行,或者使用 Test Runner 工具(从 World 菜单进入,或键入<meta> + OU)。

你也可以在 playground 中通过 print 求值,以编程方式运行测试:

AllExercismTests suite run.

如果你想进一步了解测试的内部机制,可以阅读 SUnit 的相关资料,或者浏览 TestCase 继承体系中的代码。

你知道吗: TDD 是在 Smalltalk 中随着 SUnit 测试库的引入而诞生的