如何判断Python/Django单元测试是否连接网络?
我最近被加入到一个项目中,负责增加测试覆盖率(使用Python/Django的unittest模块)。这个应用程序主要处理网络API和JSON请求等内容,我的工作之一就是确保现有的和未来的测试不需要实时网络数据才能正常运行。
我想知道有没有办法可以包裹我的测试套件,以便检测所有网络流量的尝试?
举个例子,在这个应用的早期部分,我重写了sys.stdout,以便检测和捕捉任何子模块写入标准输出的情况。我能否做一些简单的事情来捕捉我的测试对网络访问的尝试?
编辑:我很感激大家的快速回复。拔掉网线当然是个简单的解决办法,但我担心断开网络连接不是一个选项(因为很多工作是通过SSH进行的)。
我对像Wireshark这样的工具有些了解,但我希望能有一些可以智能集成到代码中的解决方案。jcollado的urlopen补丁可能是我在寻找的东西,但如果不是,看起来一个通用的网络监控工具也许就足够了。
2 个回答
3
你可以对所有获取网址的方法进行修改,记录每次尝试的情况,触发一个事件,或者做其他你觉得方便的事情来检测这些操作。
比如,可以看看 dingus 这个模拟库。在它的 pypi 页面 的补丁部分,有一个示例是修改了 urllib2.urlopen
,这个示例可能会对你有帮助。我记得我看过一个演讲(抱歉,我找不到链接),演讲者是 dingus 的作者 Gary Bernhardt,他展示了如何通过使用这种技术大幅减少 Django 应用的测试时间。所以你不仅可以用它来检测网络访问,还可以在测试中避免使用网络。