Python单元测试多线程

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)