2017-05-10 159 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)