在python中使用随机变量进行单元测试

时间:2014-03-05 19:52:20

标签: python unit-testing random

我正在尝试测试我为游戏编写的这个模块。该模块应该掷骰子,并添加结果。之后他们会检查技能检查等等,所以我想确保它正常工作。

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>

5 个答案:

答案 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。