python interactive shell_如何为嵌入IPython Interactive Shell的python应用程序编写单元测试...

我有一个长时间运行的模拟,我需要在模拟的特定时间停下来,然后检索并观察一些信息,然后继续进行模拟。我最近开始使用Test Driven Design方法,不幸的是我不知道如何单元测试放入交互式shell的应用程序。

这是我想要做的事情的基本概念:

# peekaboo.py

from IPython import embed

from IPython.config.loader import Config

PAB_HEADER = 'Hello, my name is PAB. How may I help you?'

PAB_EXIT_MESSAGE = 'Goodbye, sir.'

PAB_PROMPT_IN_TEMPLATE = 'In [PAB \\#]: '

PAB_PROMPT_IN2_TEMPLATE = ' .\\D.: '

PAB_PROMPT_OUT_TEMPLATE = 'Out [PAB \\#]: '

def activate(**vars):

"""

Activate PAB 0.1 by starting an interactive shell and putting

the variables in the scope of the caller into the scope of this

method.

"""

# Add variables from caller to this scope

locals().update(vars)

cfg = None

try:

get_ipython

except NameError:

cfg = Config()

prompt_config = cfg.PromptManager

prompt_config.in_template = PAB_PROMPT_IN_TEMPLATE

prompt_config.in2_template = PAB_PROMPT_IN2_TEMPLATE

prompt_config.out_template = PAB_PROMPT_OUT_TEMPLATE

embed(config=cfg, header=PAB_HEADER, exit_msg=PAB_EXIT_MESSAGE)下面是一个peek_a_boo模块如何使用的例子:

# long_running_app.py

import peek_a_boo

import datetime

import random

start_dt = datetime.datetime(2013,1,1)

datetimes = [start_dt + datetime.timedelta(days=i) for i in range(10)]

dt_of_interest = datetime.datetime(2013, 1, 8)

def long_running_process(dts):

"""

simulate long running process

"""

some_data = {}

for dt in dts:

some_data[dt] = random.random()

if dt.date() == dt_of_interest.date():

peek_a_boo.activate(**locals())

return some_data

if __name__ == '__main__':

data = long_running_process(datetimes)

print data我的第一个倾向是使用模拟和修补嵌入方法,并验证它已被调用了正确的参数,但我想知道是否有人有其他建议?

更新:

所以我使用鼻子进行单元测试,我尝试了以下方法:

# test_peek_a_boo.py

import nose

import mock

class TestPeekABoo(object):

def setup(self):

pass

def teardown(self):

pass

@mock.patch('IPython.embed')

def test_activate(self, mock_embed):

"""

Test that the activate method calls IPython embed with the correct arguments

"""

import peek_a_boo

a = 'Hello'

b = 'World'

peek_a_boo.activate(**locals())

mock_embed.assert_called_once_with(header=peek_a_boo.PAB_HEADER, ...)但是当我运行时:

nosetests test_peek_a_boo.py

该过程挂起。如果我运行:

nosetests test_peek_a_boo.py -s

我可以看到我的流程正在进入交互式Shell。

更新2:

我能够通过在测试类的test_method中导入peek_a_boo来获得上述测试。

这测试嵌入实际上是调用,但我希望能够测试a和b使它成为激活方法的本地范围。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值