我正在尝试使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"
,但未成功
答案 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 docs 为 unittest
造成这种情况的一个常见原因是您尝试运行具有依赖项的测试。如果是这种情况,您可以通过运行 ctrl
+ shift
+ p
并搜索 Python: Select Interpreter
,然后选择正确的解释器来选择您的解释器。