【问题标题】:Test a program that uses tty stdin and stdout测试一个使用 tty 标准输入和标准输出的程序
【发布时间】:2013-11-26 09:36:32
【问题描述】:

我有一个由两部分组成的软件:一个是在第一台电脑上运行的 python,另一个是在第二台电脑上运行的 cpp。 它们通过串行端口 (tty) 进行通信。

我想在我的电脑上测试 python 端,用正确的数据输入它,看看它是否按预期运行。

我开始使用子进程,但问题来了:我应该提供哪个标准输入和标准输出?

cStringIO 不起作用,因为没有fileno()

PIPE 也不起作用,因为 select.select() 表示即使没有实际发送,也有需要阅读的内容

你有什么提示吗?有没有我可以使用的假 tty 模块?

【问题讨论】:

  • 也许你可以mock他们并定义return_value
  • "select.select() 说即使没有实际发送,也有一些东西要阅读" -- 在这种情况下os.read 会返回什么?你试过pexpectpty 模块吗?
  • 关于不工作的 PIPE:你彻底检查了吗?低级管道与 Linux 上的 select 配合得很好(旁注:这种组合用于所谓的自管道技巧以可靠地处理信号)。并且选择也返回 EOF。

标签: c++ python stdout stdin tty


【解决方案1】:

理想情况下,您应该对其进行模拟并仅测试其行为,而不要过多地依赖终端 IO。您可以为此使用mock.patch。假设你要测试t_read

@mock.patch.object(stdin, 'fileno')
@mock.patch.object(stdin, 'read')
def test_your_behavior(self, mock_read, mock_fileno):
    # this should make select.select return what you expect it to return
    mock_fileno.return_value = 'your expected value' 

    # rest of the test goes here...

如果您可以发布至少部分您尝试测试的代码,我也许可以给您一个更好的例子。

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-05
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
相关资源
最近更新 更多