我在使用单元测试模块的单元测试方面很陌生,我需要测试一个使用线程模块的类。 我真的没有找到任何关于使用线程来组合类的最佳方法的解决方案。 我开始测试线程是否被调用(即活着),但后来我看到没有方法可以杀死一个线程。 我需要一周来确保线程中的代码执行它应该做的事情。 我是否需要使用该线程,或者我应该只测试该功能吗?
感谢您的帮助!
这是我的代码(有趣的部分):
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))
答案 0 :(得分: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
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()