首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用典型的测试目录结构运行单元测试

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

Stack Overflow用户
提问于 2009-12-13 16:10:23
回答 24查看 355.2K关注 0票数 938

对于一个简单的Python模块来说,最常见的目录结构似乎是将单元测试分离到他们自己的test目录中:

代码语言:javascript
复制
new_project/
    antigravity/
        antigravity.py
    test/
        test_antigravity.py
    setup.py
    etc.

我的问题仅仅是,实际运行测试的通常方式是什么?我猜想,除了我之外,每个人都很清楚这一点,但您不能只从测试目录运行python test_antigravity.py,因为它的import antigravity将失败,因为模块不在路径上。

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

另一种选择是将测试文件复制到另一个目录中,但这似乎有点愚蠢,而且它忽略了首先将它们放在单独的目录中的意义。

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

EN

回答 24

Stack Overflow用户

回答已采纳

发布于 2014-06-17 14:49:19

在我看来,最好的解决方案是使用unittest 命令行接口,它将把目录添加到sys.path中,这样您就不必(在TestLoader类中完成)。

例如,对于这样的目录结构:

代码语言:javascript
复制
new_project
├── antigravity.py
└── test_antigravity.py

你可以跑:

代码语言:javascript
复制
$ cd new_project
$ python -m unittest test_antigravity

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

代码语言:javascript
复制
new_project
├── antigravity
│   ├── __init__.py         # make it a package
│   └── antigravity.py
└── test
    ├── __init__.py         # also make test a package
    └── test_antigravity.py

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

代码语言:javascript
复制
# 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

代码语言:javascript
复制
$ cd new_project
$ python -m unittest test.test_antigravity

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

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

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

代码语言:javascript
复制
$ python -m unittest test.test_antigravity.GravityTestCase
$ python -m unittest test.test_antigravity.GravityTestCase.test_method

运行所有测试的

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

代码语言:javascript
复制
$ 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包中的所有test模块。

票数 859
EN

Stack Overflow用户

发布于 2009-12-13 20:40:58

用户最简单的解决方案是提供一个可执行脚本(runtests.py或其他类似的脚本),它引导必要的测试环境,包括在需要时将根目录临时添加到sys.path。这不需要用户设置环境变量,在引导脚本中,类似这样的操作很好:

代码语言:javascript
复制
import sys, os

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

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

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

此外,Python 2.7+中的单元测试模块 (支持Python2.6和更早版本的unittest2 )现在已经内置了测试发现,因此如果您想要自动测试发现,就不再需要鼻子了:用户指令可以像python -m unittest discover一样简单。

票数 54
EN

Stack Overflow用户

发布于 2020-01-14 11:15:05

我也有同样的问题有很长时间了。我最近选择的是以下目录结构:

代码语言:javascript
复制
project_path
├── Makefile
├── src
│   ├── script_1.py
│   ├── script_2.py
│   └── script_3.py
└── tests
    ├── __init__.py
    ├── test_script_1.py
    ├── test_script_2.py
    └── test_script_3.py

在测试文件夹的__init__.py脚本中,我编写了以下内容:

代码语言:javascript
复制
import os
import sys
PROJECT_PATH = os.getcwd()
SOURCE_PATH = os.path.join(
    PROJECT_PATH,"src"
)
sys.path.append(SOURCE_PATH)

共享项目的超级重要的是Makefile,因为它强制正确地运行脚本。下面是我在Makefile中输入的命令:

代码语言:javascript
复制
run_tests:
    python -m unittest discover .

Makefile非常重要,不仅因为它运行的命令,而且还因为它从哪里运行它。如果您要在测试中进行cd并执行python -m unittest discover .,它将无法工作,因为unit_tests中的init脚本调用了os.getcwd(),这将指向不正确的绝对路径(该路径将被附加到sys.path中,您将丢失源文件夹)。这些脚本将在发现查找所有测试后运行,但它们无法正常运行。所以Makefile的存在是为了避免记住这个问题。

我非常喜欢这种方法,因为我不需要触摸src文件夹、单元测试或环境变量,一切都会顺利运行。

票数 44
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1896918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档