后来请教了其他筒子关于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.execvp和sys.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文件生成