【问题标题】:python unittest run server & client and pass raw_inputpython unittest 运行服务器和客户端并通过 raw_input
【发布时间】:2013-08-04 11:10:09
【问题描述】:

我有一个简单的python socket game,它有服务器和客户端脚本。我已经使用 unittest 模块提供了单元测试(测试抽象游戏逻辑),现在我想提供功能测试(测试真正的套接字游戏运行时)。

从 python 代码中,我想先运行服务器,然后再运行客户端。这些使用raw_input (py2.7) 函数,因此我需要将一些信息传递给这些脚本(每个游戏动作都使用raw_input 从控制台读取)。

如何在 python/unittest 中做到这一点?我的意思是 - 我如何运行外部脚本并将控制台输入传递给它们 - 从 python 代码?

【问题讨论】:

  • raw_input移出核心功能。它应该只存在于与用户交互的代码中。
  • @Blender 它不在核心功能中。核心是game.py,它是纯逻辑。服务器和客户端(两个玩家)使用 raw_input。我的问题是 - 如何从功能测试级别传递一些输入?
  • 你可能会一起破解一些东西,但这不是一个好方法。 Game.move 使用 raw_input
  • 嗯,不,因为这个文件 (github.com/tkoomzaaskz/noughts-and-crosses/blob/master/nac/…) 包含逻辑并且已经过单元测试。我想测试客户端-服务器通信。它们都是使用 raw_input 的控制台应用程序。我已经在这里解决了这个问题(使用鼻子测试、子进程和管道来提供 raw_input):github.com/tkoomzaaskz/noughts-and-crosses/blob/master/test/….
  • 就像我说的,这是一个 hack。如果您的应用程序结构正确,则无需在单元测试中调用脚本。

标签: python client-server functional-testing


【解决方案1】:

你只需要模拟 raw_input。使用 mock library 或只是自己模拟它 - 可以更简单,例如:

def ri_mock(fle_name='nac_input.txt'):
    with open(fle_name) as fp:
        for ln in fp:
            yield ln

gen = ri_mock()
raw_input = gen.next

但是,由于您要在单元测试中使用它,我宁愿使用字符串而不是从外部文件中读取数据。

【讨论】:

  • 事实证明,我想要的解决方案是将服务器/客户端作为一个鼻子测试中的线程运行,并将文件管道设置为服务器/客户端线程。
  • 老实说,我不知道您打算同时测试双方,尤其是在您的问题中您写了“我想先运行服务器,然后运行客户端。 ”。不管怎样,我很高兴你解决了你的问题。
  • 抱歉不准确 - 我的意思是服务器打开套接字,客户端绑定到这个套接字;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-19
相关资源
最近更新 更多