虽然我已经为我完成的大部分代码编写了单元测试,但我最近才通过 Kent Beck 的示例获得了一份 TDD 副本。我一直对我做出的某些设计决定感到遗憾,因为它们阻止了应用程序“可测试”。我通读了这本书,虽然其中一些看起来很陌生,但我觉得我可以管理它并决定在我当前的项目中尝试它,该项目基本上是一个客户端/服务器系统,两个部分通过它进行通信。USB。一个在小工具上,另一个在主机上。该应用程序使用 Python。
我开始了,很快就陷入了混乱的重写和小测试中,后来我发现这些并没有真正测试任何东西。我把它们中的大部分都扔掉了,现在有了一个工作应用程序,它的测试全部凝结成 2 个。
根据我的经验,我有几个问题想请教。我从 TDD 新手中获得了一些信息:是否有带有测试的示例应用程序来展示如何进行 TDD?但有一些具体的问题我想回答/讨论。
- Kent Beck 使用他添加和删除的列表来指导开发过程。你如何制作这样的清单?我最初有一些项目,如“服务器应该启动”,“如果通道不可用,服务器应该中止”等,但它们混合在一起,最后现在,它就像“客户端应该能够连接到服务器”(其中包含服务器启动等)。
- 你如何处理重写?我最初选择了基于命名管道的半双工系统,以便我可以在自己的机器上开发应用程序逻辑,然后添加USB通信部分。他们变成了基于套接字的东西,然后从使用原始套接字转移到使用 Python SocketServer 模块。每次事情发生变化时,我发现我不得不重写相当一部分测试,这很烦人。我认为在我的开发过程中,测试将是一个不变的指南。他们只是觉得需要处理更多的代码。
- 我需要一个客户端和一个服务器通过通道进行通信以测试任何一方。我可以模拟其中一方来测试另一方,但是整个频道都不会被测试,我担心我会错过。这有损于整个红/绿/重构节奏。这只是缺乏经验还是我做错了什么?
- “假装直到成功”给我留下了很多凌乱的代码,后来我花了很多时间重构和清理。这是事情的运作方式吗?
- 在会话结束时,我现在让我的客户端和服务器运行大约 3 或 4 个单元测试。我花了大约一周的时间才完成。如果我在代码后使用单元测试,我想我可以在一天内完成。我看不到收益。
我正在寻找使用这种方法完全(或几乎完全)实施大型非平凡项目的人的评论和建议。在我已经运行了一些东西并想要添加一个新功能之后,按照这种方式去做对我来说是有意义的,但是从头开始做这件事似乎很累,而且不值得付出努力。
PS:请让我知道这是否应该是社区维基,我会这样标记它。
更新 0:所有答案都同样有帮助。我选择了我做的那个,因为它最能与我的经历产生共鸣。
更新1:练习练习练习!