数据科学测试简介
测试是任何数据科学家都需要学习的重要技能之一。
根据我的经验,为代码添加测试是在整体时间节省方面最有价值的投资。
在这一系列的博客文章中,我们将介绍当今在Python中进行代码测试的最重要理念。
这篇博客文章首先探讨了测试的好处,为什么你应该在不同规模上编写测试,以及为什么你应该使用自动化测试框架。
测试的好处
• 测试可以快速发现错误,并减少你花在调试上的时间
• 测试可以加速你的学习过程——如果你能够将自己的想法迭代10倍的速度,那么你就能更快地学习到哪些可行,哪些不可行
• 测试作为文档——每个测试都展示了你的每个函数或流程预期的输入和输出。因为是测试,你还可以检查这些文档是否是最新的
• 测试允许你修改复杂的代码库。编写复杂的代码是容易的。但是修改——更不用说进一步开发复杂的代码——要更具挑战性。测试允许你检查在更改一个部分时是否破坏了其他部分。
• 最后一个好处稍微有些不同:通过大量的测试会让人感觉很好!在编写代码时,我们常常陷入不确定和疑虑的境地。通过测试可以提醒你至少有些东西是有效的,并帮助你获得一种流畅感!
克服中间阶段的低谷期
通常,一旦程序员能够编写复杂的代码,他们的学习速度就会减慢。初学者会很快遇到新的错误 ——因此学习得更快。而对于复杂的代码,可能需要几分钟(甚至几个小时!)才能遇到新的错误——这大大降低了程序员的学习速度。我称之为“中间低谷”。当这些中级程序员开始编写测试时,他们就能快速发现代码中的错误,因此学习过程再次加速。
在不同规模上进行测试
代码库可以在许多不同规模上工作,从一个单独的函数到由许多函数组成的管道。你的测试也必须在这些不同的规模上进行:一些测试将测试单个函数的输出,而其他测试将测试许多函数串联在一起的输出。
用于描述测试的术语并不总是一致的,但通常,针对单个函数的细粒度测试被称为单元测试,而针对管道的粗粒度测试被称为功能测试、端到端测试或集成测试。
一般来说,单元测试更容易编写,但功能测试是最有用的,因为你主要关心的是管道的输出。
何时停止编写测试
在纯粹的测试驱动开发(TDD)方法中,目标是实现100%的测试覆盖率——也就是说,你要为你的每个函数都编写测试。然而,我发现这个目标对很多人来说是非常令人望而生畏的。好消息是,一般来说,并不需要达到100%的测试覆盖率。
你的目标是让你的测试产生价值。对于大多数人来说,从0%到10%的测试覆盖率就能产生最大的价值,特别是当你首先针对你的流程中最容易出现故障的部分进行测试时。