Я запускаю pytest от subprocess.Popen
.
Как видно из приведенного ниже кода и его вывода, pytest завершается с кодом выхода 1, но процесс считает, что он завершился с кодом выхода 2. Почему? (в настоящее время думаю, что это ошибка Pytest [ошибка соответствует описанию, но не коду, который заставляет меня думать, что они забыли обновить его))
[Сама ошибка не является проблемой (она возникает из-за наличия нескольких конфликтующих файлов, и это нормально, поскольку я хочу создавать ошибки)]
In [1]: from subprocess import Popen
...: p = Popen('pytest -s -k some_phrase'.split())
...: p.communicate()
...: print p.poll()
...:
Test session starts (platform: linux2, Python 2.7.12, pytest 4.5.0, pytest-sugar 0.9.2)
rootdir: /...
plugins: timeout-1.3.3, sugar-0.9.2, repeat-0.8.0, metadata-1.8.0, html-1.20.0, cov-2.7.1
collecting ... Failed to import pybind11_tests from pytest:
ImportError: No module named pybind11_tests
―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― test session ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
.../local/lib/python2.7/site-packages/py/_path/common.py:377: in visit
for x in Visitor(fil, rec, ignore, bf, sort).gen(self):
.../local/lib/python2.7/site-packages/py/_path/common.py:429: in gen
for p in self.gen(subdir):
.../local/lib/python2.7/site-packages/py/_path/common.py:429: in gen
for p in self.gen(subdir):
.../local/lib/python2.7/site-packages/py/_path/common.py:429: in gen
for p in self.gen(subdir):
.../local/lib/python2.7/site-packages/py/_path/common.py:419: in gen
if p.check(dir=1) and (rec is None or rec(p))])
.../local/lib/python2.7/site-packages/_pytest/main.py:660: in _recurse
ihook = self.gethookproxy(dirpath)
.../local/lib/python2.7/site-packages/_pytest/main.py:481: in gethookproxy
my_conftestmodules = pm._getconftestmodules(fspath)
.../local/lib/python2.7/site-packages/_pytest/config/__init__.py:421: in _getconftestmodules
mod = self._importconftest(conftestpath.realpath())
.../local/lib/python2.7/site-packages/_pytest/config/__init__.py:443: in _importconftest
mod = conftestpath.pyimport()
.../local/lib/python2.7/site-packages/py/_path/local.py:668: in pyimport
__import__(modname)
.../local/lib/python2.7/site-packages/_pytest/assertion/rewrite.py:301: in load_module
exec(co, mod.__dict__)
...
sys.exit(1)
E SystemExit: 1
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Results (0.44s):
2
Кстати, я проверил то же самое, используя os.system('pytest -s -k bla')
, и там я получил код ошибки 512. Кажется, что код выхода не распространяется должным образом ...
Я повторил попытку с новой ожидаемой ошибкой - теперь я не ожидаю, что тесты собраны, и кажется, что код ошибки правильный:
In [3]: from subprocess import Popen, PIPE, check_output
...: p = Popen('pytest --disable-warnings -s -k some_phrase', shell=True)
...: p.communicate()
...: print p.poll()
...:
...
Results (2.59s):
4275 deselected
5
И это правильный код, для pytest
Возможные коды выхода
Запуск pytest может привести к шести различным кодам выхода:
Exit code 0: All tests were collected and passed successfully
Exit code 1: Tests were collected and run but some of the tests failed
Exit code 2: Test execution was interrupted by the user
Exit code 3: Internal error happened while executing tests
Exit code 4: pytest command line usage error
Exit code 5: No tests were collected <----