相关文件
想学Python的小伙伴可以关注小编的公众号【Python日志】
有很多的资源可以白嫖的哈,不定时会更新一下Python的小知识的哈!!
前言
前段时间由于将项目使用的某 SDK 进行了升级,在使用 PyCharm+unittest 运行一个用例时,能运行并输出果,却一直无法退出用例。随着排查的深入,发现是此 SDK 中的线程在“作祟”。
用简单的代码复现
简单起见,下面这段代码(Python 2)包含了简单的线程逻辑和一个用例,来复现遇到的问题:
# coding: utf-8
import threading
import time
import unittest
def tick():
while True:
print('tick')
time.sleep(3)
t = threading.Thread(target=tick)
t.start()
class TestString(unittest.TestCase):
def test_upper(self):
self.assertEqual('foo'.upper(), 'FOO')
这段代码开启了一个线程,每隔 3 秒输出 tick。另一方面,定义了一个用例,判断字符串的upper()方法。如果删除线程逻辑,用例能正常结束;反之,PyCharm 显示用例执行成功,却一直无法退出用例,如下图所示:
为什么不能退出?
运行用例前一定会开启新线程,执行 tick() 函数,由于此函数使用 while 循环不断输出字符串,不难推断出是用例框架在退出时一直等待线程结束,进而导致用例无法退出。
为了验证这个想法,不妨查看 PyCharm 运行用例的入口代码。不同的操作系统、PyCharm(社区版、专业版)和单测框架下用例入口文件路径都有所不同。Mac 上的 PyCharm 社区版针对 unittest 的用例入口文件路径为
“/Applications/PyCharm CE.app/Contents/plugins/python-ce/helpers/pycharm/_jb_unittest_runner.py” ,
该文件内容如下:
# coding=u