Прежде всего, если вы публикуете код, пожалуйста, публикуйте только полный и исполняемый код.В вашем случае self.num
определяется дважды, один раз как переменная и один раз как функция.Кроме того, вокруг функции нет тела класса.
Важно опубликовать полный код, потому что окружающая структура может иметь значение для ответа.В вашем случае я просто должен предположить, как выглядит содержащий класс, поэтому ответ может быть неприменим к вашей проблеме.
Вот как я бы написал модульный тест для вашей конкретной задачи:
from random import randint
import unittest
class RandomGen:
def __init__(self):
self.num = None
def compute_num(self):
random = randint(1000, 8876)
random = list(map(int, str(random)))
while random[0] == random[1] or random[0] == random[2] or \
random[0] == random[3] or random[1] == random[2] or \
random[1] == random[3] or random[2] == random[3]:
random = randint(1000, 8876)
random = list(map(int, str(random)))
num = ""
self.num = int(num.join(map(str,random)))
class RandomGenTest(unittest.TestCase):
# It's hard to test random number generators deterministically.
# Therefore, just repeat it a bunch of times to increase the chance for
# incorrect results to show up. In this case, 10000 times.
def test_range(self):
gen = RandomGen()
for i in range(10000):
gen.compute_num()
self.assertGreaterEqual(gen.num, 1000)
self.assertLessEqual(gen.num, 8876)
def test_duplicates(self):
gen = RandomGen()
for i in range(10000):
gen.compute_num()
numbers = list(map(int, str(gen.num)))
self.assertEqual(len(numbers), len(set(numbers)))
if __name__ == '__main__':
unittest.main()