如何使用随机值验证单元测试 [英] How to validate a unit test with random values
问题描述
如何使用随机值验证单元测试?
我需要保证gen_age
返回15到99之间的整数,但是此代码不正确.
How to validate a unit test with random values?
I need guarantee that gen_age
returns an integer between 15 and 99, but this code is not correct.
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对象.
The best way to test a similar behaviors is to set a seed to the Random object.
random包提供Random类. Random实例的方法与random包的方法相同; random(),randint(),sample()等.此外,Random接受 seed .向随机"添加种子会使其输出确定性.例如,
The random package provide a Random class. Instances of Random have the same methods than the random package; random(), randint(), sample(), ... In addition, Random accepts a seed. Adding a seed to Random makes it outputs deterministic. For example,
from random import Random
random = Random(666)
assert random.randint(0, 1000) == 467 # will never break
因此,您想要测试您的功能
Consequently, you would like to tests your function as
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
patch 随机进行.像这样的东西应该起作用
Note that if your test is not in the same file, you will need to patch random using unittest.mock.patch
. Something like that should work
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)
这篇关于如何使用随机值验证单元测试的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!