gpt4 book ai didi

python - 测试用户输入 - Python

转载 作者:行者123 更新时间:2023-11-28 21:03:29 24 4
gpt4 key购买 nike

我在测试 Python 代码的输入时遇到了问题。我尝试了几个解决方案,但我缺少一些东西,所以如果你能给我一些提示,我将不胜感激。

首先,这是我要测试的主要代码文件中的一个片段:

if __name__ == '__main__':

n = int(input())
m = int(input())

grid = []

for _ in range(n):
grid.append(list(map(str, input().rstrip().split())))

calculate(grid)

当我运行我的代码时,我输入“n”,然后是“m”,然后根据用户输入创建一个网格(每一行在一个新行..),并执行一个函数来计算一些东西网格和函数返回结果。一切都很好,但现在我需要为其创建几个测试用例(针对预期输出测试不同的输入)。

首先,我尝试了这个:(在一个单独的 .py 文件上)

from unittest import mock
from unittest import TestCase
import main_file

class DictCreateTests(TestCase):
@mock.patch('main_file.input', create=True)
def testdictCreateSimple(self, mocked_input):
mocked_input.side_effect = ['2', '2', 'R G B\nR G B'] #this is the input I need for my color grid
self.assertEqual(calculate(grid), 2)

if __name__ == '__main__':
unittest.main()

然后我研究了更多选项并尝试了这个选项,这让我最接近:

import unittest
import os

class Test1(unittest.TestCase):

def test_case1(self):
input = "2\n2\nR G B\nR G B"
expected_output = '2'
with os.popen("echo " + input + "' | python main_file.py") as o:
output = o.read()
output = output.strip() # Remove leading spaces and LFs
self.assertEqual(output, expected_output)

if __name__ == '__main__':
unittest.main()

不幸的是,即使它通过了测试,我发现当它与预期输出进行比较时,它总是接受输入的第一个字母/数字作为结果。所以,我认为这与我需要输入的多个值有关。我尝试在不同的输入 (input1 + input2+ input3) 上将它们分开,但它仍然不起作用。

如果有人能给我一些如何做的提示,我将不胜感激!提前致谢!

最佳答案

我建议重构代码,以便您可以测试函数:

def create_grid_and_calculate(n, m):
grid = []

for _ in range(n):
grid.append(list(map(str, input().rstrip().split())))

return calculate(grid)


if __name__ == '__main__':

n = int(input())
m = int(input())

create_grid_and_calculate(n, m)

然后

import unittest
import os
from main_file import create_grid_and_calculate

class Test1(unittest.TestCase):

def test_case1(self):
expected_output = '2'
self.assertEqual(create_grid_and_calculate(2, 2), expected_output)
self.assertEqual(create_grid_and_calculate(int("R G B"), int("R G B")), expected_output)

if __name__ == '__main__':
unittest.main()

您还可以用命令行传递的参数替换您的输入,用专用模块解析(例如,argparse 是标准的),以更好地控制您的输入。

import argparse

def create_grid_and_calculate(n, m):
...


def main(argv: list = None):
parser = argparse.ArgumentParser(description="My script...")
parser.add_argument(
"-m",
dest="m",
action="store",
type=int,
help="parameter m",
)
parser.add_argument(
"-n",
dest="n",
action="store",
type=int,
help="parameter n",
)
args = parser.parse_args(argv or [])

create_grid_and_calculate(args.n, args.m)

if __name__ == '__main__':
import sys
sys.exit(main(sys.argv[1:]))

因此您还可以使用不同的输入(int、strings...)测试 main 函数。

最后,pytest是构建在 unittest 之上的一个很棒的单一测试框架,也许你可以看看。


编辑:要定义网格,您不需要输入大小(n 和 m),也不需要单独输入每一行。为行选择 1 个分隔符(此处为逗号),为列选择另一个分隔符(此处为空格),您将得到:

import argparse

def main(argv: list = None):
parser = argparse.ArgumentParser(description="My script...")
parser.add_argument(
"-g",
"--grid",
dest="grid",
action="store",
type=str,
help="The grid, defined as 'x11 x12 ... x1n, x21 x22 ... x2n, ...'",
)
args = parser.parse_args(argv or [])

# first we split on comma, then on space
grid = [x.split() for x in args.grid.split(',')]
print(grid)
calculate(grid)

if __name__ == '__main__':
import sys
sys.exit(main(sys.argv[1:]))

然后像这样运行它:main_file.py -g '1 2 3, 4 5 6, 7 8 9'

[['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9']]

要获取 int 列表的列表,请使用:

grid = [[int(val) for val in row.split()] for row in args.grid.split(',')]

或者更清楚:

grid = []
for row in args.grid.split(','):
grid.append([])
for val in row.split():
grid[-1].append(int(val))

关于python - 测试用户输入 - Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56340243/

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