一般來說,測試是一個容易得多,如果你考慮如何測試你的代碼,而寫它。在這種情況下,通過允許輸出到stdout
以外的其他位置,可以使測試更加輕鬆。
從cStringIO進口StringIO的 進口SYS
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"
爲代碼,這樣一個簡單的塊可能是矯枉過正,但是當涉及到測試的模塊化確實有幫助。
'assert fizzbuzz(3)=='Fizz'' .....? – depperm
你可以在Python中爲此編寫[unittest](https://docs.python.org/2/library/unittest.html) – pramod
你閱讀過pytest的文檔https://docs.pytest.org/en/latest /你有嘗試過什麼嗎? – depperm