比方说,我有这样一组代码,它是一个长时间运行的执行线程,用于轮询事件并引发其他事件(在我的情况下,使用XMLRPC调用)。它需要被重构为干净的对象,所以它可以进行单元测试,但同时我想在某些集成测试中捕获它的一些当前行为,将它当作黑盒子对待。例如:在没有修改的线程中测试Python代码?
# long-lived code
import xmlrpclib
s = xmlrpclib.ServerProxy('http://XXX:yyyy')
def do_stuff():
while True:
...
if s.xyz():
s.do_thing(...)
_
# test code
import threading, time
# stub out xmlrpclib
def run_do_stuff():
other_code.do_stuff()
def setUp():
t = threading.Thread(target=run_do_stuff)
t.setDaemon(True)
def tearDown():
# somehow kill t
t.join()
def test1():
t.start()
time.sleep(5)
assert some_XMLRPC_side_effects
最后一个大的问题是,在测试的代码被设计为永远运行,直到按Ctrl-C,我看不出有什么办法强迫它会引发异常或以其他方式杀死线程,因此我可以在不改变正在测试的代码的情况下从头启动它。一旦我调用被测函数,我就失去了从线程轮询任何标志的能力。
我知道这是真的没有如何设计测试工作,集成测试是有限的价值等,等等,但我希望通过轻柔工作向朋友展示测试和良好设计的价值而不是完全重新设计他的软件。
所有有效的点,但如果我正在寻找关于良好开发实践的一般建议,我不会问这个关于物流的问题。 – 2011-04-01 18:28:39