首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >接收和显示用户输入的文档测试函数- Python (撕裂我的头发)

接收和显示用户输入的文档测试函数- Python (撕裂我的头发)
EN

Stack Overflow用户
提问于 2010-05-01 09:49:35
回答 5查看 3.2K关注 0票数 8

我目前正在使用Python (3.1)编写一个小应用程序,就像一个好孩子一样,我正在进行doctesting。然而,我遇到了一种我似乎无法对其进行doctest的方法。它包含一个input(),正因为如此,我不能完全确定在doctest的“期望”部分中放置什么。

用来说明我的问题的示例代码如下:

代码语言:javascript
复制
"""
>>> 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)

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

我不知道我可以把什么放在doctest的Expecting部分,以便能够测试一个接收并显示用户输入的方法。所以我的问题(最后)是,这个函数是可doctestable的吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-05-01 11:42:13

我知道你想要一个doctest的答案,但是我建议这种类型的函数可能不是doctest的一个好的候选者。我更多地使用doctest来编写文档,而不是测试,这样的doctest不会成为好的文档IMHO。

最简单的方法可能如下所示:

代码语言:javascript
复制
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()

它可能不是精确地测试您提出的函数,但您得到了想法。

票数 6
EN

Stack Overflow用户

发布于 2010-05-01 09:53:35

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

代码语言:javascript
复制
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的调用可能会以某种方式失败。您最好的选择是传入某种性质的存根方法;例如

代码语言:javascript
复制
def fake_input(str):
    print(str)
    return 3

所以在您的文档测试中,您实际上测试了getFiveNums(fake_input)

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

票数 6
EN

Stack Overflow用户

发布于 2010-10-27 11:54:13

我找到了一条不同的路。

代码语言:javascript
复制
"""
>>> 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)  

将上述代码保存在名为foo.py的文件中。现在创建一个名为input.txt的文件。

它所需要的就是。

代码语言:javascript
复制
1
1
1
1
1

五个一。每行一个。

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

python $ foo.py < input.txt

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

注意:终端中的函数调用应该是get_five_nums().在您的文档测试中,它需要是get_five_nums(testing=True).

尽管doctest似乎不打算以这种方式使用,但它仍然是一个方便的技巧。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2748564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档