使用线程时单元测试Python中的time.sleep()

时间:2015-08-03 09:39:26

标签: python multithreading unit-testing

我在Python中学习线程,思维单元测试符合我的需求。

使用此http://www.tutorialspoint.com/python/python_multithreading.htm作为我的起源点。但是,当我在我的函数中使用time.sleep()时,测试似乎从该代码块返回。

import unittest
import thread
import time


class Test(unittest.TestCase):

    def test_threads(self):
        thread.start_new_thread(self.print_time,  ("Thread 1", 1))

    def print_time(self, threadName, delay):
        count = 0
        while count < 5:
            time.sleep(delay)
            count += 1
            print "%s: %s" % (threadName, time.ctime(time.time()))

if __name__ == "__main__":
    unittest.main()

使用此代码不输出任何内容。 摆脱time.sleep(延迟)输出:

Thread 1: Mon Aug 03 11:36:56 2015
Thread 1: Mon Aug 03 11:36:56 2015
Thread 1: Mon Aug 03 11:36:56 2015
Thread 1: Mon Aug 03 11:36:56 2015
Thread 1: Mon Aug 03 11:36:56 2015

当我在Python中使用单元测试时,如何使用time.sleep()?

2 个答案:

答案 0 :(得分:2)

您看到的行为是因为您的脚本在线程有机会打印其输出之前已经结束。根据{{​​3}},在'警告'下:

  

当主线程退出时,系统定义其他线程是否存活

所以很可能你的线程在第一次睡眠时被杀死了()。即使线程存活,我怀疑你是否会在同一个文档中看到输出:

  

当主线程退出[..]时,标准I / O文件不会被刷新

在脚本完成之前,没有time.sleep(delay)显然print已准备就绪。

解决这个问题的一种天真的方法是让你的测试方法sleep()表示子线程完成所需的时间,所以用

替换你的测试方法
def test_threads(self):
    Thread(target = self.print_time, args = ("Thread 1", 1)).start()
    time.sleep(6)

通常情况下,您会使用Threading模块进行此类工作。当您使用它以非守护进程模式(默认)启动线程时,调用线程仅在它启动的所有线程完成后停止。

答案 1 :(得分:1)

嗯。我和你一样。

您可以尝试使用threading.Thread()吗?

<强>代码:

import unittest
from threading import Thread
import time


class Test(unittest.TestCase):

    def test_threads(self):
        Thread(target = self.print_time, args = ("Thread 1", 1)).start()

    def print_time(self, threadName, delay):
        count = 0
        while count < 5:
            time.sleep(delay)
            count += 1
            print "%s: %s" % (threadName, time.ctime(time.time()))

if __name__ == "__main__":
    unittest.main()

<强>输出:

----------------------------------------------------------------------
Ran 1 test in 0.001s

OK
Thread 1: Mon Aug 03 13:07:46 2015
Thread 1: Mon Aug 03 13:07:47 2015
Thread 1: Mon Aug 03 13:07:48 2015
Thread 1: Mon Aug 03 13:07:49 2015
Thread 1: Mon Aug 03 13:07:50 2015

尽管如此,请注意测试在线程完成之前完成。