我正在尝试测试我为游戏编写的这个模块。该模块应该掷骰子,并添加结果。之后他们会检查技能检查等等,所以我想确保它正常工作。
import random
def roll3d6():
return random.choice(1, 6) + random.choice(1, 6) + random.choice(1, 6)
def rolld100():
return random.choice(1, 100)
这是我的测试
import Roll
from unittest import TestCase
class test_Roll(TestCase):
def test_simple(self):
roll = Roll.roll3d6(), Roll.rolld100()
self.assertEqual(roll)
这是我的测试结果,我做错了什么?
PS C:\Users\Ray\Desktop\GitHub\pickett\pickett> python -m unittest discover
.E.
======================================================================
ERROR: test_simple (test.test_Roll.test_Roll)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Users\Ray\Desktop\GitHub\pickett\pickett\test\test_Roll.py", line 7, in test_simple
roll = Roll.roll3d6(), Roll.rolld100()
File "C:\Users\Ray\Desktop\GitHub\pickett\pickett\Roll.py", line 4, in roll3d6
return random.choice(1, 6) + random.choice(1, 6) + random.choice(1, 6)
TypeError: choice() takes exactly 2 arguments (3 given)
----------------------------------------------------------------------
Ran 3 tests in 0.001s
FAILED (errors=1)
PS C:\Users\Ray\Desktop\GitHub\pickett\pickett>
编辑:所以我改为randint,现在我得到了这个类型的错误,我最初担心的是,不知道如何解决这个问题。
PS C:\Users\Ray\Desktop\GitHub\pickett\pickett> python -m unittest discover
.E.
======================================================================
ERROR: test_simple (test.test_Roll.test_Roll)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Users\Ray\Desktop\GitHub\pickett\pickett\test\test_Roll.py", line 8, in test_simple
self.assertEqual(roll)
TypeError: assertEqual() takes at least 3 arguments (2 given)
----------------------------------------------------------------------
Ran 3 tests in 0.000s
FAILED (errors=1)
PS C:\Users\Ray\Desktop\GitHub\pickett\pickett>
答案 0 :(得分:1)
您使用的是random.choice()
错误;它希望选择序列。您可以使用random.choice(range(1, 7))
,尽管效率不高。
要获得1到6(含)之间的随机数,请使用`random.randint():
random.randint(1, 6)
测试random
模块的功能是a)超出unittest的范围,b)相当困难,因为模块总是产生随机结果。
您可以根据您对如何调用它们的理解,对random
模块提供的函数进行存根(模拟)并测试这些存根是否被正确调用。请参阅What are good unit tests to cover the use case of rolling a die?。
答案 1 :(得分:0)
恭喜,您的测试有效,他们发现了一个错误!
错误在于您使用2个参数调用random.choice
,而只需要一个序列(通常是列表)。
您可能打算使用random.randint(1, 6)
代替。
答案 2 :(得分:0)
正如错误所说,choice()
只有两个参数((3 given)
意味着第三个参数被隐含地传递给选择(可能是self
)。
实际上,choice()
只需要一个参数,它必须是一个序列(list,tuple,...)。
您想要的实际上是random.randint
而不是random.choice
。
答案 3 :(得分:0)
使用random.randint(1, 6)
获取1到6之间的随机数。
答案 4 :(得分:0)
random.choice()
期望传入SET,因此以下内容将起作用:
random.choice([1,2,3,4,5,6]);
对于100种选择,这将是令人望而却步的,所以我建议使用以下代码:
random.randint(a, b)
返回随机整数N,使得< = N< = b。