๋ด pytest.ini
์ ๋ค์ ์ฝํ
์ธ ๊ฐ ์์ต๋๋ค.
[pytest]
DJANGO_SETTINGS_MODULE = project.settings_pytest
addopts = --doctest-modules --cov=. --cov-report html:./coverage/python/html
norecursedirs = .git .venv .vscode node_modules
--cov-report
๋ก ์ ๋ฌ๋ ์ ๋์ค ๊ณ์ด ๊ฒฝ๋ก๊ฐ Windows์์ ์ต์ ๋ฒ์ ์ pytest-django๋ฅผ ์ถฉ๋์ํค๋ ์์ธ์ด ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ( .ini
ํ์ผ์ ์๊ธฐ ๋๋ฌธ์ ํ๋ซํผ์ ๋
๋ฆฝ์ ์ผ๋ก ์ง์ ํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฆ
๋๋ค.)
pytest
์คํํ ๋ ํ์๋๋ ์ญ์ถ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Traceback (most recent call last):
File "C:\Program Files\Python37\Lib\runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "C:\Program Files\Python37\Lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "C:\Users\Atul\.virtualenvs\tenants2-Gxdtcl1v\Scripts\pytest.exe\__main__.py", line 9, in <module>
File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\_pytest\config\__init__.py", line 55, in main
config = _prepareconfig(args, plugins)
File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\_pytest\config\__init__.py", line 180, in _prepareconfig
pluginmanager=pluginmanager, args=args
File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pluggy\hooks.py", line 258, in __call__
return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs)
File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pluggy\manager.py", line 67, in _hookexec
return self._inner_hookexec(hook, methods, kwargs)
File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pluggy\manager.py", line 61, in <lambda>
firstresult=hook.spec_opts.get('firstresult'),
File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pluggy\callers.py", line 196, in _multicall
gen.send(outcome)
File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\_pytest\helpconfig.py", line 89, in pytest_cmdline_parse
config = outcome.get_result()
File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pluggy\callers.py", line 76, in get_result
raise ex[1].with_traceback(ex[2])
File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pluggy\callers.py", line 180, in _multicall
res = hook_impl.function(*args)
File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\_pytest\config\__init__.py", line 612, in pytest_cmdline_parse
self.parse(args)
File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\_pytest\config\__init__.py", line 777, in parse
self._preparse(args, addopts=addopts)
File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\_pytest\config\__init__.py", line 739, in _preparse
early_config=self, args=args, parser=self._parser
File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pluggy\hooks.py", line 258, in __call__
return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs)
File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pluggy\manager.py", line 67, in _hookexec
return self._inner_hookexec(hook, methods, kwargs)
File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pluggy\manager.py", line 61, in <lambda>
firstresult=hook.spec_opts.get('firstresult'),
File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pluggy\callers.py", line 201, in _multicall
return outcome.get_result()
File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pluggy\callers.py", line 76, in get_result
raise ex[1].with_traceback(ex[2])
File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pluggy\callers.py", line 180, in _multicall
res = hook_impl.function(*args)
File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pytest_django\plugin.py", line 209, in pytest_load_initial_conftests
_django_project_scan_outcome = _add_django_project_to_path(args)
File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pytest_django\plugin.py", line 140, in _add_django_project_to_path
project_dir = find_django_path(args)
File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pytest_django\plugin.py", line 127, in find_django_path
args = [p for p in args if p.is_dir()]
File "c:\users\atul\.virtualenvs\tenants2-gxdtcl1v\lib\site-packages\pytest_django\plugin.py", line 127, in <listcomp>
args = [p for p in args if p.is_dir()]
File "C:\Program Files\Python37\Lib\pathlib.py", line 1330, in is_dir
return S_ISDIR(self.stat().st_mode)
File "C:\Program Files\Python37\Lib\pathlib.py", line 1140, in stat
return self._accessor.stat(self)
OSError: [WinError 123] The filename, directory name, or volume label syntax is incorrect: 'html:.\\coverage\\python\\html'
pathlib๋ก์ ์ ํ์ผ๋ก ์ธํ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.
/cc @voidus
ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก --cov-report=html:./coverage/python/html
๋ฅผ ์๋ํ์ญ์์ค.
์๋ ํ์ธ์ pytest .\app\tests.py::WebServiceTest์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์๋ํฉ๋๊น?
์๋
ํ์ธ์
OSError: [WinError 123] Die Syntax fรผr den Dateinamen, Verzeichnisnamen oder die Datentrรคgerbezeichnung ist falsch: 'app\tests.py::WebServiceTest'
(์ค๋ฅ ํ
์คํธ๋ ๋
์ผ์ด์)
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ๋ด pytest.ini ํ์ผ์ ๋๋ค. ์ทจ์ฌ ๋ด์ฉ์ด ์์ต๋๋ค.
[ํ์ดํ
์คํธ]
DJANGO_SETTINGS_MODULE = DjangoBasisLager.settings
python_files = tests.py tests_*.py *_tests.py
๋ฌธ์ ๋ ํ ์คํธ ํ์ผ์ ๊ฒฝ๋ก์ ์์ต๋๋ค.
์ ์ฒด ์ค๋ฅ ๋ก๊ทธ:
(DjangoBasisLager--RYvLsCA) PS C:UsersLubitzworkspacebasislagerDjangoBasisLager> pytest .\app\tests.py::WebServiceTest
์ญ์ถ์ (๊ฐ์ฅ ์ต๊ทผ ํธ์ถ ๋ง์ง๋ง):
ํ์ผ "C:Program FilesPython36Librunpy.py", 193ํ, _run_module_as_main
"__main__", mod_spec)
ํ์ผ "C:Program FilesPython36Librunpy.py", 85ํ, _run_code
exec(์ฝ๋, run_globals)
ํ์ผ "C:UsersLubitz.virtualenvsDjangoBasisLager--RYvLsCAScriptspytest.exe__main__.py", 9ํ,
ํ์ผ "c:userslubitz.virtualenvsdjangobasislager--ryvlscalibsite-packages_pytestconfig__init__.py", ๋ผ์ธ 56, ๋ฉ์ธ
๊ตฌ์ฑ = _prepareconfig(์ธ์, ํ๋ฌ๊ทธ์ธ)
ํ์ผ "c:userslubitz.virtualenvsdjangobasislager--ryvlscalibsite-packages_pytestconfig__init__.py", 181ํ, _prepareconfig
ํ๋ฌ๊ทธ์ธ ๊ด๋ฆฌ์=ํ๋ฌ๊ทธ์ธ ๊ด๋ฆฌ์, ์ธ์=์ธ์
ํ์ผ "c:userslubitz.virtualenvsdjangobasislager--ryvlscalibsite-packagespluggyhooks.py", 258ํ, __call__
return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs)
ํ์ผ "c:userslubitz.virtualenvsdjangobasislager--ryvlscalibsite-packagespluggymanager.py", 67ํ, _hookexec
return self._inner_hookexec(ํํฌ, ๋ฉ์๋, kwargs)
ํ์ผ "c:userslubitz.virtualenvsdjangobasislager--ryvlscalibsite-packagespluggymanager.py", ๋ผ์ธ 61,
firstresult=hook.spec_opts.get('firstresult'),
ํ์ผ "c:userslubitz.virtualenvsdjangobasislager--ryvlscalibsite-packagespluggycallers.py", ๋ผ์ธ 196, _multicall
gen.send(๊ฒฐ๊ณผ)
ํ์ผ "c:userslubitz.virtualenvsdjangobasislager--ryvlscalibsite-packages_pytesthelpconfig.py", 89ํ, pytest_cmdline_parse
๊ตฌ์ฑ = ๊ฒฐ๊ณผ.get_result()
ํ์ผ "c:userslubitz.virtualenvsdjangobasislager--ryvlscalibsite-packagespluggycallers.py", 76ํ, get_result
ex[1].with_traceback(ex[2]) ์ฌ๋ฆฌ๊ธฐ
ํ์ผ "c:userslubitz.virtualenvsdjangobasislager--ryvlscalibsite-packagespluggycallers.py", 180ํ, _multicall
res = hook_impl.function( ์ธ์)ํ์ผ "c:userslubitz.virtualenvsdjangobasislager--ryvlscalibsite-packages_pytestconfig__init__.py", 617ํ, pytest_cmdline_parseself.parse(์ธ์)ํ์ผ "c:userslubitz.virtualenvsdjangobasislager--ryvlscalibsite-packages_pytestconfig__init__.py", 782ํ, ๊ตฌ๋ฌธ ๋ถ์ ์คself._preparse(์ธ์, addopts=addopts)ํ์ผ "c:userslubitz.virtualenvsdjangobasislager--ryvlscalibsite-packages_pytestconfig__init__.py", 744ํ, _preparseEarly_config=self, args=args, ํ์=self._parserํ์ผ "c:userslubitz.virtualenvsdjangobasislager--ryvlscalibsite-packagespluggyhooks.py", 258ํ, __call__return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs)ํ์ผ "c:userslubitz.virtualenvsdjangobasislager--ryvlscalibsite-packagespluggymanager.py", 67ํ, _hookexecreturn self._inner_hookexec(ํํฌ, ๋ฉ์๋, kwargs)ํ์ผ "c:userslubitz.virtualenvsdjangobasislager--ryvlscalibsite-packagespluggymanager.py", 61ํ,
ํ์ผ "C:UsersLubitz.virtualenvsDjangoBasisLager--RYvLsCAlibsite-packagespytest_djangoplugin.py", 209ํ, pytest_load_initial_conftests
_django_project_scan_outcome = _add_django_project_to_path(์ธ์)
ํ์ผ "C:UsersLubitz.virtualenvsDjangoBasisLager--RYvLsCAlibsite-packagespytest_djangoplugin.py", 140ํ, _add_django_project_to_path
project_dir = find_django_path(์ธ์)
ํ์ผ "C:UsersLubitz.virtualenvsDjangoBasisLager--RYvLsCAlibsite-packagespytest_djangoplugin.py", 127ํ, find_django_path
args = [p for p for p in args if p.is_dir()]
ํ์ผ "C:UsersLubitz.virtualenvsDjangoBasisLager--RYvLsCAlibsite-packagespytest_djangoplugin.py", 127ํ,
args = [p for p for p in args if p.is_dir()]
ํ์ผ "C:Program FilesPython36Libpathlib.py", 1346ํ, is_dir
๋ฐํ S_ISDIR(self.stat().st_mode)
ํ์ผ "C:Program FilesPython36Libpathlib.py", 1156ํ, ํต๊ณ
self._accessor.stat(self)๋ฅผ ๋ฐํํฉ๋๋ค.
ํ์ผ "C:Program FilesPython36Libpathlib.py", ์ค 387, ๋ํ๋จ
๋ฐํ strfunc(str(pathobj), *args)
OSError: [WinError 123] Die Syntax fรผr den Dateinamen, Verzeichnisnamen oder die Datentrรคgerbezeichnung ist falsch: 'app\tests.py::WebServiceTest'
์, ์๊ฒ ์ต๋๋ค. ์ ์์ ์ธ ์ธ์์ ๋ํด ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค.
@voidus
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์กฐ์ฌํด ์ฃผ์๊ฒ ์ต๋๊น?
์๋ ํ์ธ์, ์ด๋ค ์์ผ๋ก๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ ๋๋ฆด ์ ์์ต๋๊น? ํ ์คํธํ ์ ์๋ ๋ธ๋ฐ์น๊ฐ ์์ต๋๊น? ์๋๋ฉด ๋ฌธ์ ๋ฅผ ์ดํด๋ณด๊ณ ํด๊ฒฐํด์ผ ํฉ๋๊น?
@pinguin999
ํ
์คํธํ ํญ๋ชฉ์ด ์์ต๋๋ค.
์ถ๊ฐ๋๋ pathlib ์ฝ๋์ ๊ด๋ จ์ด ์์ต๋๋ค(์คํ ์ถ์ ์ฐธ์กฐ).
PR์ ์์ ์ฌํญ์ ์ ๊ณตํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์
๋๋ค.
@pinguin999 ์ด ์ค๋ฅ์ ์์ธ์ด ๋ฌด์์ธ์ง ์ ํํ ๋ชจ๋ฅด์ง๋ง ํ
์คํธ ํด๋์ค ์ฌ์( ::WebServiceTest
)์ด ์์ธ์ผ ์ ์์ต๋๋ค.
ํ
์คํธ๋ฅผ ์คํํ๊ธฐ ์ ์ ํด๋น ๋ถ๋ถ์ ๋ถ๋ฆฌํ๋ ๋ถ๊ธฐ๋ฅผ ๋ง๋ค์์ต๋๋ค. ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฐ๋ฐ ์ค์ ์ด ์๋ Windows ์์คํ
์ด ์๊ธฐ ๋๋ฌธ์ ์๋ํด ๋ณผ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์
๋๋ค. https://github.com/voidus/pytest-django ์์ ๋ด ํฌํฌ์ oserror_pathlib
๋ถ๊ธฐ์์ ์ฐพ์ ์ ์์ต๋๋ค .
https://github.com/voidus/pytest-django/tree/oserror_pathlib
์, ๋ถ๋ช
ํ ์ธ์์ ":"๋ Windows์์ ๊ตฌ์ ๋ฉ๋๋ค.
๋๋ ๋น์ ์ ํจ์น๊ฐ ๊ด์ฐฎ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ ๋ ๊ทธ๊ฒ์ผ๋ก https://github.com/pytest-dev/pytest-django/pull/648 ์ ๋ง๋ค์์ต๋๋ค.
์๋
ํ์ธ์
๋ฏธ์ ๋ด๊ฐ ํด์ผ์ ์์๋ค.
3.4.3์ผ๋ก ์
๋ฐ์ดํธํ๊ณ ์๋ํฉ๋๋ค.
๊ฐ์ฌํฉ๋๋ค
# ์ด ์ฝ๋ ์ค ์ ๊ฑฐ ====== 'module_name',
INSTALLED_APPS ๋ชฉ๋ก์์
๊ธ์, ์ด๊ฒ์ ๋์๊ฒ๋ ์ผ์ด๋ฌ์ต๋๋ค.
๋จผ์ ํ๋ก์ ํธ ํด๋์์ ์ฑ์ ์์ํ๋์ง ํ์ธํ์ญ์์ค.
์๋ฅผ ๋ค์ด:
"django-admin startproject ์น์ฌ์ดํธ
CD ์น์ฌ์ดํธ
django-admin startapp ์์
"