python - 如何使用随机值验证单元测试

标签 python unit-testing random

如何使用随机值验证单元测试? 我需要保证 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 类。 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)

关于python - 如何使用随机值验证单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26091330/

相关文章:

ios - 在屏幕上的随机位置生成一个圆圈

python - 是否所有标准库 Python 接口(interface)都记录在一处?

python - 从字典列表中的字典中删除键

python - 向所有 python 异常添加额外信息

Python paramiko sudo 不起作用

mysql - 测试我使用的是 MySQL 语法吗?

unit-testing - 是否可以从测试中访问私有(private)结构字段?

java - 当类可以通过黑盒测试进行测试时,我应该避免使用 Di 吗?

c++ - 我们可以直接调用 gcc simd fast mersenne_twister_engine (mt19937_64) 吗?

c++ - (C++) 随机数相等,但程序说它们不相等