尝试使用线性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)
答案 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.
如果您要编写正确的测试,则很可能会遇到unittest
或pytest
。它们具有广泛的功能,其中一个允许您从接口的任何输入注入预期的行为。这几乎就是“嘲笑”。
你可以在这里使用不同的补丁来显示不同的功能。您可以测试边界,返回顺序值等。它为您提供了更大的灵活性,可以测试程序中各种可能的漏洞。