使用典型的测试目录结构运行单元测试

2022-09-05 01:14:29

即使是一个简单的Python模块,非常常见的目录结构似乎也是将单元测试分离到它们自己的目录中:test

new_project/
    antigravity/
        antigravity.py
    test/
        test_antigravity.py
    setup.py
    etc.

我的问题是,实际运行测试的常用方法是什么?我怀疑除了我之外,这对每个人来说都是显而易见的,但是你不能只是从测试目录运行,因为它会失败,因为模块不在路径上。python test_antigravity.pyimport antigravity

我知道我可以修改PYTHONPATH和其他与搜索路径相关的技巧,但我不敢相信这是最简单的方法 - 如果你是开发人员,这很好,但如果用户只是想检查测试是否通过,那么期望他们使用是不现实的。

另一种选择只是将测试文件复制到另一个目录中,但它似乎有点愚蠢,并且错过了将它们放在单独的目录中开始的要点。

那么,如果您刚刚将源代码下载到我的新项目中,您将如何运行单元测试?我更喜欢一个答案,让我对我的用户说:“要运行单元测试,请执行X。


答案 1

在我看来,最好的解决方案是使用命令行界面,它将目录添加到,这样你就不必这样做(在课堂上完成)。unittestsys.pathTestLoader

例如,对于如下所示的目录结构:

new_project
├── antigravity.py
└── test_antigravity.py

您可以运行:

$ cd new_project
$ python -m unittest test_antigravity

对于像您这样的目录结构:

new_project
├── antigravity
│   ├── __init__.py         # make it a package
│   └── antigravity.py
└── test
    ├── __init__.py         # also make test a package
    └── test_antigravity.py

在包内的测试模块中,您可以像往常一样导入包及其模块:testantigravity

# import the package
import antigravity

# import the antigravity module
from antigravity import antigravity

# or an object inside the antigravity module
from antigravity.antigravity import my_object

运行单个测试模块:

要运行单个测试模块,在本例中:test_antigravity.py

$ cd new_project
$ python -m unittest test.test_antigravity

只需以与导入测试模块相同的方式引用测试模块即可。

运行单个测试用例或测试方法:

您还可以运行单个或单个测试方法:TestCase

$ python -m unittest test.test_antigravity.GravityTestCase
$ python -m unittest test.test_antigravity.GravityTestCase.test_method

运行所有测试:

您还可以使用测试发现,它将为您发现并运行所有测试,它们必须是命名的模块或包(可以使用标志进行更改):test*.py-p, --pattern

$ cd new_project
$ python -m unittest discover
$ # Also works without discover for Python 3
$ # as suggested by @Burrito in the comments
$ python -m unittest

这将运行包中的所有模块。test*.pytest


答案 2

对于您的用户来说,最简单的解决方案是提供一个可执行脚本(或类似脚本),用于引导必要的测试环境,包括在需要时临时添加根项目目录。这不需要用户设置环境变量,像这样的东西在引导脚本中工作正常:runtests.pysys.path

import sys, os

sys.path.insert(0, os.path.dirname(__file__))

然后,您对用户的说明可以像“”一样简单。python runtests.py

当然,如果你真的需要的路径是 ,那么你根本不需要添加它;Python 总是将 当前正在运行的脚本的目录放在 的开头,因此根据您的目录结构,只需将目录放在正确的位置即可。os.path.dirname(__file__)sys.pathsys.pathruntests.py

此外,Python 2.7+中的unittest模块(在Python 2.6及更早版本中作为unittest2向后移植)现在内置了测试发现,因此,如果您想要自动测试发现,则不再需要鼻子:您的用户指令可以像.python -m unittest discover


推荐