gpt4 book ai didi

python - 如何使用 Twisted Trial 对 Autobahn 应用程序进行单元测试?

转载 作者:太空狗 更新时间:2023-10-29 18:09:23 25 4
gpt4 key购买 nike

假设您只使用 Autobahn 连接(不是原始的 WebSocket)。

我们如何在没有网络的情况下测试我们的 RPC 方法和事件?
由于它是 Twisted,我认为最合适的工具是 Twisted Trial。

但我无法弄清楚我应该如何编写这些测试,而不编写大量样板代码并重新使用 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()

我在我的测试用例中注入(inject)了一个模拟 session 和一个模拟数据库。

然后,测试变得非常非常简单。

每当我调用需要调用数据库或从数据库获取结果的 RPC 方法时,我都会对其进行修补:self.mocked_auth_user.return_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_called_with(...))

它变得神奇!

无论如何,它解决了单元测试问题,但是集成还没有。我正在研究它,但这个问题可能会使用一些虚拟化技术 (Docker) 或类似的东西来解决。

关于python - 如何使用 Twisted Trial 对 Autobahn 应用程序进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29199906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com