2017-05-10 10 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の全般的なポイントに加えて、容易にテスト可能なうまく設計された孤立したコードを書くことがTDDのポイントです。コードをテストするのが難しい場合は、設計に問題があることを示す確かなショットです。

コードを2つの部分に分割すると、数字を生成してテストする必要があり、もう1つはプリントするだけです。あなたが本当に印刷機能をテストする場合

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の出力より上位の別の関数を書くことができますが、それ以外の意味のある論理は含まれていません。ここでは、副作用がないようにコードを変更した例を示します(複数の可能性のある選択肢の1つです)。

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) 
関連する問題