【问题标题】:Pytest Fizzbuzz codePytest Fizzbuzz 代码
【发布时间】:2017-06-15 13:56:13
【问题描述】:

我有这个 fizzbuzz 代码,但作为一个 pytest 初学者,我正在努力弄清楚如何测试它:

def fizzbuzz(nn): 
    for num in range(1,nn+1):
        if num % 3 == 0 and num % 5 == 0:
            print "FizzBuzz"
        elif num % 3 == 0:
            print "Fizz"
        elif num % 5 == 0:
            print "Buzz"
        else:
            print  num

我想测试 fizzbuzz(3) =='Fizz' 和 fizzbuzz(7)== 7 请帮帮我。

谢谢

【问题讨论】:

  • assert fizzbuzz(3) == 'Fizz'.....?
  • 你可以为此用 Python 写 unittest
  • 你读过 pytest docs.pytest.org/en/latest 的文档吗?
  • @depperm 在函数为print-ing 时会起作用吗?
  • @depperm 那行不通。事实上,这就是我已经拥有的

标签: python pytest


【解决方案1】:

一般来说,如果您在编写代码时考虑如何测试代码,测试会容易得多。在这种情况下,您可以通过允许输出到 stdout 以外的其他位置来简化测试。

从 cStringIO 导入 StringIO 导入系统

def fizzbuzz(nn, out=sys.stdout): 
    for num in range(1,nn+1):
        if num % 3 == 0 and num % 5 == 0:
            out.write("FizzBuzz\n")
        elif num % 3 == 0:
            out.write("Fizz\n")
        elif num % 5 == 0:
            out.write("Buzz\n")
        else:
            out.write("{}\n".format(num))

def test_three():
    out = StringIO()
    fizzbuzz(3, out)
    assert out.getvalue() == "1\n2\nFizz\n"

def test_seven():
    out = StringIO()
    fizzbuzz(7, out)
    assert out.getvalue() == "1\n2\nFizz\n4\nBuzz\nFizz\n7\n"

fizzbuzz(3) 不应只产生嘶嘶声。如果要测试单个值的输出,现在需要重构。例如,您可能会选择这样编写代码:

import sys

def fizzbuzz_num(num, out=sys.stdout): 
    if num % 3 == 0 and num % 5 == 0:
        return "FizzBuzz"
    elif num % 3 == 0:
        return "Fizz"
    elif num % 5 == 0:
        return "Buzz"
    else:
        return str(num)

def fizzbuzz(nn, out=sys.stdout): 
    for num in range(1,nn+1):
        out.write(fizzbuzz_num(num) + "\n")

def test_three():
    assert fizzbuzz_num(3) == "Fizz"

def test_seven():
    assert fizzbuzz_num(7) == "7"

对于这么简单的一段代码来说可能有点矫枉过正,但模块化确实有助于测试。

【讨论】:

  • 谢谢,这正是我正在努力解决的问题。我感谢您的帮助。再次感谢
【解决方案2】:

值得注意的是,如果您希望pytest 运行器自动获取它,您的测试文件和测试函数必须以“测试”一词开头(或结束,我相信)。您还需要将您的函数重构为return 答案,而不是打印它。如果你真的想打印这些项目,你可以打电话给print fizzbuzz(3),而不是打电话给fizzbuzz(3)。但是为了测试,你会想要return这个值。您不必花时间测试 python 的 print 函数:它工作得很好。

假设你已经正确安装了 pytest,你可以像这样从命令行调用它:

python -m pytest test_fizz_buzz.py

带有如下所示的 test_fizz_buzz.py 文件:

def test_fizz_buzz():
    assert fizzbuzz(3) == "Fizz"

def test_fizz_buzz():
    assert fizzbuzz(7) == 7

你应该看到像这样的输出(一些东西):

 python -m pytest test_fizz_buzz.py
=============================================== test session starts ===============================================
platform linux2 -- Python 2.7.12, pytest-2.9.2, py-1.4.31, pluggy-0.3.1
rootdir: /home/messersmithm, inifile:
collected 2 items

test_fizz_buzz.py ..

============================================ 2 passed in 0.01 seconds =============================================

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 2022-08-02
    • 2016-11-05
    • 1970-01-01
    • 2019-06-02
    相关资源
    最近更新 更多