Python 如何使用Twisted试用版对高速公路应用程序进行单元测试?
假设您只使用高速公路连接(而不是原始WebSocket) 如果没有网络,我们如何测试我们的RPC方法和事件 由于它是扭曲的,我认为最合适的工具应该是扭曲试验 但如果不编写大量样板代码并重新使用Autobahn的内部实现(甚至我也不确定我是否能够以这种方式完成),我就不知道该如何编写这些测试Python 如何使用Twisted试用版对高速公路应用程序进行单元测试?,python,autobahnws,Python,Autobahnws,假设您只使用高速公路连接(而不是原始WebSocket) 如果没有网络,我们如何测试我们的RPC方法和事件 由于它是扭曲的,我认为最合适的工具应该是扭曲试验 但如果不编写大量样板代码并重新使用Autobahn的内部实现(甚至我也不确定我是否能够以这种方式完成),我就不知道该如何编写这些测试 你会怎么做?这是试图回答我自己的问题 问题 然后,为了对RPC方法和事件进行单元测试,我们需要假设Autobahn经过了良好的测试,我们不必对其进行测试,解决方案变得简单: 解决方案 全部模拟。 上下文 在我
你会怎么做?这是试图回答我自己的问题 问题 然后,为了对RPC方法和事件进行单元测试,我们需要假设Autobahn经过了良好的测试,我们不必对其进行测试,解决方案变得简单: 解决方案 全部模拟。 上下文 在我的应用程序中,我有两种类型的组件(读取ApplicationSession):StandardComponent和DatabaseComponent(从StandardComponent继承) 单元测试中最大的问题是我们有很多依赖项,比如数据库连接、Redis连接等等 例子 我在测试中所做的是通过子类化
unittest.TestCase
来修补所有这些对象:
class APITestCase(unittest.TestCase):
def _patchObject(self, module_name, **kwargs):
patcher = patch(module_name, **kwargs)
mock = patcher.start()
self.patches.append(patcher)
return mock
def setUp(self):
logging.disable(logging.CRITICAL)
self.patches = []
self.session = self._patchObject('components.ApplicationAPI')
self.database = self._patchObject('txpostgres.txpostgres.Connection')
def tearDown(self):
for patcher in self.patches:
patcher.stop()
我在测试用例中注入一个模拟会话和一个模拟数据库
然后,测试变得非常简单
每当调用需要调用数据库或从数据库获取结果的RPC方法时,我都会对其进行修补:
self.mocked\u auth\u user.return\u value=(1,“abc”,“something”,“admin”)
在我的测试方法中:
def test_authenticate_success(self):
self.mocked_auth_user.return_value = (1, "abc", "paris", "admin")
def _doTest(auth_result):
attempted_auth_result = {
"secret": "abc",
"role": "admin",
"authid": "1",
"salt": "paris",
"iterations": 1000,
"keylen": 32
}
self.assertEqual(auth_result, attempted_auth_result)
self.mocked_auth_user.assert_called_with(self.api.database, "raito")
return self.api.authenticate("test", "raito", {}).addCallback(_doTest)
您可以进行一些更高级、更有趣的测试,以查看您的方法是否是防故障的:
def test_authenticate_authid_not_found(self):
def _raiseException(db, user):
return defer.fail(Exception("User {} not found!".format(user)))
self.mocked_auth_user.side_effect = _raiseException
return self.failUnlessFailure(self.api.authenticate("test", "raito", {}), AuthenticationError)
事件也是如此,您只需调用它们并测试它们是否发布事件(self.session.publish.assert\u调用了(…)
)
它变魔术了
无论如何,它解决了单元测试问题,但是集成还没有完成。我正在研究它,但是这个问题可能会通过使用一些虚拟化技术(Docker)或类似的东西来解决