2017-05-10 80 views
1

如何編寫測試以測試打印我們給出的範圍的默認行爲(的方法)?以下是我的嘗試。粘貼來自我的實現文件和測試用例文件的代碼。Python中的測試驅動開發

`class FizzBuzzService: 
def print_number(self, num): 
    for i in range(num): 
     print(i, end=' ') 

import unittest 
from app.logic import FizzBuzzService 


class FizzBuzzServiceTestCases(unittest.TestCase): 
    def setUp(self): 
    """ 
    Create an instance of fizz_buzz_service 
    """ 
    self.fizzbuzz = FizzBuzzService() 

    def test_it_prints_a_number(self): 
    """ 
    Test for the default behavior of printing the range that we give 
    fizz_buzz_service 
    """ 
    number_range = range(10) 
    self.assertEqual(self.fizzbuzz.print_number(10), print(*number_range)) 

回答

0

您需要在您的測試做採集標準輸出 -

import sys 
import cStringIO 

def test_it_prints_a_number(self): 
    inital_stdout = sys.stdout 
    sys.stdout = cStringIO() 

    self.fizzbuzz.print_number(10) 
    value = sys.stdout.getvalue() 
    self.assertEqual(value, str(range(10))) 

正如你可以看到它的非常的混亂,因此我強烈建議反對。基於字符串內容編寫的測試,特別是標準輸出是非常脆弱的。除了TDD的全部要點是編寫設計良好的易於測試的隔離代碼。如果你的代碼很難測試,那麼肯定會發現你的設計存在問題。

如何將您的代碼分成兩部分,一部分生成數字並需要測試,另一部分則打印出來。現在

def get_numbers(self, num): 
    return range(num) 

def print_number(self, num): 
    print(get_numbers) 

# Now you can easily test get_numbers method. 

,如果你真的想測試打印功能,那麼,更好的辦法是使用mocking

0

對我來說,至少TDD是關於如何找到一個好的設計,就像測試一樣。正如你所看到的,測試諸如輸出之類的東西很難。

這樣的打印被稱爲副作用 - 簡單地說,它做的不是僅僅基於方法的輸入參數。我的解決方案是讓print_number減少副作用,然後像那樣測試它。如果你需要打印它,你可以編寫另一個更高的功能,print_number的輸出,但不包含除此之外的有意義的邏輯,這並不需要測試。這裏有一個例子,你的代碼改變了沒有副作用(這是幾種可能的選擇之一)

class FizzBuzzService: 
def print_number(self, num): 
    for i in range(num): 
     yield i 

import unittest 


class FizzBuzzServiceTestCases(unittest.TestCase): 
    def setUp(self): 
    """ 
    Create an instance of fizz_buzz_service 
    """ 
    self.fizzbuzz = FizzBuzzService() 

def test_it_prints_a_number(self): 
    """ 
    Test for the default behavior of printing the range that we give 
    fizz_buzz_service 
    """ 
    number_range = range(10) 
    output = [] 
    for x in self.fizzbuzz.print_number(10): 
     output.append(x) 
    self.assertEqual(range(10), output)