gpt4 book ai didi

python - 基于Python的cmd模块创建交互式shell的自动化测试

转载 作者:太空宇宙 更新时间:2023-11-03 15:08:27 28 4
gpt4 key购买 nike

我正在使用 Python 3 和 cmd 模块构建一个交互式 shell。我已经使用 py.test 编写了简单的单元测试来测试各个函数,例如 do_* 函数。我想创建更全面的测试,通过模拟用户的输入实际与 shell 本身交互。例如,我如何测试以下模拟 session :

bash$ console-app.py
md:> show options
Available Options:
------------------
HOST The IP address or hostname of the machine to interact with
PORT The TCP port number of the server on the HOST
md:> set HOST localhost
HOST => 'localhost'
md:> set PORT 2222
PORT => '2222'
md:>

最佳答案

您可以mock input 或传递给cmd 的输入流来注入(inject)用户输入,但我发现通过onecmd() 进行测试更简单灵活> Cmd API 方法并信任 Cmd 读取输入的方式。这样你就不用关心 Cmd 如何通过用户命令直接进行脏工作和测试:我通过控制台和套接字使用 cmd 并且我不关心流来自哪里来自。

此外,我甚至使用 onecmd() 来测试 do_*(偶尔使用 help_*)方法,并使我的测试与代码。

按照我如何使用它的一个简单示例。 create()_last_write() 是分别构建 MyCLI 实例和获取最后输出行的辅助方法。

from mymodule import MyCLI
from unittest.mock import create_autospec

class TestMyCLI(unittest.TestCase):
def setUp(self):
self.mock_stdin = create_autospec(sys.stdin)
self.mock_stdout = create_autospec(sys.stdout)

def create(self, server=None):
return MyCLI(stdin=self.mock_stdin, stdout=self.mock_stdout)

def _last_write(self, nr=None):
""":return: last `n` output lines"""
if nr is None:
return self.mock_stdout.write.call_args[0][0]
return "".join(map(lambda c: c[0][0], self.mock_stdout.write.call_args_list[-nr:]))

def test_active(self):
"""Tesing `active` command"""
cli = self.create()
self.assertFalse(cli.onecmd("active"))
self.assertTrue(self.mock_stdout.flush.called)
self.assertEqual("Autogain active=False\n", self._last_write())
self.mock_stdout.reset_mock()
self.assertFalse(cli.onecmd("active TRue"))
self.assertTrue(self.mock_stdout.flush.called)
self.assertEqual("Autogain active=True\n", self._last_write())
self.assertFalse(cli.onecmd("active 0"))
self.assertTrue(self.mock_stdout.flush.called)
self.assertEqual("Autogain active=False\n", self._last_write())

def test_exit(self):
"""exit command"""
cli = self.create()
self.assertTrue(cli.onecmd("exit"))
self.assertEqual("Goodbay\n", self._last_write())

请注意,如果您的 cli 应该终止,onecmd() 返回 True,否则返回 False

关于python - 基于Python的cmd模块创建交互式shell的自动化测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30056986/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com