【问题标题】:How to tell if Python/Django unit tests are hitting the network?如何判断 Python/Django 单元测试是否正在访问网络?
【发布时间】:2012-01-15 06:47:09
【问题描述】:

我最近被添加到一个项目中以添加测试覆盖率(Python/Django unittest 模块)。这个应用程序主要处理 Web API 和 JSON 请求等,我的部分工作是确保现有或未来的测试都不需要实时网络数据才能运行。

我想知道的是 - 有没有一种方法可以封装我的测试套件来检测所有网络流量尝试?

例如,对于这个应用程序的早期部分,我重写了 sys.stdout 作为一种检测和捕获任何子模块何时写入标准输出的方法。我可以做一些简单的事情来通过我的测试来捕捉网络访问的尝试吗?

编辑:感谢您的快速回复。拉电缆当然是一个简单的解决方案,但恐怕不能中断我的网络连接(大部分工作都是通过 SSH 完成的)。

我对 Wireshark 之类的工具有些熟悉,但我希望能够智能地与代码本身集成。 jcollado 的 urlopen 补丁可能是我正在寻找的,但如果不是,它看起来像一个通用的网络监控工具可能就足够了。

【问题讨论】:

  • 您可以通过拉取网络连接并运行它们来判断现有测试是否正在访问网络。
  • 你能用grep找到所有创建网络连接的地方吗?他们并不意外。它们通常非常明显,因为它们涉及import 和像urllib 这样的适当库。是什么阻止您使用搜索?
  • 我不是唯一一个处理此代码的人,如果可能的话,我希望避免更改正在测试的代码或要求其他开发人员更改他们的代码。
  • 您是否考虑过将代码复制到另一台机器上?即使生产代码没有,单元测试也应该独立于文件系统、数据库和网络运行。

标签: python django unit-testing tdd


【解决方案1】:

您可以修补所有用于获取 url 并记录每次尝试、触发事件或任何更方便您检测到的方法。

以 dingus 模拟库为例。在pypi page 的修补部分中,有一个示例可以对urllib2.urlopen 进行修补,这很有用。我记得我看过 Gary Bernhardt(dingus 的作者)的一次演讲(抱歉,我没有找到链接),他在其中展示了如何通过使用这种技术大幅减少 django 应用程序中的测试时间。因此,您不仅可以使用它来检测网络访问,还可以避免在测试用例中使用网络。

【讨论】:

    【解决方案2】:

    有许多工具可以检测网络流量的尝试。

    例如netstat 输出

    wireshark

    【讨论】:

      猜你喜欢
      • 2012-12-31
      • 1970-01-01
      • 2019-12-22
      • 2021-12-09
      • 2014-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-21
      相关资源
      最近更新 更多