Python3、API例子和测试
Python 3, API example and testing
前提
我来自 Lua 脚本语言,我略微接触了 Java 编程语言,我用它来学习 算法,第 4 版。 (ref.).
在Java中,我已经习惯了每个文件有一个class,用main()
方法进行测试和展示class' API.
的正确用法
现在,我正在走向 Python 3,在我看来,这似乎是我之前两个世界的模糊融合。
当前设置
我已经开始开发一个项目:一个主脚本和一组文件夹,其中包含几个 classes(Python 的模块)。正如我所习惯的那样,每个 class 都有自己的测试和使用示例,其中 运行 if __name__ == '__main__'
、 即 如果模块是 运行 作为脚本 (ref.)。
输入Python3绝对import
语句。
现在我遇到麻烦了。
特定模块可能需要从 project_root.utilis
访问函数。
在我的 IDE (PyCharm) 中,我可以简单地做 from utils import blah
但这是 不好的 因为它看起来首先在我安装的模块中,然后在我当前的项目中。
此外,如果我从终端 运行 我的模块,它甚至不起作用。
我最终在某个子文件夹中符号链接了函数 utils/blah.py
...
现在我知道必须有其他测试和文档标准,但我喜欢在模块本身中保留一个我的模块示例,以便人们知道如何使用它。而且我相信我不是第一个使用这种工作流程的人。
问题
有人可以向我解释一下用可以 运行 在同一文件中的测试示例记录模块的最佳做法是什么吗?
推荐的替代方案是什么?
后来的发现
我刚刚发现,在我的 IDE 中,本地模块优先于安装的模块(我相信这不是默认情况下应该发生的)。不过,我不确定为什么会这样。
到 运行 我的模块作为脚本,从 project_root
我可以 python -m module_dir.module_name
。至少我可以删除符号链接。
什么是最好的显然见仁见智。
所以我将在我的排名中从最差到最好列出一些解决方案。
将测试放在 __main__
中当然是一种方法。但是你必须自己编写测试框架(例如报告通过和失败的测试)。测试很可能会超过模块代码。在那种情况下,我觉得将它们留在模块中是不对的。
Python 带有 unittest 模块。它是 Java 的 JUnit 的一个端口。这很冗长;您必须显式编写 类 进行测试。我猜这就是闪耀的 Java 风格。不是很pythonic,IMO。
从文档字符串中提取测试的doctest模块也是标准库的一部分。一个优点是文档字符串有双重职责;作为测试和示例。
pytest testing framework is much nicer. It will automatically search and run many kinds of tests(包括文档字符串测试)。这当然是 我 最喜欢的测试解决方案。
前提
我来自 Lua 脚本语言,我略微接触了 Java 编程语言,我用它来学习 算法,第 4 版。 (ref.).
在Java中,我已经习惯了每个文件有一个class,用main()
方法进行测试和展示class' API.
现在,我正在走向 Python 3,在我看来,这似乎是我之前两个世界的模糊融合。
当前设置
我已经开始开发一个项目:一个主脚本和一组文件夹,其中包含几个 classes(Python 的模块)。正如我所习惯的那样,每个 class 都有自己的测试和使用示例,其中 运行 if __name__ == '__main__'
、 即 如果模块是 运行 作为脚本 (ref.)。
输入Python3绝对import
语句。
现在我遇到麻烦了。
特定模块可能需要从 project_root.utilis
访问函数。
在我的 IDE (PyCharm) 中,我可以简单地做 from utils import blah
但这是 不好的 因为它看起来首先在我安装的模块中,然后在我当前的项目中。
此外,如果我从终端 运行 我的模块,它甚至不起作用。
我最终在某个子文件夹中符号链接了函数 utils/blah.py
...
现在我知道必须有其他测试和文档标准,但我喜欢在模块本身中保留一个我的模块示例,以便人们知道如何使用它。而且我相信我不是第一个使用这种工作流程的人。
问题
有人可以向我解释一下用可以 运行 在同一文件中的测试示例记录模块的最佳做法是什么吗?
推荐的替代方案是什么?
后来的发现
我刚刚发现,在我的 IDE 中,本地模块优先于安装的模块(我相信这不是默认情况下应该发生的)。不过,我不确定为什么会这样。
到 运行 我的模块作为脚本,从 project_root
我可以 python -m module_dir.module_name
。至少我可以删除符号链接。
什么是最好的显然见仁见智。 所以我将在我的排名中从最差到最好列出一些解决方案。
将测试放在 __main__
中当然是一种方法。但是你必须自己编写测试框架(例如报告通过和失败的测试)。测试很可能会超过模块代码。在那种情况下,我觉得将它们留在模块中是不对的。
Python 带有 unittest 模块。它是 Java 的 JUnit 的一个端口。这很冗长;您必须显式编写 类 进行测试。我猜这就是闪耀的 Java 风格。不是很pythonic,IMO。
从文档字符串中提取测试的doctest模块也是标准库的一部分。一个优点是文档字符串有双重职责;作为测试和示例。
pytest testing framework is much nicer. It will automatically search and run many kinds of tests(包括文档字符串测试)。这当然是 我 最喜欢的测试解决方案。