我编写了一个名为
scraping_test.py
的 python 测试文件,其中包含一个测试类,使用 unittest
,名为 TestScrapingUtils
"""Tests for the scraping app"""
import unittest
from bs4 import BeautifulSoup as bs4
from mosque_scraper.management.commands import scraping_utils
from mosque_scraper.selectors import MOSQUE_INFO_ROWS_SELECTOR
class TestScrapingUtils(unittest.TestCase):
"""Test scraping_utils.py """
def setup(self):
"""Setup McSetupface."""
pass
def test_get_keys_from_row(self):
""" Test that we extract the correct keys from the supplied rows."""
test_page_name = "test_page.html"
with open(test_page_name) as test_page_file:
test_mosque = bs4(test_page_file, 'html.parser')
rows = test_mosque.select(MOSQUE_INFO_ROWS_SELECTOR)
field_dict = scraping_utils.get_fields_from_rows(rows)
self.assertDictEqual(field_dict, {})
我的单元测试设置是:
{
"python.unitTest.unittestEnabled": true,
"python.unitTest.unittestArgs": [
"-v",
"-s",
".",
"-p",
"*test.py"
]
}
看起来应该可以工作,但是当我单击在 VSCode 中运行测试时,它说没有发现测试:
未发现测试,请检查测试的配置设置。
如何让它发挥作用?
您必须使用快捷键shift+ctrl p运行一次,然后输入“Python run all unit test”。
只有成功执行至少一次或使用discover单元测试方法,它才会显示在编辑器中。
但是,我多次注意到的一件事是 Python 文件必须是有效的 Python 文件。 VS Code for Python 中的智能感知并不复杂(与 Javascript 或 Typescript 相比),并且不会突出显示任何语法错误。您可以通过强制它运行所有单元测试并观察 Python 测试日志窗口来验证这一点。
令我困惑的是,必须在每个子目录中创建
__init__.py
文件,从使用-s
选项指定的根文件夹(在示例中为当前目录"."
)到测试模块所在的子目录。只有这样我才能成功发现测试。
在问题示例中,
project_dir/
和project_dir/scraping_app/
都应包含__init__.py
。假设 settings.json
位于 project_dir/.vscode
并且测试从 project_dir/
目录运行。
编辑: 或者,使用
"-s", "./scraping_app/"
作为根测试目录,这样您就不必将 __init__.py
放入 project_dir/
。
您可以在测试包的
DJANGO_SETTINGS_MODULE
文件中添加django.setup()
变量和__init__.py
。
import os
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_app.settings')
django.setup()
文件名应为“test_scraping.py”,而不是“scraping_test.py” 字符串应从 'test' 前缀开始
我遇到了同样的错误,但配置略有不同。 (我将其发布在这里是因为这是您搜索此错误时出现的问题。)
除了上面所说的之外,不要在测试文件名中使用句点(例如使用
module_test.py
而不是module.test.py
)也很重要。
就我而言,问题是我的测试正在导入一个使用
os.environ['ENV_NAME']
读取环境变量的模块。如果变量不存在,则会抛出错误。但 VS Code 不会记录任何内容(或者至少我找不到它)。
所以,原因是我的 .env 文件不在工作区根目录中。所以我必须将
"python.envFile": "${workspaceFolder}/path/to/.env"
添加到 settings.json
文件中。
之后测试发现成功。
也有这个问题。 对我来说,问题是,确保没有错误,并注释掉依赖 pytest 的文件中的所有代码,仅用于初始加载。
导致单元测试未被发现的另一个问题是使用包含对 conda 包本身的显式依赖项的 conda 环境时。当
enviroment.yml
包含以下行时会发生这种情况:
- conda
删除此行并从头开始创建环境使单元测试可发现。我为此在 Github 中创建了一个错误报告:https://github.com/microsoft/vscode-python/issues/19643
(这是我对此问题的第二个解决方案;我决定创建另一个答案,因为这与前一个完全不同。)
这是我第一次在 vscode 中使用unittest。我发现文件名不能包含空格和点。并且不能以数字开头。
对于点,我想单元测试的扩展会考虑点后面的任何内容。
对于空格,我猜他们没有使用“”来包围文件名。
我的解决方案是:测试的名称-功能 - 不仅仅是文件的名称! 函数需要以“test_”开头
配置
settings.json
"python.testing.unittestArgs": [
"-v",
"-s",
".",
"-p",
"***_test**.py"
],
"python.testing.pytestEnabled": false,
"python.testing.unittestEnabled": true
something_test.py
--> 这个 _test 很重要 import unittest
class something(unittest.TestCase):
def test_case1(self):
self.assertFalse(False)
if __name__ == '__main__':
unittest.main()
test_case1(self)
的
test_很重要
对我来说,发现单元测试成功了。
SHIFT+CTRL+P并执行“Python:发现单元测试”
运行此命令后,我在每个测试函数上获得“运行测试|调试测试”。