【问题标题】:Optimal file structure organization of Python module unittests?Python模块单元测试的最佳文件结构组织?
【发布时间】:2011-10-07 09:38:40
【问题描述】:

遗憾的是,我发现有太多方法可以在 Python 中保存单元测试,而且通常没有很好的文档记录。

我正在寻找一种“终极”结构,可以满足以下大部分要求:

  • 可被测试框架发现,包括:
    • pytest
    • nosetests
    • tox
  • 测试应该是outside the module files 并且在模块本身(维护)之外的另一个目录中,可能在包级别的tests/ 目录中。
  • 应该可以只执行一个测试文件(测试必须能够知道应该测试的模块在哪里)

请提供一个进行虚假测试的示例测试文件,指定文件名和目录。

【问题讨论】:

  • 你的问题是什么,真的吗?为什么不直接使用其中一种框架,让每个人都随心所欲?

标签: python unit-testing


【解决方案1】:

这是我一直在使用的方法:

目录结构

# All __init__.py files are empty in this example.
app
    package_a
        __init__.py
        module_a.py
    package_b
        __init__.py
        module_b.py
    test
        __init__.py
        test_app.py
    __init__.py
main.py

ma​​in.py

# This is the application's front-end.
#
# The import will succeed if Python can find the `app` package, which
# will occur if the parent directory of app/ is in sys.path, either 
# because the user is running the script from within that parect directory
# or because the user has included the parent directory in the PYTHONPATH
# environment variable.

from app.package_a.module_a import aaa
print aaa(123, 456)

module_a.py

# We can import a sibling module like this.
from app.package_b.module_b import bbb
def aaa(s, t):
    return '{0} {1}'.format(s, bbb(t))

# We can also run module_a.py directly, using Python's -m option, which
# allows you to run a module like a script.
#
#    python -m app.package_a.module_a
if __name__ == '__main__':
    print aaa(111, 222)
    print bbb(333)

module_b.py

def bbb(s):
    return s + 1

test_app.py

import unittest

# From the point of view of testing code, our working modules
# are siblings. Imports work accordingly, as seen in module_a.
from app.package_a.module_a import aaa
from app.package_a.module_a import bbb

class TestApp(unittest.TestCase):

    def test_aaa(self):
        self.assertEqual(aaa(77, 88), '77 89')

    def test_bbb(self):
        self.assertEqual(bbb(99), 100)

# Simiarly, we can run our test modules directly as scripts using the -m option,
# or using nose.
#
#    python -m app.test.test_app
#    nosetests app/test/test_app.py

if __name__ == '__main__':
    unittest.main()

【讨论】:

  • 感谢您的示例,但我敢肯定,如果您运行 test_app.py,它会抱怨找不到“应用程序”。认为在将包部署到 Python 包含路径之前必须通过测试。
  • @sorin 是的,但是您可以非常接近我回答末尾提供的两个示例。
  • 重点是在没有任何参数的情况下调用测试框架。
  • @sorin 这也有效,至少对鼻子有用。如果你只是运行'nosetests',所有的测试都会被执行。我想我不明白你的目标,但祝你好运。
  • @Lee 如果你想测试foo()函数,测试方法确实不是必须命名为test_foo() -- 可以是test_bar()或任何名字别的。但是如果您希望测试运行框架(例如,unittest 或nose 或pytest)发现您的测试,您需要遵循一些通用的命名约定(例如,以test_ 开头的方法名称)。我不记得确切的规则,但它们很容易在文档中搜索到。
猜你喜欢
  • 2012-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多