gpt4 book ai didi

python - Python 中的单元测试按键和终端输出?

转载 作者:太空宇宙 更新时间:2023-11-04 00:54:58 24 4
gpt4 key购买 nike

如果您在 Google 或 SO 上搜索“unit test stdin stdout python”,您会发现很多问题,每个问题都以一种或另一种方式得到回答

Do you really need to unit test Python's builtin input / sys.stdin methods?

我的回答是是的,我强调这样做,因为我实际上是在实现我自己的 input + 穷人的libreadline/libcurses ,我需要使用标准输入和终端的内容进行测试。

我碰巧使用的是 Unix 派生的操作系统,所以我有管道 |和 shell 重定向 < ,所以我可以编写一个小的 shell 脚本来与一些 Python 帮助程序代码一起执行此操作,并测试终端的操作(ANSI 转义序列、光标移动、确切打印的内容等)我可以从已知的 /dev/tty/whatever 中读取。 ,但我不想这样做的主要原因有两个:

  1. 测试代码应该像它正在测试的代码一样跨平台(并且不要那么脆弱!)

  2. 我很喜欢unittest ,谢谢,我不想诉诸 shell 脚本和 unix hackery(尽管我喜欢 unix hackery)只是为了测试我的模块。

必须有更好的方法来测试类似 curses 的东西,而不是当你使用 curses但是当你开发一个curses .


既然有人要求,下面是我要测试的一些示例:( full code on github )

def _Getch():
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch

class xyctl:
def _terminal_size():
import fcntl, struct
h, w, hp, wp = struct.unpack('HHHH',
fcntl.ioctl(0, termios.TIOCGWINSZ,
struct.pack('HHHH', 0, 0, 0, 0)))
return w, h, w * h

def _matrix_calc(adj_x, adj_y):
cur_x, cur_y = xyctl.getter()
new_x, new_y = (
(cur_x + adj_x),
(cur_y + adj_y)
)

if (new_x * new_y) < (xyctl._terminal_size()[2]):
return new_x, new_y
else:
_writer(CHAR_BEL)

def getter():
_writer(CHAR_ESC + "[6n")
pos = until("R", raw=True)
_writer(CHAR_CRR + CHAR_SPC * (len(pos) + 1) + CHAR_CRR)
pos = pos[2:].split(";")
pos[0], pos[1] = int(pos[1]), int(pos[0])
return pos

def setter(new_x, new_y):
_writer(CHAR_ESC + "[{};{}H".format(new_x, new_y))

def adjust(adj_x, adj_y):
new_x, new_y = xyctl._matrix_calc(adj_x, adj_y)
xyctl.setter(new_x, new_y)

最佳答案

您可以使用 subprocess 模块从 python 中调用您的脚本。然后,您可以通过 communicate

发送测试输入
import subprocess as sp
import sys

interpreter_path = sys.executable
p = sp.Popen([interpreter_path, script_to_test])
(stdout, stderr) = p.communicate(input = testinput)

stdoutstderr 然后可以测试正确的值

关于python - Python 中的单元测试按键和终端输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35537736/

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