首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python Fizz Buzz,验收单元测试

Python Fizz Buzz,验收单元测试
EN

Code Review用户
提问于 2014-01-10 05:49:09
回答 1查看 1.7K关注 0票数 4

好吧,也许是疯狂的过度杀戮和有点愚蠢,但为什么不呢?下面是一个Python FizzBuzz验收测试:

代码语言:javascript
复制
import unittest
from fizzbuzzmodule import fizzbuzz 

class FizzBuzzAcceptanceTestCase(unittest.TestCase):
    '''
    Test that fizzbuzz(int) returns int
    unless multiple of 3 (then returns 'fizz')
           multiple of 5 (then returns 'buzz')
           multiple of both (then returns 'fizzbuzz')
    '''
    def test_business_as_usual(self):
        '''
        test that an integer >= 0 not evenly divisible
        by three or five returns the same
        '''
        self.assertEqual(fizzbuzz(1), 1)
        self.assertEqual(fizzbuzz(2), 2)
        self.assertEqual(fizzbuzz(4), 4)
        self.assertEqual(fizzbuzz(7), 7)
        self.assertEqual(fizzbuzz(998), 998)
    def test_fizz(self):
        '''evenly divisible by 3 returns fizz'''
        self.assertEqual(fizzbuzz(3), 'fizz')
        self.assertEqual(fizzbuzz(6), 'fizz')
        self.assertEqual(fizzbuzz(111), 'fizz')
        self.assertEqual(fizzbuzz(999), 'fizz')
    def test_buzz(self):
        '''evenly divisible by 5 returns buzz'''
        self.assertEqual(fizzbuzz(5), 'buzz')
        self.assertEqual(fizzbuzz(10), 'buzz')
        self.assertEqual(fizzbuzz(20), 'buzz')
        self.assertEqual(fizzbuzz(500), 'buzz')
    def test_fizz_buzz(self):
        '''evenly divisible by 3 and 5 returns fizzbuzz'''
        self.assertEqual(fizzbuzz(15), 'fizzbuzz')
        self.assertEqual(fizzbuzz(30), 'fizzbuzz')
        self.assertEqual(fizzbuzz(45), 'fizzbuzz')
        self.assertEqual(fizzbuzz(600), 'fizzbuzz')

    # def test_zero(self):
        # self.assertEqual(fizzbuzz(0), 'fizzbuzz') #??????

def main():
    unittest.main()

if __name__ == '__main__':
    main()

输入一个通过这些测试的小实现:

代码语言:javascript
复制
def fizzbuzz(number):
    '''
    if number divisible by 3 return 'fizz';
    5, 'buzz'; both, fizzbuzz
    else return number
    '''
    if not number % 3:
        if not number % 5:
            return 'fizzbuzz'
        else:
            return 'fizz'
    if not number % 5:
        return 'buzz'
    return number

def main():
    for i in range(1, 101):
        print fizzbuzz(i)

当我做测试时:

代码语言:javascript
复制
>>> unittest.main()
....
----------------------------------------------------------------------
Ran 4 tests in 0.002s

OK

我的问题是,你会如何补充上面的内容?你觉得在别人的代码上运行这个测试有用吗?它是否清楚地定义了一个干净的API?是否应该返回一致的类型而不是字符串或ints?

我应该换个办法吗?我没有考虑过任何边缘或角落的情况吗?

EN

回答 1

Code Review用户

回答已采纳

发布于 2014-01-10 09:09:59

对于如此简单的事情,使用doctest模块可能不太过分。在docstring中写入预期的调用和输出,然后运行python -m doctest -v fizzbuzzmodule.py。没有必要写一个单独的类。

我编写了一个测试,以确保函数在调用时也能使用递减参数。

至于函数本身,我认为如果编写number % 3 == 0而不是not number % 3,代码读起来会更好。我也会使用条件表达式,但这只是个人喜好的问题。

代码语言:javascript
复制
def fizzbuzz(number):
    '''
    if number divisible by 3 return 'fizz';
    5, 'buzz'; both, fizzbuzz
    else return number

    >>> fizzbuzz(1)
    1
    >>> fizzbuzz(2)
    2
    >>> fizzbuzz(3)
    'fizz'
    >>> fizzbuzz(4)
    4
    >>> fizzbuzz(5)
    'buzz'
    >>> fizzbuzz(15)
    'fizzbuzz'
    >>> [fizzbuzz(i) for i in range(31, 20, -1)]
    [31, 'fizzbuzz', 29, 28, 'fizz', 26, 'buzz', 'fizz', 23, 22, 'fizz']
    '''
    if number % 3 == 0:
        return 'fizzbuzz' if (number % 5 == 0) else 'fizz'
    if number % 5 == 0:
        return 'buzz'
    return number
票数 4
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/38973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档