Модульное тестирование невозвратной функции, которая генерирует числа случайным образом - PullRequest
0 голосов
/ 26 мая 2019

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

Что я хочу проверить

  1. Проверка, генерируются ли числа между 1000 и 8876.
  2. Проверка позиций разных чисел с 4-значными значениями не равны друг другу.например, 1234, это число разрешено, потому что оно не имеет повторений.но 1123 не допускается, потому что он имеет число, повторенное в разных позициях.Вот что делает цикл while.

Я пытался прочитать похожие вопросы, например, ссылка 1 ссылка 2 , но я не смог подключиться к этомусценарий

def 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))) 

Ответы [ 2 ]

0 голосов
/ 26 мая 2019

Прежде всего, если вы публикуете код, пожалуйста, публикуйте только полный и исполняемый код.В вашем случае 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()
0 голосов
/ 26 мая 2019

разделите это на две части, одну часть, которая генерирует случайное число, и одну часть, которая проверяет, что число удовлетворяет вашим правилам.

что-то вроде:

number = generateNumber(1000, 8876) // this is where you do the random generation
verifyNumber(number) // this is another method where you check the rules
//do whatever else after this.

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

вы не можете проверить случайность и нет смысла проверять методы библиотеки. Проверьте свои правила, устранив то, что вы не можете контролировать.

...