Python单元测试:在Visual Studio Code中未发现测试

时间:2018-07-05 19:47:54

标签: python visual-studio-code vscode-settings

我正在尝试使Visual Studio Code单元测试的自运行feature工作。 最近,我对Python项目的目录结构进行了更改,以前是这样的:

myproje\
    domain\
        __init__.py
    repositories\
    tests\
        __init__.py
        guardstest.py
    utils\
        __init__.py
        guards.py
    web\

我的单元测试设置如下:

    "python.unitTest.unittestArgs": [
    "-v",
    "-s",
    "tests",
    "-p",
    "*test*.py"
]

更改后,项目的结构如下:

myprojet\
    app\
        controllers\
            __init__.py
        models\
            __init__.py
            entities.py
            enums.py
        tests\
            res\
                image1.png
                image2.png
            __init__.py
            guardstest.py
        utils\
            __init__.py
            guards.py
        views\
            static\
            templnates\
        __init__.py         
    uml\

此后,该扩展程序不再发现我的测试。我尝试将'-s'参数更改为"./app/tests"".tests""./tests""app/tests""/app/tests""app.tests",但未成功

enter image description here

4 个答案:

答案 0 :(得分:2)

问题是我在测试模块(import Tkinter as tk class Page(tk.Frame): def __init__(self, *args, **kwargs): tk.Frame.__init__(self, *args, **kwargs) def show(self): self.lift() class Page1(Page): def __init__(self, *args, **kwargs): Page.__init__(self, *args, **kwargs) label = tk.Label(self, text="This is question 1") label.pack(side="top", fill="both", expand=True) class Page2(Page): def __init__(self, *args, **kwargs): Page.__init__(self, *args, **kwargs) label = tk.Label(self, text="This is question 2") label.pack(side="top", fill="both", expand=True) class Page3(Page): def __init__(self, *args, **kwargs): Page.__init__(self, *args, **kwargs) label = tk.Label(self, text="This is question 3") label.pack(side="top", fill="both", expand=True) class MainView(tk.Frame): def __init__(self, *args, **kwargs): tk.Frame.__init__(self, *args, **kwargs) p1 = Page1(self) p2 = Page2(self) p3 = Page3(self) buttonframe = tk.Frame(self) container = tk.Frame(self) buttonframe.pack(side="top", fill="x", expand=False) container.pack(side="top", fill="both", expand=True) p1.place(in_=container, x=0, y=0, relwidth=1, relheight=1) p2.place(in_=container, x=0, y=0, relwidth=1, relheight=1) p3.place(in_=container, x=0, y=0, relwidth=1, relheight=1) b1 = tk.Button(buttonframe, text="Page 1", command=p1.lift) b2 = tk.Button(buttonframe, text="Page 2", command=p2.lift) b3 = tk.Button(buttonframe, text="Page 3", command=p3.lift) b1.pack(side="left") b2.pack(side="left") b3.pack(side="left") p1.show() if __name__ == "__main__": root = tk.Tk() main = MainView(root) main.pack(side="top", fill="both", expand=True) root.wm_geometry("400x400") root.mainloop() )中使用了相对导入。 我只是将其更改为绝对导入(from ..utils import guards),然后又重新工作了。

答案 1 :(得分:1)

这是因为测试中的某些导入是不可发现的。运行python -m unittest -h时,输出的最后一行是

<块引用>

对于测试发现,所有测试模块必须可以从项目的顶级目录导入。

很可能是 VSCode 在没有正确的 PYTHONPATH 和其他环境变量的情况下运行命令。

我创建了 __init__.py 并将以下代码放入其中。

import sys
import os
import unittest

# set module path for testing
sys.path.insert(0, "path_in_PYTHONPATH")
# repead to include all paths

class TestBase(unittest.TestCase):
    def __init__(self, methodName: str) -> None:
        super().__init__(methodName=methodName)

然后在测试文件中,不要扩展unittest.TestCase,而是做

from test import TestBase 

class Test_A(TestBase):
    ...

答案 2 :(得分:0)

激活您的virtualenv,

进入您的myproject目录并运行:

python -m unittest app/tests/

这将在app/tests/中运行测试。

关注documentation,以获取更多信息。

编辑:

您需要将 cwd 参数设置为项目的根目录(myproject),并更改 unittestArgs 以在{{1}中搜索测试。 }。

app/tests

答案 3 :(得分:0)

这可能不起作用有两个原因:

测试中有错误

如果测试脚本中有错误,python Testing 插件将找不到您的测试。

要检查潜在错误,请点击 Show Test Output,然后使用 Run All Tests 运行测试(两个按钮都位于左上角,就在测试应出现的位置上方)。

如果有错误,它会出现在 OUTPUT 标签中。

测试未正确配置

检查您的 .vscode/settings.json,并选择 python.testing.unittestArgs 列表。

您可以通过向命令行中的 python3 -m unittest discover 命令添加 args 来调试命令行中的测试发现。

所以有了这个配置:

{
    "python.testing.unittestArgs": [
        "-v",
        "-s",
        ".",
        "-p",
        "*test*.py"
    ]
}

您将启动命令:

python3 -m unittest discover -v -s . -p "*test*.py"

您可以使用您发现测试的 args unitl,并相应地修改 .vscode/settings.json 中的 args。

Here are the docsunittest

注意

造成这种情况的一个常见原因是您尝试运行具有依赖项的测试。如果是这种情况,您可以通过运行 ctrl + shift + p 并搜索 Python: Select Interpreter,然后选择正确的解释器来选择您的解释器。