如何使用随机值验证单元测试?
我需要保证gen_age返回15到99之间的整数,但是这段代码不正确.
我需要保证gen_age返回15到99之间的整数,但是这段代码不正确.
import random
import unittest
def gen_age():
# generate integer between 15 and 99
return random.randint(15,99)
class AgeTest(unittest.TestCase):
def setUp(self):
self.a = gen_age()
def test_choice(self):
element = random.choice(self.a)
self.assertTrue(element in self.a)
def test_sample(self):
for element in random.sample(self.a,98):
self.assertTrue(element in self.a)
if __name__ == '__main__':
unittest.main()
解决方法
测试类似行为的最佳方法是将种子设置为Random对象.
随机包提供Random类.随机实例具有与随机包相同的方法; random(),randint(),sample(),…此外,Random接受种子.向Random添加种子使其输出确定性.例如,
from random import Random random = Random(666) assert random.randint(0,1000) == 467 # will never break
因此,您希望将您的功能测试为
from random import Random
import unittest
random = Random()
def gen_age():
# generate integer between 15 and 99
return random.randint(15,99)
class AgeTest(unittest.TestCase):
def setUp(self):
global random
random = Random(666)
def test_gen_age(self):
self.assertEqual(gen_age(),53)
if __name__ == '__main__':
unittest.main()
请注意,如果您的测试不在同一个文件中,则需要使用unittest.mock.patch随机修补.这样的事情应该有效
from random import Random
from package.file import gen_age
import unittest
class AgeTest(unittest.TestCase):
def setUp(self):
self.random = Random(666)
@patch('package.file.random')
def test_gen_age(self,random):
random.randint._mock_side_effect = self.random.randint
self.assertEqual(gen_age(),53)