【问题标题】:Testing package depending on other package测试包依赖于其他包
【发布时间】:2019-06-22 11:55:33
【问题描述】:

以前我不太关心编写测试,但现在我想看看它。但是我直接遇到了问题。有很多关于如何编写测试的教程,但我还没有找到任何关于当一个包需要另一个(非内置)包才能工作时如何工作的内容。

我有两个包裹;我们称他们为foobar。包bar 需要foo 才能工作。现在我想为bar写一个测试。

确保foo 安装在某处以便bar 在运行测试时可以找到foo 的最佳/推荐解决方案是什么?是不是在测试bar之前手动安装foo

注意:这两个包都没有发布到PyPI

【问题讨论】:

  • 请举一个你尝试过的例子。这个问题很笼统。
  • @MUNGAINJOROGE。我没有尝试过任何事情,因为我想学习推荐的方法。我的问题很笼统,因为它是一个笼统的问题。显示我的包的代码会使问题更清楚。
  • 那么,无论包是否在 PyPi 中,都交给bar 负责查找foo。这意味着在编写测试时,您实际上是在测试 bar,您不必关心它的依赖关系。你可能想看看 python 包/模块realpython.com/python-application-layouts
  • @MUNGAINJOROGE。你将如何解决它以便bar 找到foo
  • 假设您在 Linux 上,在 $HOME/python_private_modules 中创建一个目录,然后将其附加到 .bashrc 中的 $PYTHONPATH 为 export PYTHONPATH=$PYTHONPATH:$HOME/python_private_modules。将foo 添加到此目录中,现在在任何python 项目中您都可以执行import foo

标签: python unit-testing


【解决方案1】:

如果没有更多信息,我的猜测是您的问题是当您为 bar 运行测试时找不到 foo(例如 ValueError: Attempted relative import in non-package)。如果是这种情况,那么您的问题可能是由于您的项目的文件/目录组织(请参阅此 SO post 以获得解决方案)。

或者,您的问题可能是您没有将foo 包作为子模块位于bar 中。或者您可能没有全局安装foo pip。如果是这种情况,那么您需要设置一个虚拟环境(内置的venv 库是一种方法),其中foo 安装了pip。您提到 foo 不在 PyPi 上,但如果您在 GitHub 上获得了它,您可以轻松地将其添加到 requirements.txt 以将其拉取并安装到您的虚拟环境中。

如果这些解决方案不能回答您的问题,那么您可能实际上是在询问如何在 bar 处于测试状态时控制 foo 的行为?如果是这样,那么您应该研究 mocking 和/或 patching,这是您可以在测试套件中创建“假”对象以模仿和替换另一个对象的方法在你的程序中。在您的情况下,您想要修补 foo 以便您对 bar 的测试不依赖于 foo 的行为方式。像这样隔离bar 是单元测试概念不可或缺的一部分。

假设您使用的是unittest,则有出色的unittest.mock 模块。 unittest.mock 提供了一个名为 Mock 的类,您可以使用它来模仿代码库中的真实对象。该库还提供了一个名为patch() 的函数,该函数将代码中的真实对象替换为Mock 实例。您可以将patch() 用作装饰器或上下文管理器,让您控制模拟对象的范围。一旦指定范围退出,patch() 将通过将模拟对象替换为原始对象来清理您的代码。我发现this article 在开始使用Mockpatch() 时非常方便。

希望我以某种方式回答了您的问题。如果没有,请告诉我,我可以更新!

【讨论】:

  • 使foo 成为bar 的子模块听起来不是一个好的解决方案。如果我有几个不相关的包,都依赖于foo 怎么办?我不能让foo 成为所有的子模块。这也会使安装foo 而不需要安装bar 有点困难。
  • 在这种情况下,Mocking 听起来也不正确。库foo 实现了点和向量,以及其他几何事物。库bar 使用点和向量。如果foo 实现了某种服务,那么依赖注入和模拟可能是一个合适的解决方案,但我认为不是这种情况。
  • 无论如何,谢谢你的回答。我的问题是当我为bar 运行测试时找不到foo,这是正确的。问题是确保它的最佳方法是什么。
猜你喜欢
  • 2013-03-10
  • 2013-01-26
  • 2016-03-13
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多