数据科学过程中, 出现的代码问题往往不容易检测到, 可能是某个值没有编码正确, 使用的特征不合适等等, 为了捕获这些错误, 需要去检查数据分析的质量和准确性以及代码质量, 合适的测试是必要的为了避免这些问题.
测试驱动的开发
单元测试: 测试的一种类型, 其覆盖一部分代码,通常为单个函数, 将其独立于其他代码.
单元测试
例如你想测试一个函数, 这个函数的功能是找出小于等于且最接近这个数.
def nearest_square(num):
'''Return the nearest perfect square that is
less than or equal to num.'''
root = 0
while (root + 1) ** 2 <= num:
root += 1
return root ** 2
可以像下面一样在终端测试, 但是这样测试会比较繁琐, 而且也不高效
from nearest import nearest_square
nearest_square(5)
>>4
nearest_square(-12)
>>0
nearest_square(9)
>>9
nearest_square(23)
>>16
第二种方法, 可以像下面截图一样, 可以在程序里面运行, 但是任何没有告诉你是否得到了正确的答案
可以在print过程中, 打印正确答案, 但是仍然需要手动检查每一个测试, 这在运行大量单元测试过程中是不可取的.
我们可以使用assert
去确保每个结果等于正确答案.
运行后, 如果某一个单元测试出现了问题, 那么就会发生下图的情况
用于单元测试的工具
要安装pytest
, 请在终端pip install -U pytest
您可以在这里看到更多关于入门的信息.
- 创建从
test_
开始的测试文件 - 在测试文件中定义以
test_
开头的单元测试函数 - 在测试文件的目录中输入
pytest
到您的终端, 它将为您检测这些测试!
test_
是默认值-如果您希望更改此设置, 您可以了解如何在此 pytest
配置中
在测试输出中, periods 表示成功的单元测试, F's 表示失败的单元测试。由于看到的只是测试函数失败的内容, 因此每个测试只有一个assert
语句是明智的。否则, 您将不知道到底有多少测试失败, 哪些测试失败。
失败的assert
语句不会停止测试, 但如果您有语法错误, 测试将停止。
数据科学领域的测试
- 测试驱动开发:在编写正在测试的代码之前编写测试。您的测试一开始会失败, 当测试通过时, 您就会知道您已经完成了任务的实现。
- 测试可以在开始编写函数之前检查您可以想到的所有不同的场景和边缘情况。这样, 当您开始实现您的函数时, 您可以运行此测试, 以便在调整函数时, 立即获得有关它是否以您能想到的所有方式工作的反馈。
- 在重构或添加代码时, 测试可帮助您确保, 在进行这些更改时, 代码的其余部分不会中断。测试还有助于确保您的功能行为是可重复的, 而不考虑外部参数, 如硬件和时间。
数据科学的测试驱动开发是比较新的, 出现了很多实验和突破, 你可以在下面的资源中了解更多。
- 数据科学 tdd
- 用于数据科学的 tdd
- tdd 对于良好的数据科学至关重要, 这就是为什么
- 测试您的代码(通用python tdd)
Resources:
- Four Ways Data Science Goes Wrong and How Test Driven Data Analysis Can Help: Blog Post
- Ned Batchelder: Getting Started Testing: Slide Deck and Presentation Video