Rom*_*ale 6 python multithreading unit-testing
我是使用单元测试模块进行单元测试的新手,我需要测试一个使用线程模块的类。我并没有真正找到关于使用线程组合类的最佳方法的任何解决方案。我开始测试线程是否被调用(即活着),但后来我看到没有方法可以杀死线程。我需要一周的时间来确保线程中的代码在做它应该做的事情。我需要为此使用线程还是应该只测试函数本身?
谢谢你的帮助!
这是我的代码(有趣的部分):
class VideoLoader(Node):
# some code
def execute(self):
self.thread1 = Thread(target = run_resizer, args = (self,))
def run_resizer(node):
while True:
while not len(node.frames_to_resize):
time.sleep(0.001)
node.frames.append(resize({'height': 400, 'width': 500))
Run Code Online (Sandbox Code Playgroud)
小智 0
我也遇到了同样的问题,但找不到好的解决方案,所以我做了一个解决方法。我完成了你的代码,使其可以独立执行。我确实做了一个改变:我使用组合而不是继承(正如设计模式书中四人帮所推荐的那样)。
# loader.py
from threading import Thread
import time
class VideoLoader:
def __init__(self, node):
self.thread1 = None
self.node = node
self.is_resizer_active = False
def execute(self):
self.thread1 = Thread(target=self.run_resizer)
self.thread1.start()
def run_resizer(self):
node = self.node
self.is_resizer_active = True
while self.is_resizer_active: # need some way of stopping it eventually
while not len(node.frames_to_resize):
time.sleep(0.001)
node.frames.append(resize({'height': 400, 'width': 500}))
def resize(*a, **kw):pass # just to have an executable test
Run Code Online (Sandbox Code Playgroud)
import unittest
from unittest.mock import MagicMock
from loader import VideoLoader
class TestVideoLoader(unittest.TestCase):
def test_ensure_frame_resized(self):
fake_node = MagicMock()
fake_node.frames_to_resize = [1] # to make sure you fall through the 2nd while loop
loader = VideoLoader(fake_node)
loader.execute()
loader.is_resizer_active = False
loader.thread1.join()
fake_node.frames.append.assert_called()
if __name__ == '__main__':
unittest.main()
Run Code Online (Sandbox Code Playgroud)