发布于 2026-01-06 0 阅读
0

芝加哥和伦敦方法入门解释 DEV 的全球展示挑战赛,由 Mux 呈现:推介你的项目!

芝加哥和伦敦进近入门讲解

由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!

作者澄清:我后来得知,芝加哥学派的真正名称是底特律学派。请在以后的引用中使用这个名称。

最近,我在代码审查中收到反馈,说我的TDD方法或许可以借鉴伦敦设计学派的理念,而不是芝加哥设计学派的理念。我的第一反应是困惑……

TDD测试方法有哪些?芝加哥学派和伦敦学派的方法分别是什么?

因此,我决定利用周末时间研究这些方法,并将我的理解分享出来,希望能对其他人有所帮助。

我们先从芝加哥模式开始。

芝加哥学派TDD(由内而外/自下而上/经典)

这种方法从单元测试层面开始,使开发人员能够一次专注于一件事。具体来说,它侧重于完善特定功能的细节,然后再进行下一个功能。

几周前,我在开发保龄球记分卡程序时,就想到了这种方法的一个例子。

我着手这个项目时,首先测试并构建了一个“游戏”类,该类专注于跟踪游戏(例如玩家所在的帧数和掷骰次数、游戏结束等),然后我转而测试并构建了“记分卡”类,该类将计算分数。

完成所有单元测试后,我开始进行功能测试,并构建前端界面,该界面将向玩家显示这些信息,并最终供玩家玩游戏。

这是芝加哥大学构建课程体系的一种方法:

  • 它着重于从组件/类级别向上构建程序。
  • 它专注于基于状态的测试,一次只测试一个类及其行为。

伦敦思想学派 TDD(由外而内/自上而下/模拟式)

你可能已经猜到了,伦敦学派的思想本质上与芝加哥学派的思想截然相反。

这种方法从程序的外部功能层开始,逐步深入到程序的中心层(即组件的单元测试)进行测试。

因此,在重新思考我的保龄球记分卡程序开发方法时,我会先进行功能测试,规划界面在用户眼中的样子以及用户如何与之交互,然后再进行单元测试。

说实话,这让我觉得有点奇怪。为什么要在没有任何必要组件(例如游戏和记分卡对象)的情况下就开始实现功能测试呢?

这就涉及到嘲讽了,它是伦敦方法中更为关键的一部分(但两者仍然可以使用!)。

假设我的页面会显示玩家所在的帧数和掷骰结果,以及当前得分。为了测试这些信息是否正确显示,我需要模拟相关类并返回一些测试数据,以验证这些数据是否能在网页上正确显示。

例如,假设页面初始状态为帧数 1,掷骰结果 1,得分 0。玩家掷出 5,我希望网页显示玩家正在进行下一次掷骰,得分为 5(即帧数:1,掷骰结果:2,得分:5)。我会使用模拟对象和桩对象进行功能测试,用模拟数据代替真实数据,以模拟我预先实现类和方法后所获得的数据。

完成该功能测试后,我可以对记分卡和游戏类进行单元测试,以替换这些模拟数据并返回真实数据。

伦敦学派的教学方法:

  • 重点在于从外部、从功能层面逐步构建程序,直至内部层面。
  • 将类的实际实现留到最后。

结束语

我希望这篇文章能帮助你初步了解芝加哥和伦敦的TDD方法。为了尽可能简洁(也因为我仍在学习这些方法),我在这里没有提及很多内容,但如果你有兴趣了解更多,我会列出一些我在此过程中发现的有用资源:

文章来源:https://dev.to/hiboabd/a-beginners-explanation-of-the-chicago-london-approaches-4o5f