Модульное тестирование Python 3: Assert True, когда возвращаемые значения находятся в пределах диапазона, и Correct Count

Мне трудно писать модульные тесты для следующей функции:

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;

  • что возвращаемые значения не дублируются;

  • возвращаемые значения разделены нецелыми символами и запятыми.

Я довольно новичок в модульном тестировании в частности и программировании в целом, но, похоже, не могу создавать тесты для этой функции, которые терпят неудачу. Может ли кто-то дать руководство-с конкретными тестами-чтобы помочь мне понять, как подойти к этой проблеме?

Я посвятил себя изучению unittestмодуля Python и ценю вашу помощь.

1 ответ

  1. Просьба разъяснить следующее:

    • Все значения жестко закодированы, так где же их потом тестировать ?
      Это просто идея того, что вы хотите, и вы будете передавать range_min(1) range_max(69) и white_balls(5) в качестве параметров ?

    Если вы придерживаетесь жестко закодированных значений, первые два теста бесполезны.

    После этого для дубликатов используйте комплект (белизны) сразу, снова никакая потребность испытать его потом.

    Кроме того, кроме самой запятой, вы никогда не получите нецелой символ с этой строкой:

    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 в свою таблицу, я думаю, нет необходимости преобразовывать его в строку.