嘲弄通信

2024-06-12 16:50:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用python构建一个应用程序,它使用对执行硬件通信的库的包装

我想创建一些测试单元,而且我对单元测试还很陌生,所以我想模拟通信,但我真的不知道怎么做

快速示例:

这是使用comm lib的应用程序代码

def changeValue(id, val):
    current_value = comm.getval(id)
    if (current_value != val):
        comm.send(id, val)

我想在不进行通信的情况下进行测试,即更换通信获取值返回一些模拟值,并发送通信发送一个模仿的通信类。你知道吗

有人能给点提示吗?你知道吗


问题是comm是类中的一个对象

假设这个班是这样的:

class myClass:
    comm = Comm()
    ....
    def __init__():
        comm = comm.start()

    def changeValue(id, val):
        ....

    ....

Tags: id应用程序示例硬件valuelibdefval
2条回答

您可以使用^{}框架来处理此类作业。首先你要用 comm = Comm()MyClass中,这意味着在MyClass的模块中有类似于from comm_module import Comm的东西。在这些情况下,您需要修补Comm模块中的MyClass引用以激活修补程序。你知道吗

因此,可以举一个例子来说明如何在没有任何连接的情况下测试代码:

@patch("my_class.Comm", autospec=True)
def test_base(self, mock_comm_factory):
    mock_comm = mock_comm_factory.return_value
    MyClass()
    mock_comm.start.assert_called_with()

@patch("my_class.Comm", autospec=True)
def test_changeValue(self, mock_comm_factory):
    mock_comm = mock_comm_factory.return_value
    mock_comm.getval.return_value = 13
    MyClass().changeValue(33, 23)
    mock_comm.getval.assert_called_with(33)
    mock_comm.send.assert_called_with(33, 23)
    mock_comm.reset_mock()
    mock_comm.getval.return_value = 23
    MyClass().changeValue(33, 23)
    mock_comm.getval.assert_called_with(33)
    self.assertFalse(mock_comm.send.called)

现在我可以开始解释我的答案的所有细节,比如为什么要使用^{}how to apply patch to all methods,但这意味着要重写很多mock文档和一些答案。所以我希望这足够作为起点。你知道吗

诀窍是不要使用像comm这样的全局对象。如果可以的话,让调用方将comm注入到类或方法中。然后在测试时通过模拟的comm,然后在生产时通过真实的。你知道吗

因此,要么像这样对类中的字段进行comm引用(并通过构造函数或setter方法注入它)

class myClass:

  ....
  def __init__(myComm):
    comm = myComm;
    comm = comm.start()

  def changeValue(id, val):
    current_value = comm.getval(id)
    if (current_value != val):
      comm.send(id, val)

....

或者在使用它的方法中将其作为参数,如下所示

def changeValue(id, val, myComm):
current_value = myComm.getval(id)
if (current_value != val):
    myComm.send(id, val)

使用globalanything会让嘲弄变得非常痛苦,当你需要嘲弄某样东西时,试着使用Dependency Injection。你知道吗

这是另一个关于DI的好帖子。它在java中,但在python中应该是相同的http://googletesting.blogspot.ca/2008/07/how-to-think-about-new-operator-with.html

相关问题 更多 >