文档章节

(转) Twisted : 第十五部分 测试诗歌

水果糖
 水果糖
发布于 2016/01/27 13:23
字数 1472
阅读 6
收藏 0
点赞 1
评论 0

简介

在我们探索Twisted的过程中写了很多代码,但目前我们却忽略了一些重要的东西 —— 测试.你也是会怀疑怎样用像 unittest 这样Python自带的同步框架测试异步代码.答案是你不能.正如我们已经发现的,同步代码和异步代码是不能混合的,至少不容易.

幸运地是,Twisted包含自己的测试框架,叫 trial,它支持测试异步代码(当然你也可以用它测试同步代码).

我们假设你已经熟悉了 unittest 的机理和相似的测试框架,它允许你通过定义类创建测试.这个类通常是一个父类(通常叫"TestCase")的子类,类中的方法以"test"开头并被视作一个测试.框架负责发现所有的测试,一个接一个地运行它们,并伴有可选项 setUp 和 tearDown 步骤,之后报告结果.


例子

你可以在 tests/test_poetry.py 中找到一些关于测试的例子.为了确保我们所有的例子是自包含的(以便你不用担心PYTHONPAYH设置),我们将所有需要的代码拷贝到测试模块中.当然正常情况,你只需导入需要测试的模块.

这个例子既测试诗歌客户端又测试服务器,通过使用客户端从测试服务器抓取一首诗. 为了提供一个可供测试的诗歌服务器, 我们在测试案例中实现 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 方法用一首测试诗建立诗歌服务器,然后监听一个随机开放端口.我们保存了端口号,以便实际测试需要时可以利用.当然测试结束时我们会用 tearDown 清除测试服务器:

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

这把我们带到了第一个测试, test_client, 用 get_poetry 从测试服务器获取诗歌并且验证这就是我们所期望的诗歌:

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 中,每个测试方法都以回调的方式运行.这意味着 reactor 正在运行并且我们可以以测试的一部分执行异步操作.我们仅仅需要让框架知道测试是异步的,这可以通过采用常规的Twisted方式 —— 返回deferred 来实现.

trial 框架在调用 tearDown 方法之前将等待直到 deferred 激发,并且当 deferred 失败时将使测试失败(如,最后一个回调/错误回调对失败).如果我们的 deferred 反应太慢(默认2分钟)它同样会使测试失败.这意味着如果测试完成,我们知道 deferred激发了,因此我们的回调激发了并且运行了 assertEquals 测试方法.

我们的第二个测试, test_failure, 证实 get_poetry 以适当的方式失败了,如果不能连接到服务器:

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脚本自己运行这些测试,如下:

trial tests/test_poetry.py

你将看到显示每个测试案例的输出,OK表示测试通过了.


    讨论

由于当谈到基本API时,trial与unittest十分相似,所以开始写测试十分容易.如果你的测试使用异步代码,仅仅返回 deferred 就可以了,trial将负责其余的事情.你也可以从 setUp 或 tearDown 方法返回一个 deferred,如果它们也需要异步.

任何来自测试的日志消息将被收集到当前文件夹下的一个文件中,即"_trial_temp", trial会自动创建它. 除了打印到屏幕的错误,日志是调试失败测试的实用入口.

图33显示了一个正在进行中的假想测试:

_static/p15_test-1.png

图33: 进行中的trial测试

如果你之前使用过类似的框架,这是一个熟悉的模型,除了所有测试相关的方法可能返回 deferreds.

trial框架是一个关于如何"异步运作"的很好例子,包括级联在整个程序中的变化.为了使一个测试(或任何函数,方法)是异步的,它必须:

  1. 非阻塞并且,通常

  2. 返回一个 deferred.

但这意味着无论什么调用,那个函数必须愿意接收一个 deferred,并且非阻塞(如此又好像返回了一个 deferred).如此这般一层又一层.这样就呼唤出现trial一样的框架,可以处理返回 deferreds 的异步测试.


总结

这就是关于单元测试的内容.如果你想了解更多关于如何为Twisted代码写单元测试的例子,你只需要看看Twisted代码本身.Twisted框架自带了一套非常庞大的单元测试,而且每个新的发布又会加入很多.由于这些测试在被接受入代码库之前,经过严格的代码评论以及Twisted专家们的仔细审查,故而它们是告诉你如何以正确方式测试Twisted代码的极好例子.

在 :doc:`p16` 中,我们将使用Twisted工具将诗歌服务器转化为一个真正的守护进程.


本文转载自:https://github.com/luocheng/twisted-intro-cn

共有 人打赏支持
水果糖
粉丝 15
博文 156
码字总数 51701
作品 0
深圳
程序员
(转) Twisted :第十一部分 改进诗歌下载服务器

诗歌下载服务器 到目前为止,我们已经学习了大量关于诗歌下载客户端的Twisted的知识,接下来,我们使用Twisted重新实现我们的服务器端。利益于Twisted的抽象机制,接下来你会发现我们前面已经...

水果糖
2016/01/27
7
0
(转) Twisted :第十九部分 改变之前的想法

简介 Twisted是一个正在进展的项目,它的开发者会定期添加新的特性并且扩展旧的特性. 随着Twisted 10.1.0发布,开发者向 类添加了一个新的特性—— ——这正是我们今天要研究的. 异步编程将请求...

水果糖
2016/01/27
33
0
(转) Twisted :第六部分 抽象地利用Twisted

打造可以复用的诗歌下载客户端 我们在实现客户端上已经花了大量的工作。最新版本的(2.0)客户端使用了Transports,Protocols和Protocol Factories,即整个Twisted的网络框架。但仍有大的改进...

水果糖
2016/01/27
5
0
(转) Twisted :第十六部分 Twisted 进程守护

简介 目前我们所写的服务器仅仅运行在终端窗口,结果通过 语句输出到屏幕.这对于开发来说已经足够,但对于产品级的部署还远远不够. 健壮的产品级服务器应该: 运行一个 daemon 进程,这个进程...

水果糖
2016/01/27
22
0
(转) Twisted : 第十二部分 改进诗歌下载服务器

新的服务器实现 这里我们要新写一个Twisted版的服务器。然后,再来讨论一些Deferred的新功能。 在第九、十部分,我们提出了诗歌转换引擎这个概念。由于其实现太过简单,因此我们用随机选择来...

水果糖
2016/01/27
12
0
(转) Twisted :第五部分 Twisted支持的诗歌客户端

抽象地构建客户端 在第四部分中,我们构建了第一个使用Twisted的客户端。它确实能很好地工作,但仍有提高的空间。 首先是,这个客户端竟然有创建网络端口并接收端口处的数据这样枯燥的代码。...

水果糖
2016/01/27
9
0
(转) Twisted :第二十部分 轮子中的轮子: Twisted和Erlang

简介 在这个系列中,有一个事实我们还没有介绍,即混合同步的"普通Python"代码与异步Twisted代码不是一个简单的任务,因为在Twisted程序中阻滞不定时间将使异步模型的优势丧失殆尽. 如果你是初次...

水果糖
2016/01/27
14
0
(转) Twisted : 第二部分 异步编程初探与reactor模式

第二部分:低效的诗歌服务器来启发对Twisted机制的理解 这个系列是从这里开始的,欢迎你再次来到这里来。现在我们可能要写一些代码。在开始之前,我们都做出一些必要的假设。 关于对你的假设 ...

水果糖
2016/01/27
24
0
(转) Twisted : 第十四部分 Deferred用于同步环境

介绍 这部分我们要介绍Deferred的另外一个功能。便于讨论,我们设定如下情景:假设由于众多的内部网请求一个外部诗歌下载服务器,但由于这个外部下载服务器性能太差或请求负荷太重。因此,我...

水果糖
2016/01/27
12
0
(转) Twisted :第十部分 增强defer功能的客户端

现在我们将要向诗歌下载客户端添加一些新的处理逻辑,包括在第九部分提到要添加的功能。不过,首先我要说明一点:我并不知道如何实现Byronification引擎。那超出了我的编程能力范围。取而代之...

水果糖
2016/01/27
10
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

TensorFlow 线性分类

构造直线 z = 2 * x - 3 * y + 4 x0*w0+x1*w1+b=0 x1=-x0* w0/w1-b/w1 斜率 k= -w0/w1 截距 -b/w1 随机生成数据,加入一定的偏差,用直线将二维平面分为两部分 使用线性模型拟合参数 损失函数...

阿豪boy
3分钟前
0
0
翻译冒泡排序测试

翻译一个冒泡排序: var a = [1,3,2,4,6,5];var f = 0;var n = a.length ;for( var i =1; i<= n; i++) { for( var j = n-1 ; j >= i; j --) { if(a[j] < a[j+1]) { ......

钟元OSS
4分钟前
0
0
maven父、子级版本号同时修改

命令: mvn versions:set -DnewVersion=0.0.2-SNAPSHOT

沉默的懒猫
6分钟前
0
0
Spring boot中的异常处理之注解响应

Controller层 return patientRepository.findById(id) .orElseThrow(() -> new NotFoundException(String.format("Patient %d not found", id))); Exception类 @ResponseS......

亚林瓜子
7分钟前
0
0
webpack文档翻译_001

概念 webpack是一个为现代JavaScript应用的打包工具(a static module bundler)。 当webpack处理应用时,在其内部,会生成一个依赖图(dependency graph),这个依赖图可以映射到项目里的每一个...

DennisHill
7分钟前
1
0
vim 行首/行尾 批量操作

批量插入 行首插入 :%s/^/your_word/ 行尾插入:%s/$/your_word/ 按键操作 注释:ctrl+v 进入列编辑模式,向下或向上移动光标,把需要注释的行的开头标记起来,然后按大写的I(shift + i),再插入...

温子寒
8分钟前
0
0
Java语言学习(十二):多线程

Java中给多线程编程提供了内置的支持,多线程是多任务的一种特别形式,它使用了更小的资源开销。这里需要知道两个术语及其关系:进程和线程。 进程:进程是系统进行资源分配和调度的一个独立...

海岸线的曙光
14分钟前
0
0
mysql源码阅读相关文章

https://www.jianshu.com/p/e739afb8fe31

writeademo
27分钟前
0
0
CentOS7 安装MySQL8

1. 从官网拿到本地YUM源的安装包,并安装本地YUM源 2. 通过`yum install -y`命令进行MySQL的安装 3. 启动服务,并配置开机自启 4. 获取初始化密码,登录MySQL 5. 修改密码策略,然后自行设置roo...

小致dad
33分钟前
0
0
史上最简单的 IntelliJ IDEA 教程

我不是作者,我只是内容的搬运工。 传送门

颖辉小居
35分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部