频道栏目
首页 > 资讯 > 其他 > 正文

Flask Web 开发 测试

16-10-10        来源:[db:作者]  
收藏   我要投稿

后来请教了其他筒子关于REST API的概念,少许有些理解,就是主要集中在资源的获取上,同样的资源格式,比如JSON,可以提供给不同的终端使用。

打个比方,知乎的网页版,和APP版,虽然显示的方式截然不同,但是,他获取的资源是一毛一样的。

就不多说了。。。先继续往下看测试这章吧

先前在其他前辈的技术文章里就看到过测试覆盖率啊这些的词语,这个章节,就会真正接触到了

首先,他用到的库是coverage库,老样子,先下载,pip install coverage

我们之前在第7章,已经为测试准备了专门的test命令

这里需要扩展一下,给他提供额外的参数,test后面加--coverage参数,如何做到呢

就是在test函数里面进行添加

进入manage.py的文件,分别在文件头添加命令,并更新test函数

#!/usr/bin/env python
import os
COV = None
if os.environ.get('FLASK_COVERAGE'):
import coverage
COV = coverage.coverage(branch=True, include='app/*')
COV.start()

 

@manager.command
def test(coverage=False):
    """Run the unit tests."""
    if coverage and not os.environ.get('FLASK_COVERAGE'):
        import sys
        os.environ['FLASK_COVERAGE'] = '1'
        os.execvp(sys.executable, [sys.executable] + sys.argv)
    import unittest
    tests = unittest.TestLoader().discover('tests')
    unittest.TextTestRunner(verbosity=2).run(tests)
    if COV:
        COV.stop()
        COV.save()
        print('Coverage Summary:')
        COV.report()
        basedir = os.path.abspath(os.path.dirname(__file__))
        covdir = os.path.join(basedir, 'tmp/coverage')
        COV.html_report(directory=covdir)
        print('HTML version: file://%s/index.html' % covdir)
        COV.erase()

这里的代码里面有新功能,需要分步讲解下

主要就是os.execvpsys.executable,还有sys.agrv这3部分

os.execvp是替换新进程的命令,在这里,我感觉是重新启动程序的意思

我们先来看下sys.argv这个函数的作用

sys.argv实际上是一个列表形式,他的[0]代表的是当前执行文件的名字,从[1]开始,则是代表这个执行文件后面跟着的命令参数

我做了如下测试

 

可以看到,打印出来的,就是我当前文件的名字

 

我在把下面的注释去掉,并在执行命令时随意在后面添加参数,可以看到,我就能打印出后面的命令参数了

 

随后来看sys.executable这个功能,他实际上是打印出当前python解释器的位置的路径

 

 

而关于os.execvp这个函数功能,有点略复杂

先来看官方文档的解释

 

os.execvp(file,args)

这个功能是什么意思呢?

file就是执行的文件,args就是后面跟随的参数,这个file和args最后等于是你输入在命令行里面的命令

打个比方,我在c:\\flasky\\test.py有个这样路径的文件, test.py 文件内容是

print ('Just for test')

那我再命令行可以这样输

正如我们上面提到的sys.executable表示的是当前python解释器的位置

所以,你在命令行,输入python和输入解释器的完整路径,作用其实是一样的!

后面对应的文件也是,你可以输入完整路径,也可以直接输入文件名,因为他会按照环境PATH来搜索

python解释器也是,他也会按照环境PATH来搜索,由于现在是出于虚拟环境下,所以他会优先搜索到虚拟环境下的python.exe

 

对于我们测试程序里面的

os.execvp(sys.executable, [sys.executable] + sys.argv)

 

我就自己编了个简单的程序one.py来进行测试

他先判断环境变量FLASKY_TEST是否有,如果没有的话,

1: 设置一下这个环境变量

2: 打印一下当前python解释器位置

3: 重开新进程,执行同目录下的two.py文件


而two.py的内容是

 

所以,他打印出的结果如下图

 

这样,就os.execvp函数,就比较理解了

 

另外自己又做了个测试,对于os.execvp(file,args)里面args的第一个参数,虽然官方说args第一个参数应该是等于新file的名字

但是,其实他随便写什么(只要不带空格,我怀疑他源码里面执行时候是用过split函数的),都可以执行,我自己做了如下测试

 

绕绕绕了一大圈,回到书上章节里面的内容

运行manage.py文件时,他会预先检查环境变量是否存在

import os
COV = None
if os.environ.get('FLASK_COVERAGE'):
    import coverage
    COV = coverage.coverage(branch=True, include='app/*')
    COV.start()

如果存在的话,则引入coverage功能,并开始覆盖率检查

不过,正常开始时候,我们环境变量里面应该是没有这个变量值的

所以,在下面的command命令test里面,他加入了参数用来添加环境变量

并在添加完以后,重新执行当前文件,再次执行后,由于已经有环境变量了,所他会开始覆盖率检查

结果如下

在tmp文件夹下面,会针对每个不同的文件,会有单独的html文件生成

相关TAG标签
上一篇:精通Java8新特性Lambdas、Streams、Interface default methods
下一篇:朱啸虎:6个月后还有20%用户,你就能做到10亿美金
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站