接收和显示用户输入Python的Doctesting函数

2024-10-01 17:26:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在用Python(3.1)编写一个小应用程序,就像一个好孩子一样,我一边做博士研究。然而,我遇到了一种我似乎无法修改的方法。它包含一个input(),因此,我不完全确定在doctest的“expecting”部分应该放什么。在

下面是说明我的问题的示例代码:

"""
>>> getFiveNums()
Howdy. Please enter five numbers, hit <enter> after each one
Please type in a number:
Please type in a number:
Please type in a number:
Please type in a number:
Please type in a number:
"""

import doctest

numbers = list()

# stores 5 user-entered numbers (strings, for now) in a list
def getFiveNums():
    print("Howdy. Please enter five numbers, hit <enter> after each one")
    for i in range(5):
        newNum = input("Please type in a number:")
        numbers.append(newNum)
    print("Here are your numbers: ", numbers)

if __name__ == "__main__":
    doctest.testmod(verbose=True)

运行doctests时,程序在打印“Expecting”部分后立即停止执行,等待我依次输入五个数字(没有提示),然后继续。如下图所示:

doctest results

我不知道,如果有的话,我可以把什么放在doctest的Expecting部分,以便测试一个接收并显示用户输入的方法。所以我的问题是,这个函数是可修改的吗?


Tags: 方法innumberinputtypedoctesteachenter
3条回答

我找到了另一种方法。在

"""
>>> get_five_nums(testing=True)
Howdy. Please enter five numbers, hit <enter> after each one.
Please type in a number: 1
Please type in a number: 1
Please type in a number: 1
Please type in a number: 1
Please type in a number: 1
Here is a list of the numbers you entered:  [1, 1, 1, 1, 1]
>>>
"""

import doctest

numbers = []

def get_five_nums(testing=False):
    """Stores 5 user-entered numbers (strings, for now) in a list."""

    print("Howdy. Please enter five numbers, hit <enter> after each one.")
    for i in range(5):
        new_num = int(input("Please type in a number: "))
        if testing:
            print(new_num)
        numbers.append(new_num)
    print("Here is a list of the numbers you entered: ", numbers)


if __name__ == "__main__":
    doctest.testmod(verbose=True)  

将上述代码保存在名为食品。现在制作一个名为输入文件。在

它所需要的就是。在

^{pr2}$

五个一。每行一个。在

要测试您的程序,请在终端或命令提示符下执行以下操作(我使用的是mac):

$python食品<;输入文件

对于任何程序上的任何类型的用户输入,这很容易更改。现在,您可以复制终端会话的输出并将其用作doctest。在

注意:终端中的函数调用将是get\u five\u nums()。在你的doctest中,它需要得到五个nums(testing=True)。在

尽管这似乎还不是一个方便的方法。在

使其可测试的最简单方法是parameter injection

def getFiveNums(input_func=input):
    print("Howdy. Please enter five numbers, hit <enter> after each one")
    for i in range(5):
        newNum = input_func("Please type in a number:")
        numbers.append(newNum)
    print("Here are your numbers: ", numbers)

实际上,不能期望您这样对输入/输出进行单元测试——您不能担心对input的调用可能会失败。最好的选择是传入某种性质的存根方法;类似于

^{pr2}$

所以在您的doctest中,您实际上测试getFiveNums(fake_input)。在

此外,通过打破对input现在的直接依赖,如果您以后要将此代码移植到没有使用命令行的其他代码,您可以直接插入新代码来检索输入(无论是GUI应用程序中的对话框,还是基于web的应用程序中的Javascript弹出窗口,等等)。在

我知道你在问一个doctest的答案,但是我可以建议这种类型的函数可能不适合doctest。我用doctest来做文档而不是做测试,而doctest在我看来并不是一个好的文档。在

unitest方法可能看起来像:

import unittest

# stores 5 user-entered numbers (strings, for now) in a list
def getFiveNums():
    numbers = []
    print "Howdy. Please enter five numbers, hit <enter> after each one"
    for i in range(5):
        newNum = input("Please type in a number:")
        numbers.append(newNum)
    return numbers

def mock_input(dummy_prompt):
    return 1

class TestGetFiveNums(unittest.TestCase):
    def setUp(self):
        self.saved_input = __builtins__.input
        __builtins__.input = mock_input

    def tearDown(self):
        __builtins__.input = self.saved_input

    def testGetFiveNums(self):
        printed_lines = getFiveNums()
        self.assertEquals(printed_lines, [1, 1, 1, 1, 1])

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

这可能不是对你提出的功能进行精确的测试,但你得到了这个想法。在

相关问题 更多 >

    热门问题