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(包括文档字符串测试)。这当然是 最喜欢的测试解决方案。