[英]How to approach this unit-testing issue based on an external class?
我有一个class Node
( add_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.