我想在我的应用程序中开始进行更多的单元测试,但在我看来,我所做的大部分工作都不适合单元测试。我知道单元测试如何在教科书示例中起作用,但在真实世界的应用程序中,它们似乎没有多大用处。主要与外部资源交互的单元测试程序
我写的一些应用程序具有非常简单的逻辑和与我无法控制的事物之间的复杂交互。例如,我想编写一个守护进程,它对某些应用程序发送的信号作出反应,并更改操作系统中的某些用户设置。我可以看到三个难点:
- 首先,我必须能够与应用程序进行交谈并通知其事件;
- 然后我需要与操作系统交互每当我收到一个信号,为了改变适当的用户设置;
- 终于所有这些应该作为守护进程。
所有这些事情都可能很微妙:我将不得不浏览可能复杂的API,并且可能会引入错误,比如错误地解释一些参数。单元测试能为我做什么?我可以嘲笑外部应用程序和操作系统,并检查给定来自应用程序的信号,我将在OS上调用适当的API方法。这是...嗯,应用程序的微不足道的部分。
其实我所做的大部分事情都涉及与数据库,文件系统或其他应用程序的交互,而这些是最脆弱的部分。
又如看看my build tool PHPmake。我想重构它,因为它的写法不是很好,但我害怕这样做,因为我没有测试。所以我想补充一些。问题的关键是,它可以通过重构被打破的东西可能不被单元测试捕获:
- 一个要做的事情是决定这一切都是要建立和哪一个是已经是最新的,这取决于上次修改文件的时间。这一次实际上是由外部进程改变的,当一些构建命令被触发时。
- 我想确保外部过程的输出正确显示。 buikd命令有时需要一些输入,并且应该也可以正确管理。但我不知道先验哪些流程会运行 - 可能是任何事情。
- 模式匹配中涉及一些逻辑,这似乎是可测试的部分。但是模式匹配的函数使用(除了它们自己的逻辑)PHP函数
glob
,它与文件系统一起工作。如果我只是嘲笑一棵树来代替实际的文件系统,glob
将不起作用。
我可以继续更多的例子,但重点是以下几点。除非我有一些精巧的算法,否则我所做的大部分工作都涉及到与外部资源的交互,而这不适用于单元测试。更多的是,这种交互通常实际上是非平凡的部分。仍然有很多人将单元测试视为一种基本工具。我错过了什么?我怎样才能学会更好的测试者?
另请参见http://stackoverflow.com/questions/4980825/real-world-unit-tests – Raedwald 2013-09-06 12:35:52