如何使用随机值验证单元测试 [英] How to validate a unit test with random values

查看:82
本文介绍了如何使用随机值验证单元测试的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆