Flask Web 开发 测试

来源:互联网 发布:sql server 2008教材 编辑:程序博客网 时间:2024/05/19 22:57

国庆节沦陷在RESTFUL API这个章节里了。。。横竖没看懂

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

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


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

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


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

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

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

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

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

#!/usr/bin/env pythonimport osCOV = Noneif os.environ.get('FLASK_COVERAGE'):import coverageCOV = coverage.coverage(branch=True, include='app/*')COV.start()


@manager.commanddef 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 osCOV = Noneif os.environ.get('FLASK_COVERAGE'):    import coverage    COV = coverage.coverage(branch=True, include='app/*')    COV.start()

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

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

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

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

结果如下



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








0 0