用于测试模块的Python工作流程,无需重新执行整个代码库

时间:2014-09-15 11:21:23

标签: python debugging ipython

我正在研究跨越多个文件和目录的python项目。这是我的工作流程:

  1. 运行主要python脚本
  2. 主脚本调用其他文件中的某些功能
  3. 执行其他文件/目录中的功能
  4. 在执行过程中,其中一个函数存在错误,但我只在主脚本完成后才发现错误。有时,可能没有错误,而是需要调整的一些参数。
  5. 我回去修复错误/进行必要的调整并重新运行主程序,这次它执行得很好。
  6. 显然,这个工作流程非常低效,因为大量代码(在错误功能之前运行)会被重新执行。理想的是在ipython中运行程序,在发现问题并进行必要的更改后,从错误的函数执行开始的地方重新启动,而不是从头开始。我不确定如何实现这一点,任何帮助将不胜感激。

    我知道如何从ipython历史记录中重新运行行(%rerun)以及如何确保ipython中已更改文件的自动加载,但在这种情况下,我无法在ipython中输入代码行。编写单元测试可能并不总是可行,因此我需要一个替代解决方案。我的用例类似于设置"断点"然后多次重复执行超过断点的代码,以避免在断点之前多次重复执行代码,同时确保正确填充所有必要的变量(直到该阶段)。最后一个条件是我可能无法使用IDE,而vim是我工作的所有环境中唯一可用的编辑器。

2 个答案:

答案 0 :(得分:0)

您可以开始为每个函数编写测试用例,并尝试单独调试每个函数,而不是整个程序/脚本。

有一个python unittest-module:https://docs.python.org/3.4/library/unittest.html和许多教程(仅举例):http://docs.python-guide.org/en/latest/writing/tests/

编写测试似乎很烦人,但考虑测试用例可以更深入地理解"如果..."该功能应如何表现。

答案 1 :(得分:0)

您可以使用代码模块在代码中包含“断点”

import code
# ... later in your program add
code.interact(local=locals()) # enter python interpreter at this point (ctrl+D to continue execution)