我有这个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--请帮帮我。
谢谢
发布于 2017-06-15 14:06:45
通常,如果您考虑如何在编写代码的同时测试代码,那么测试就容易得多。在这种情况下,您可以通过允许输出到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)不应该只生产Fizz。如果要测试单个值的输出,现在需要重构。例如,您可以选择这样编写代码:
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"对于这样一个简单的代码块,可能会过度使用,但是模块化在测试方面确实有帮助。
发布于 2017-06-15 14:20:25
值得注意的是,如果您希望pytest运行程序自动获取测试文件和测试函数,则必须以" test“一词开始(或结束)。您还需要重构您的函数以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 =============================================https://stackoverflow.com/questions/44569418
复制相似问题