Python单元测试多线程

时间:2013-12-18 00:40:35

标签: 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))

1 个答案:

答案 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()