Flask拾遗笔记之单元测试和g对象

0x01 单元测试

# 测试文件
import server
import unittest

class ServerTestCase(unittest.TestCase):

    def setUp(self):
        'test begin'
        self.app = server.app.test_client()

    def tearDown(self):
        'test end'
        pass

    def test_index(self):
        rv = self.app.get('/')
        # 从这里看出,传送时的都是二进制流,想要拿到符合语言的数据类型要再转换
        assert '666' in rv.data.decode()

if __name__ == '__main__':
    unittest.main()
# server.py
from flask import Flask

app = Flask(__name__)

@app.route('/)
def foo():
    data = {
    'p1': 'pt1',
    'p2': 'pt2'
    }
    return jsonify(data)
  1. 测试类中,需要执行的测试函数以 * test *开头
  2. 测试时,server 不必执行,只要在测试文件中导入 server 模块即可
  3. 官方文档中用到了tempfile.mkstemp() 好像是用来创建临时文件句柄的,暂时忽略,用到的时候再看。
  4. 简单的测试,用 requests 库封装的HTTP请求函数来做也不错。

0x02 g

# server.py
from flask import Flask

app = Flask(__name__)

@app.route('/)
def foo():
    data = {
    'p1': 'pt1',
    'p2': 'pt2'
    }
    return jsonify(data)

@app.after_request
def add_something(resp):
    resp.headers['Something'] = getattr(g, 'user', 'None')

if __name__ == '__main__':
    app.run(debug=True)
# 测试文件
import requests

resp =requests.get('http://127.0.0.1:5000/')
print(resp.headers)

输出如下:

{
 'Server': 'Werkzeug/0.11.10 Python/3.5.2',
 'Date': 'Sat, 15 Jul 2017 04:17:17 GMT', 
 'Content-Type': 'text/html; charset=utf-8', 
 'Something': '666', 
 'Content-Length': '5'
}

可见应用成功。
因为 g 对象是为了在同一请求中传递数据,所以在不同请求中,g 并不是同一个 g;换言之,当前请求完全结束时,当前的 g 也就销毁了。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 128,875评论 18 137
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 29,685评论 18 399
  • 背景: 阅读新闻 12C CDB模式下RMAN备份与恢复 [日期:2016-11-29] 来源:Linux社区 作...
    阳屯okyepd阅读 2,511评论 0 7
  • Given two arrays, write a function to compute their inter...
    Jeanz阅读 130评论 0 0
  • 回忆过去一年里的点点滴滴,品尝以前经历过的酸甜苦辣。不经意间,这一年又从指间悄然溜去。 一届又一届...
    佳嘉_阅读 75评论 4 5