2017-06-15 73 views
0

我有這個fizzbuzz代碼,但作爲一個初學者pytest我努力工作,如何對其進行測試:Pytest Fizzbuzz代碼

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)==「嘶嘶聲」和fizzbuzz(7)== 7 請幫幫我。

感謝

+1

'assert fizzbuzz(3)=='Fizz'' .....? – depperm

+0

你可以在Python中爲此編寫[unittest](https://docs.python.org/2/library/unittest.html) – pramod

+0

你閱讀過pytest的文檔https://docs.pytest.org/en/latest /你有嘗試過什麼嗎? – depperm

回答

0

一般來說,測試是一個容易得多,如果你考慮如何測試你的代碼,而寫它。在這種情況下,通過允許輸出到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" 

爲代碼,這樣一個簡單的塊可能是矯枉過正,但是當涉及到測試的模塊化確實有幫助。

+0

謝謝,這正是我所苦苦掙扎的。我感謝您的幫助。再次感謝 –

0

值得注意的是,如果您想讓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 =============================================