2016-09-29 45 views
0

我有一个艰难的时间用于以下功能编写单元测试:的Python 3单元测试:断言真当返回的值范围之内,并计数正确

def white_nums(): 
    """Generate 5 'white ball' numbers between 1 and 69--inclusive, no duplicates""" 
    whites = random.sample(range(1, 69 + 1),5) # Python range stops at y - 1 in range(x, y) 
    return(', '.join(map(str, whites)))  # strip non-integer characters, separate numbers with commas 

我的想法是,我需要测试至少如下:

  • 返回的值在定义的范围内;

  • 那个返回值的计数== 5;

  • 返回值不重复;

  • 返回的值是非整数字符的条带,并以逗号分隔。

我是相当新的单元测试专门和编程一般,但似乎无法创建此功能失败的测试。有人可以提供指导 - 具体测试 - 帮助我理解如何解决这个问题?

我已经致力于学习Python的unittest模块,并感谢您的协助。

回答

0

请澄清以下几点:

  • 所有的值是硬编码那么,是需要测试他们以后? 这只是你想要的一个想法,然后你会通过range_min(1)range_max(69)和white_balls(5)作为参数?

如果你坚持使用硬编码值,前两个测试是无用的。

然后对于重复使用set(whites)直接,再次不需要测试它之后。

而且除了逗号本身,你将永远不会得到这一行非整数字符:

whites = random.sample(range(1, 69 + 1),5) 

但为什么返回数字的字符串,而不是只是一个列表?

总之,尽管单元测试是一个非常好的练习,但如果保留硬编码值,似乎没有必要。

这仅仅是一个命题为例:

import unittest 
import random 

def white_nums(range_min, range_max, balls): 
    return set(random.sample(range(range_min, range_max + 1), balls)) 


class TestWhiteNums(unittest.TestCase): 

    def setUp(self): 
     self.range_min = 1 
     self.range_max = 69 
     self.balls = 5 
     self.white_balls = white_nums(self.range_min, self.range_max, self.balls) 

    def test_count(self): 
     self.assertEqual(len(self.white_balls), self.balls) 

    def test_range(self): 
     for white_ball in self.white_balls: 
      self.assertGreaterEqual(white_ball, self.range_min) 
      self.assertLessEqual(white_ball, self.range_max) 

    def test_duplicates(self): 
     self.assertEqual(self.white_balls, set(self.white_balls)) 

if __name__ == '__main__': 
    unittest.main() 

当然,您的设置()函数可以更复杂,从其他地方取值。在你真实的代码中,你可以直接将white_balls列表添加到你的表中,我认为不需要将它转换为字符串。

+0

那么,更大的图片是返回的值将被插入到表中。说实话,我不清楚什么是单元测试的公平游戏,什么不是。这里是[程序的其余部分](https://gist.github.com/anonymous/53badd31e4991cc6ba278c9b1d32bee8) – marshki

+0

你不需要返回一个字符串就可以将它添加到表中。 –

+0

的目的是:'return(','。join(map(str,whites)))''是去除'random.'产生的括号'[]'。这是为了审美目的而完成的,而不是出于必要。 – marshki

相关问题