Unit testing Python3单元测试:当返回值在范围内时断言True,并正确计数

Unit testing Python3单元测试:当返回值在范围内时断言True,并正确计数,unit-testing,python-3.x,python-unittest,Unit Testing,Python 3.x,Python Unittest,我很难为以下函数编写单元测试: 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))

我很难为以下函数编写单元测试:

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
模块,并感谢您的帮助

请澄清以下几点:

  • 所有的值都是硬编码的,那么以后需要在哪里进行测试呢? 这仅仅是你想要的一个想法,然后你将传递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()

当然,setUp()函数可能更复杂,从其他地方获取值。在实际代码中,您可以直接将white_balls列表添加到表中,我认为无需将其转换为字符串。

好的,更大的情况是返回的值将插入到表中。说实话,我不清楚什么是单元测试的公平游戏,什么不是。您不需要返回字符串就可以将其添加到表中。
return(','.join(map(str,whites))
的目的是删除由
random.
生成的括号
[]
。这样做是为了美观,不是出于必要。如果是这样,我建议您在生成表时在white_nums函数之外进行预处理,因此您将有一个适当的关注点分离。逻辑部分和表示部分。您可以为后面的函数创建一个函数,其中包含所有其他函数返回的数据的所有必要转换,这个函数将在最后返回或打印您的表。谢谢,这是一个很好的建议。请问:在这种情况下,表的单元测试是什么样子的?