【问题标题】:Running tests on Twisted code in Python3在 Python3 中对 Twisted 代码运行测试
【发布时间】:2014-08-28 10:52:24
【问题描述】:

我有一个在 Twisted 中运行的相对简单的 SSL 服务器,我想为它编写一些单元测试。在使用 Python 3 时,我不确定执行此操作的最佳方法。我发现的所有文档都描述了使用 Twisted Trial,不幸的是,对于 Py3k,它是不完整的。

我的想法是做这样的事情:

  • 加载我的代码并做所有事情,但reactor.run()
  • 发送我希望我的代码处理的数据
  • 运行reactor.doIteration()(或者reactor.iterate()更好?)
  • 检查我的服务器是否完成了应有的工作

这是处理这种情况的合法方式吗?

编辑:

answer from glyph that this may be a bad idea(但不是专门讨论测试)

编辑 2:

我想主要问题是当您尝试测试与 Twisted 交织在一起的组件时,您不确定如何将其拆开以正确测试各个组件。有没有可靠的方法来测试这个?是否应该调用.run(),然后插入一个在您完成停止反应器并测试结果的操作几秒钟后运行的事件?

【问题讨论】:

    标签: python python-3.x twisted twisted.internet


    【解决方案1】:

    您正在编写低级网络代码吗?您的应用程序是否与 BSD 套接字 API 交互?如果没有,你为什么要在测试中运行反应器?单元测试应该执行定义明确、的代码集。这应该是您的应用程序代码 - 而不是 Twisted 中 TLS 传输的实现。

    要专门解决在单元测试或其他地方调用reactor.iterate 的想法:是的,这是个坏主意。这不是 Twisted 本身的测试方式。没有理由期望,因为您编写的代码在您调用 reactor.iterate 时有效,而当您调用 reactor.run 时它会有效。 reactor.iterate 是关于事件循环应该如何与其他系统集成的错误想法的遗留物。 可能有一两种极端情况,reactor.iterate 的想法是正确和有用的,但实际上没有人在这种情况下使用 Twisted,也没有人在制作 Twisted 时会牢记它们变化。因此,这不是您希望您的应用程序出现的地方。当事情出错时,你会非常孤独。

    【讨论】:

    • 有两个主要部分...测试协议的dataReceived 中的数据处理以及根据客户端证书上的通用名称测试只有某些连接才能通过。我想尽可能地模仿真实代码中会发生的事情。我不确定如何在不实际创建套接字并使用不同客户端证书测试连接的情况下测试后者。
    • 后者听起来像一个函数,它返回 True 或 False 给定一个通用名称。实际建立连接的代码是一个单独的单元。
    • 后者部分是ssl.ContextFactory,我想对其进行测试以确保它按我预期的方式工作。在我想实际运行它并确保它正在做需要的事情之前,我可以阅读稀疏文档很多次。另外,我想把它做成一个测试用例,所以在做出改变后我可以重新测试它。
    • 确实,pyOpenSSL 的上下文对象确实不透明且难以测试。不过,您可以在不进行 I/O 的情况下测试它们。 pyOpenSSL 支持内存中的“连接”。因此,您可以证明您的上下文可用于以这种方式建立连接——无需 I/O。如果您感兴趣的话,您也许可以做出其他一些断言,例如选择了什么密码或证书。其他部分将很难做出断言,因为即使是 pyOpenSSL Connection 实例仍然非常不透明。跨度>
    • 此外,在大多数情况下,只要您可以依赖 Twisted 14.0 或更高版本,您就应该使用 twisted.internet.ssl.CertificateOptions。它会自动执行您一直想要的一堆标准 TLS 事情。
    猜你喜欢
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多