初学者在测试Python代码时,需要帮助!

时间:2009-08-19 12:39:54

标签: python testing

我不做测试,但我想开始。我有一些问题:

  1. 可以使用unittest模块吗?据我所知,unittest模块将运行以test开头的任何方法。
  2. 如果我有一个单独的测试目录(考虑一个名为tests的目录),我将如何导入我正在测试的代码?我需要使用imp模块吗?这是目录结构:
  3. 的src /

    测试/

4 个答案:

答案 0 :(得分:5)

使用Python代码开始测试的另一个好方法是使用doctest模块,在模块中包含方法和类注释中的测试。简洁的是,这些作为代码示例,因此,部分文档。非常容易做到。

答案 1 :(得分:4)

使用unittest很好。对于继承自test

的类,此模块将运行以unittest.TestCase开头的方法

无需使用imp模块 - 您的测试模块只会正常导入测试中的代码。您可能需要将src目录添加到路径中:

import sys
sys.path.append('../src') # OnLinux  - use r'..\src' for Windows

在导入模块之前,此代码将出现在您的测试模块中。

更好的方法是使用OS环境变量PYTHONPATH

(Windows)SET PYTHONPATH=path\to\module; python test.py

(Linux)PYTHONPATH=path/to/module; python test.py

unittest的替代方法是nose

答案 2 :(得分:2)

我在测试问题的整个单独目录中遇到了一些问题。

我解决它的方法是在源目录中使用以下代码:

import sys, os, re, unittest

# Run all tests in t/

def regressionTest():
    path = os.path.abspath(os.path.dirname(sys.argv[0])) + '/t'
    files = os.listdir(path)
    test = re.compile("^t_.+\.py$", re.IGNORECASE)
    files = filter(test.search, files)
    filenameToModuleName = lambda f: 't.'+os.path.splitext(f)[0]
    moduleNames = map(filenameToModuleName, files)
    modules = map(__import__, moduleNames)
    modules = map(lambda name: sys.modules[name], moduleNames)
    load = unittest.defaultTestLoader.loadTestsFromModule
    return unittest.TestSuite(map(load, modules))

suite = regressionTest()

if __name__ == "__main__":
    unittest.TextTestRunner(verbosity=2).run(suite)

然后我有一个名为t的文件夹,其中包含我的所有测试,名为t_<something>.py

如果您需要有关使用Python进行单元测试的帮助,我可以推荐the official documentationDive Into Python等。

答案 3 :(得分:2)

如Sebastian P.所述,Mark Pilgrim的 Dive Into Python 使用Python的unittest模块在unit testingtest-driven development上有很好的章节。我自己用这些章节开始测试。

我写了一篇描述my approach to importing modules for testing的博文。请注意,它解决了Vinay Sajip的方法的缺点,如果你从任何地方调用测试模块,它将无法工作,但它所在的目录。一位读者也在我的博客文章的评论中发布了一个很好的解决方案。

S上。洛特暗示在Vinay的帖子中使用PYTHONPATH的方法;我希望他会阐述它。