我在撰写我的计算机视觉论文时,编写了一个相当复杂的机器学习程序。程序运行得相当不错,但我需要不断尝试新方法并添加新功能。这是个问题,因为在扩展代码或尝试简化算法时,我有时会引入错误。
显然,正确的做法是添加单元测试,但如何做却不清楚。我的程序的许多组件产生的结果有些主观,我无法自动进行合理性检查。
例如,我曾有一段代码,用于用低分辨率曲线近似高分辨率曲线,以便在低分辨率曲线上进行计算密集型工作。我不小心在这段代码中引入了错误,直到整个程序的结果略有下降时,我才通过艰苦的搜索发现了这个错误。
但是,当我尝试为其编写单元测试时,我不清楚该怎么做。如果我制作一个简单曲线,其低分辨率版本显然是正确的,那么我并没有真正测试所有可能出错的情况。如果我制作一个简单曲线然后稍微扰动点位,我的代码开始产生不同的答案,尽管这段代码现在似乎运行得很好。
回答:
你可能没有意识到其中的讽刺意味,但你实际上拥有的就是遗留代码:一段没有单元测试的软件。你自然不知道从哪里开始。因此,你可能会发现阅读有关处理遗留代码的内容很有帮助。
关于这一点的权威观点是Michael Feather的《有效处理遗留代码》一书。曾经在ObjectMentor网站上有一个有用的总结,但遗憾的是该网站已经随着公司一起消失了。然而,《有效处理遗留代码》在评论和其他文章中留下了遗产。查看这些内容(或者直接购买这本书),尽管关键教训是S.Lott和tvanfosson在他们的回复中涵盖的那些内容。
2019年更新:我已经修复了《有效处理遗留代码》总结的链接,使用的是Wayback Machine网络档案中的版本(感谢@milia)。
另外——尽管知道主要包含指向其他网站链接的答案是低质量答案 🙂 ——这里有一个链接到一个新的(2019年新)Google教程,关于测试和调试机器学习代码。我希望这对未来偶然发现这个答案的探索者有所启发。