繁体   English   中英

如何基于外部类解决此单元测试问题?

[英]How to approach this unit-testing issue based on an external class?

我有一个class Nodeadd_node.py ),其中创建了连接到websocket的节点。 现在,我想编写单元测试来检查连接是否成功,并检查服务器的响应。

因此,我创建了一个node_tests.py文件,其内容如下:

import unittest
import json
import re
from add_node import Node

class TestNodes(unittest.TestCase):

    def test_node_creation(self):
        self.node = Node(a='1', b='2', c=True)
        self.response = json.loads(self.node.connect())
        self.assertIn('ok', self.response['r'])

    def test_node_c(self):
        self.assertTrue(self.response['c'])

if __name__ == '__main__':
    unittest.main()

第一种方法有效,但是第二种方法失败,因为没有属性“响应”。 那么我该如何解决这个问题呢?

另外,可以按照我的方式去做吗? 导入该类并在同一Test类中编写多个测试?

单元测试的重点是验证单个隔离单元的功能。 究竟什么是单​​位可以争论。 有人会说这是在单个类上的单个公共方法。 我认为大多数人都同意这不是一个非常有用的定义。 我喜欢将它们视为用例。 您的测试应该做一个用例,然后对那个用例的结果进行一个断言。 这意味着有时可以让类进行协作,有时最好隔离一个类并对其依赖项使用测试双精度。

随着时间的流逝,知道何时隔离是一件容易的事。 我认为要考虑的最重要的一点是,您编写的每个测试都应

  • 完全定义运行它的上下文(不取决于全局状态或先前运行的测试)

  • 要快一些,几毫秒就能到达顶部(这意味着您不会触摸文件系统,Web服务器或某些数据库等外部资源)

  • 不要测试其他测试涵盖的其他内容。

这第三点可能是最难平衡的。 显然,如果多个测试在相同的用例上做出不同的断言,它们将运行相同的代码。 不过,您应该保持较小的测试。 假设我们要测试电子商务应用程序中订单的取消过程。 在这种情况下,我们可能不想在取消订单之前导入并设置所有用于创建,验证等的类。 在这种情况下,最好手动创建订单对象,或者使用测试倍数。

在您的情况下,如果您真正想做的是测试真实的连接和真实服务器给出的响应,则您不需要单元测试,而需要集成测试。

但是,如果您真正想要的是测试客户端类的业务逻辑,则可能应该创建一个伪造的套接字/服务器,您可以在其中定义响应以及连接是否成功。 这样,您就可以根据与远程服务器的通信来测试客户端的行为是否正确,而不必实际依赖测试套件中的远程服务器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM