Introduction

在这个系列中我们也已经写了很多twisted 代码了,但目前为止我们忽略了一个很重要的事情—测试.你可能也一直在想我们怎样用一个同步的测试框架unitest来测试我们的异步的程序.简短的回答是不能,我们已经发现,同步的程序和异步的程序不能混合在一起.最起码不会很好的结合在一起.

幸运的是,twisted 已经包含了他自己的异步测试测试框架–trial.我们也可以用它来测试同步的框架.

我们假设你已经对unittest 的测试原理和测试框架比较熟悉了,在unittest 中,我们通过定义一个继承TestCase的类创建测试,并且每个测试方法前面以test为前缀.框架会帮你发现测试,运行测试,然后报告出测试结果.

The Example

你会在tests/test_poetry.py发现一些例子代码.为了保证我们的例子可以自包含,我们已经把全部的有必要的代码拷进test 模块.正常的来说,你只需要导入你想测试的模块就可以了.

这个例子测试了client 和server,通过使用这个client 去从test server 上获取到每一首诗.为了提供一个可供测试的server,我们在我们的测试用例中实现了setUp 方法:

class PoetryTestCase(TestCase):

def setUp(self):
        factory = PoetryServerFactory(TEST_POEM)
        from twisted.internet import reactor
        self.port = reactor.listenTCP(0, factory, interface="127.0.0.1")
        self.portnum = self.port.getHost().port

这个setUp 方法创建了一个poetry server,并随机监听一个端口.我们保存了这个端口号,让我们的测试用例使用.当我们的测试用例运行完的时候我们用tearDown清理我们的test server:

def tearDown(self):
    port, self.port = self.port, None
    return port.stopListening()

下面我们看一下我们真实的测试代码,test_client,我们使用get_poetry 从test server 上获取诗的内容并验证是不是我们想要的诗:

def test_client(self):
    """The correct poem is returned by get_poetry."""
    d = get_poetry('127.0.0.1', self.portnum)

def got_poem(poem):
        self.assertEquals(poem, TEST_POEM)

d.addCallback(got_poem)

return d

注意一下我们的测试函数返回了一个deferred.在trial中,每一个测试方法被当作一个callback.它意味着reactor 在运行着我们可以执行异步的操作.我们需要让这个测试框架知道我们的测试是异步的,我们通过返回一个deferred来告诉测试框架我们的函数是异步的.

trial 框架会等待所有的deferred 被触发之后才会调用tearDown 方法,如果deferred 失败了测试也会失败.假如我们的deferred 花了太多的时间去触发,我们的测试也会失败,默认的是两分钟.如果我们的测试运行结束了,我们知道我们的deferred 也触发了,我们的callback 也触发了,我们就可以运行assertEquals 了.

我们的第二个测试是,test_failure,可以验证get_poetry 失败的方式,假如我们不能连接上server 的话:

def test_failure(self):
    """The correct failure is returned by get_poetry when
    connecting to a port with no server."""
    d = get_poetry('127.0.0.1', -1)
    return self.assertFailure(d, ConnectionRefusedError)

在这里我们试图去连接一个不正确的端口,并用trial 提供的assertFailure方法.这个方法有点像assertRaises ,但是是用来测试异步的代码的.它会返回一个成功的deferred 假如测试用的deferred 出现我们要的错误.

你可以运行这个测试脚本:

trial tests/test_poetry.py

你会看到每个测试用例的输出,如果测试通过的话会输出OK.

Discussion

因为trial 和unittest 提供的一些api非常相像.用它写单元测试是很简单的.如果你想测试异步的代码你只需要返回一个deferred,trial 会负责其他的事情.你也可以从setUp 和 tearDonw 中返回一个deferred,如果他们也需要异步的话.

任何的日志信息都会被保存到一个叫做_trial_temp的目录下,如果没有的话 trial 会自动帮我们建立.除了被打印到屏幕上的一些错误信息除外,这些日志信息对我们分析出错的原因非常重要.

图片三十三展示了一个假想的测试过程:


图片三十三

如果你曾经用过类似的测试框架,这个会是一个非常熟悉的模型,除了这个测试相关的方法都返回deferred.

trial 框架也是一个怎样在一个程序中用交错任务让这个程序变成异步的程序的很好的说明,为了让一个测试变成异步的,你需要:

不能是阻塞的
    返回一个deferred

Summary

这个就是我们要讲 单元测试.如果你想要看更多的怎样测试twisted 代码的例子,你可以看一下twisted 的源代码.twisted 代码中包含了大量的单元测试.因为这些测试都是twisted 的专家经过仔细地检查之后才被加入代码库的,他们的代码就是一个非常好的单元测试的例子.

在第十六部分我们会使用twisted 的一个实用的功能让我们的poetry server 变成一个守护进程.

twisted系列教程十五–测试twisted代码相关推荐

  1. twisted系列教程十九–cancel deferred

    Introduction twisted 是一个正在发展的项目,twisted 的开发者们会添加一些新的特色或者扩展旧的.随着twisted 10.1.0 的发布,开发者们增加了一个新的功能–取消,这 ...

  2. twisted系列教程十–可以变化的诗

    Client 5.0 现在我们将要想我们的client中加入一些变形逻辑.但是首先我不得不说:我不知道怎样写一个Byronification 引擎,它超出我的能力范围了.做为替代,我会实现一个相对简单 ...

  3. twisted系列教程十六–twisted守护进程

    Introduction 到目前为止我们写的server 还运行在一个终端里面,通过print 语句向外输出内容.开发的时候这样做是很有好处的,但是当你部署一个产品的时候这样就不好了.一个生产环境中的 ...

  4. twisted系列教程十四— pre-fireed deferred

    Introduction 在这一部分我们将要学习deferred 类的另外的一个方面.为了促进讨论,我们要为我们的poetry service增加一个server.假设我们有大量的内部的client ...

  5. twisted系列教程十二–为server 增加一个service

    One More Server 在第九部分和第十部分我们介绍了关于诗歌的变形引擎的想法,最后我们实现了cummingsifier,我们还让它抛出随机的异常来模拟错误.但是假如这个变形的引擎在另外一台服 ...

  6. twisted系列教程十八–异步操作的并行运行

    Introduction 在上一部分我们学习了一种新的用生成器来组织一系列异步callbacks 的方法.加上deferred,我们已经有两种组织异步操作的方法了. 有时候,我们想让一组异步操作并行的 ...

  7. twisted系列教程六–继续重构twisted poetry client

    Poetry for Everyone 我们已经在我们的client取得了很大的进步,我们的2.0版本已经试用了Transports,Protocols 和Protocols Factories.但是 ...

  8. 用python写诗歌网站要注意什么_Python Twisted系列教程5:由Twisted支持的诗歌客户端...

    你可以从这里从头开始阅读这个系列 抽象地构建客户端 在第四部分中,我们构建了第一个使用Twisted的客户端.它确实能很好地工作,但仍有提高的空间. 首先是,这个客户端竟然有创建网络端口并接收端口处的 ...

  9. [转]轻松掌握Ajax.net系列教程十五:使用AutoCompleteExtender

    本章介绍AutoCompleteExtender的使用方法.用过Google的朋友都会发现,当我们在搜索框输入关键字的时候,Google会自动列出相关关键字提示.那么用Ajax.net也能做到么?答案 ...

最新文章

  1. 代理模式和装饰者模式
  2. Please use HDF reader for matlab v7.3 files
  3. Pl/sql 如何将oracle的表数据导出成excel文件?
  4. Python绘制三维散点图
  5. 124angular1实现无限表单(仅供自己看)
  6. Linux开机自动启动ORACLE设置
  7. FPI(Fixed-point Iteration)不动点迭代法——迭代求方程的方法
  8. 第四十二章 SQL函数 DATEADD
  9. Linux-chmod
  10. Python读取excel文件数据并画柱状图
  11. 密码学工具箱ToolsFx发布日志
  12. 日常Bug:0xC0000135
  13. 如何对 Excel 中的数据使用 SQL 查询
  14. Kbps、KBps是什么意思?网络下载速度单位换算
  15. python除数为0报错_python——异常
  16. “80后”全国模范检察官白静:传递青年干警正能量
  17. 第2章 Spring Boot实践,开发社区登录模块(上)
  18. cocos STG游戏(笔记三)
  19. 2019年秋招面试总结(一)(中兴、大疆)
  20. uniapp 登入功能 vuex使用 通俗易懂

热门文章

  1. 为啥我的Python这么慢 (一)
  2. 微信重大更新,mac版可刷朋友圈!可以看,可以评论! 支持M1
  3. 省选+NOI 第三部分 树上问题
  4. android textview 背景图片,Android—TextView 背景颜色与背景图片设置
  5. c纳秒级计时器_纳秒级性能计时器
  6. linux 共享库目录,Linux共享库
  7. python读awx文件_ansible awx用法
  8. 信息安全工程师笔记-综合知识冲刺(四)
  9. canvas笔记-canvas适应浏览器(填充整个页面)
  10. Web笔记-session及cookie