Pytest:Windows致命异常:访问冲突



我正在使用pytest为我的项目运行一些测试。有时(大约30%到50%(我会在测试结束后出错。但这阻碍了测试引擎创建测试报告,这真的很痛苦。

错误:

Windows fatal exception: access violation
Current thread 0x000019e0 (most recent call first):
File "C:Python38libthreading.py", line 1200 in invoke_excepthook
File "C:Python38libthreading.py", line 934 in _bootstrap_inner
File "C:Python38libthreading.py", line 890 in _bootstrap
Thread 0x00001b0c (most recent call first):
File "C:Python38libsite-packagesserialserialwin32.py", line 240 in _close
File "C:Python38libsite-packagesserialserialwin32.py", line 246 in close
File "C:NoBackupsvntest_system_smets2pyetspluginsplugin_zigbee_dongle.py", line 141 in disconnect
File "C:NoBackupsvntest_system_smets2pyetspluginsplugin_zigbee_dongle.py", line 232 in stop
File "C:NoBackupsvntest_system_smets2pyetstestengineplugin_manager.py", line 286 in stop
File "C:NoBackupsvntest_system_smets2pyetstestenginetestengine.py", line 112 in session_finalize
File "C:NoBackupsvntest_system_smets2pyetstestenginepytest_test_engine.py", line 58 in test_engine
File "C:Python38libsite-packages_pytestfixtures.py", line 800 in _teardown_yield_fixture
File "C:Python38libsite-packages_pytestfixtures.py", line 871 in finish
File "C:Python38libsite-packages_pytestrunner.py", line 318 in _callfinalizers
File "C:Python38libsite-packages_pytestrunner.py", line 328 in _teardown_with_finalization
File "C:Python38libsite-packages_pytestrunner.py", line 310 in _pop_and_teardown
File "C:Python38libsite-packages_pytestrunner.py", line 350 in _teardown_towards
File "C:Python38libsite-packages_pytestrunner.py", line 342 in teardown_exact
File "C:Python38libsite-packages_pytestrunner.py", line 148 in pytest_runtest_teardown
File "C:Python38libsite-packagespluggycallers.py", line 187 in _multicall
File "C:Python38libsite-packagespluggymanager.py", line 83 in <lambda>
File "C:Python38libsite-packagespluggymanager.py", line 92 in _hookexec
File "C:Python38libsite-packagespluggyhooks.py", line 286 in __call__
File "C:Python38libsite-packages_pytestrunner.py", line 217 in <lambda>
File "C:Python38libsite-packages_pytestrunner.py", line 244 in from_call
File "C:Python38libsite-packages_pytestrunner.py", line 216 in call_runtest_hook
File "C:Python38libsite-packages_pytestrunner.py", line 186 in call_and_report
File "C:Python38libsite-packages_pytestrunner.py", line 101 in runtestprotocol
File "C:Python38libsite-packages_pytestrunner.py", line 85 in pytest_runtest_protocol
File "C:Python38libsite-packagespluggycallers.py", line 187 in _multicall
File "C:Python38libsite-packagespluggymanager.py", line 83 in <lambda>
File "C:Python38libsite-packagespluggymanager.py", line 92 in _hookexec
File "C:Python38libsite-packagespluggyhooks.py", line 286 in __call__
File "C:Python38libsite-packages_pytestmain.py", line 272 in pytest_runtestloop
File "C:Python38libsite-packagespluggycallers.py", line 187 in _multicall
File "C:Python38libsite-packagespluggymanager.py", line 83 in <lambda>
File "C:Python38libsite-packagespluggymanager.py", line 92 in _hookexec
File "C:Python38libsite-packagespluggyhooks.py", line 286 in __call__
File "C:Python38libsite-packages_pytestmain.py", line 247 in _main
File "C:Python38libsite-packages_pytestmain.py", line 191 in wrap_session
File "C:Python38libsite-packages_pytestmain.py", line 240 in pytest_cmdline_main
File "C:Python38libsite-packagespluggycallers.py", line 187 in _multicall
File "C:Python38libsite-packagespluggymanager.py", line 83 in <lambda>
File "C:Python38libsite-packagespluggymanager.py", line 92 in _hookexec
File "C:Python38libsite-packagespluggyhooks.py", line 286 in __call__
File "C:Python38libsite-packages_pytestconfig__init__.py", line 124 in main
File "testrun.py", line 1184 in run_single_test
File "testrun.py", line 1548 in main
File "testrun.py", line 1581 in <module>

有人知道如何修复或调试吗?

我在win10上使用pytest 5.4.1和python 3.8.0。但这也可以在旧的pytest版本中复制。

插件plugin_zigbee_dongle.py使用pyserial(3.4(在线程中与usb rf加密狗通信。以下代码是该插件的一个片段:

import serial
import threading
class ZigbeeDongleSerial(object):
def __init__(self, test_engine):
self.ser = serial.Serial()
self.test_engine = test_engine
# ----------------------------------------------------------
def connect(self,
port,
baud,
timeout):
self.ser.baudrate = baud
self.ser.timeout = timeout
self.ser.port = port
self.ser.open()

# ----------------------------------------------------------
def disconnect(self):
try:
if self.is_connected():
self.ser.close() # <------- This is line 141 ----------
except:
pass
# ----------------------------------------------------------
# ----------------------------------------------------------
class PluginZigbeeDongle(PluginBase):
# ----------------------------------------------------------
def __init__(self, test_engine):
super(PluginZigbeeDongle, self).__init__()
self.test_engine        = test_engine

self.dongle_serial = ZigbeeDongleSerial(self.test_engine)
self._startup_lock = threading.Lock()
self._startup_lock.acquire()
self.reader_thread = threading.Thread(target=self._read_worker, name="ZigbeeDongleThread")
# ----------------------------------------------------------
def start(self):
super(PluginZigbeeDongle, self).start()
# connect the serial port
self.dongle_serial.connect()
# start the reader thread
if self.dongle_serial.is_connected():
self.reader_thread.start()
# ----------------------------------------------------------
def stop(self):
super(PluginZigbeeDongle, self).stop()
# disconnect the serial port
if self.dongle_serial.is_connected():
self.dongle_serial.disconnect() # <------- This is line 232 ----------
# stop the reader thread
if self.reader_thread.is_alive():
self.reader_thread.join()
# ----------------------------------------------------------
def _read_worker(self):
# start-up is now complete
self._startup_lock.release()
# handle the incoming character stream
done = False
while not done:
try:
c = self.dongle_serial.read_byte()
except serial.SerialException:
done = True
except AttributeError:
done = True
if not done:
self._read_parser(c)

将pyserial从3.4版降级到2.7版修复了问题

最新更新