如何开始为Python编写单元测试?
我之前没有做过测试,但我想开始尝试。现在我有一些问题:
使用
unittest
模块可以吗?我了解到,unittest
模块会运行所有以test
开头的方法。如果我有一个单独的目录来放测试代码(比如一个叫
tests
的目录),我该怎么导入我正在测试的代码呢?我需要使用imp
模块吗?这是我的目录结构:src/
tests/
4 个回答
正如Sebastian P.提到的,Mark Pilgrim的Dive Into Python这本书里,有关于单元测试和测试驱动开发的精彩章节,都是用Python的unittest模块来讲解的。我自己也是通过这些章节开始学习测试的。
我写了一篇博客,描述了我在测试时导入模块的方法。需要注意的是,这个方法解决了Vinay Sajip的方法的一个缺陷:如果你不是在模块所在的目录下调用测试模块,这个方法就会失效。我的博客评论区也有读者分享了一个不错的解决方案。
S. Lott在Vinay的帖子中提到了一种使用PYTHONPATH
的方法;我希望他能详细讲解一下。
开始测试你的Python代码还有一个不错的方法,就是使用doctest模块。这个模块允许你把测试写在方法和类的注释里。最棒的是,这些测试同时也可以作为代码示例,所以它们也算是一部分文档。这样做非常简单。
使用 unittest
是没问题的。这个模块会自动运行那些以 test
开头的方法,前提是你的类要继承自 unittest.TestCase
。
你不需要使用 imp
模块,你的测试模块只需要像平常一样导入你要测试的代码就可以了。不过,你可能需要把 src
目录添加到你的路径中:
import sys
sys.path.append('../src') # OnLinux - use r'..\src' for Windows
这段代码应该放在你的测试模块中,在导入其他模块之前。
一个更好的方法是使用操作系统的环境变量 PYTHONPATH
。
在Windows上,你可以这样设置: SET PYTHONPATH=path\to\module; python test.py
在Linux上,可以这样设置: PYTHONPATH=path/to/module; python test.py
另外一个可以替代 unittest
的工具是 nose。