如何测试随机使用的功能?

时间:2018-04-17 19:28:09

标签: python unit-testing

尝试使用线性seqarch数组架构为字典编码popitem函数。你能举个例子,我该如何用unittests测试这个功能?感谢

def popitem(self):
    number = self.keys_list[random.randint(0, len(self.keys_list))] 
    i = 0
    while i < len(self.values_list):
        if i == number:
            needed_key = self.keys_list[i]
            needed_value = self.values_list[i]
            self.keys_list.remove(needed_key)
            self.values_list.remove(needed_value)
            return (needed_key, needed_value)

2 个答案:

答案 0 :(得分:2)

将你的功能分成两部分:

def popitem(self):
    number = self.keys_list[random.randint(0, len(self.keys_list))]
    return self._popitem(number)

def _popitem(self, number):
    i = 0
    ...

现在使用硬编码值测试_popitem。这也将使您的测试更容易阅读和控制。

顺便说一句,如果我理解你在功能中想要做什么,那么我将如何实现它:

def _popitem(self, number):
    i = self.keys_list.index(number)
    return (
        self.keys_list.pop(i),
        self.values_list.pop(i),
    )

答案 1 :(得分:2)

如果要测试随机数生成器的行为,请修复种子。对于随机,您可以使用random.seed(SEED),或者如果您使用的是numpy,则可以使用np.random.seed(SEED)

但是,我将提供另一种非常重要的概念,称为模拟

您可以使用模拟将所有函数调用重定向到random.randint()

from unittest import mock
import random
mocked_random_choice = lambda : 1000
with mock.patch('random.randint', mocked_random_choice):
    popitem(...) # any call to random.int will now output 1000.

如果您要编写正确的测试,则很可能会遇到unittestpytest。它们具有广泛的功能,其中一个允许您从接口的任何输入注入预期的行为。这几乎就是“嘲笑”。

你可以在这里使用不同的补丁来显示不同的功能。您可以测试边界,返回顺序值等。它为您提供了更大的灵活性,可以测试程序中各种可能的漏洞。