移动端自动化测试强化学习之路“Flask”
Posted 一叶扁舟行于水
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了移动端自动化测试强化学习之路“Flask”相关的知识,希望对你有一定的参考价值。
这里为啥Terry要提到Flask,原因其实很简单,生产率高,简单易学,对于从事移动的同学,部署一个简单的服务端,用户直接调用相关测试服务接口,比如ios的自动化ui case,总不能把开发环境,和ide环境帮用户搭建好后,让他们学习各类配置环境方式和脚本语言吧,对于尤其敏捷开发测试流程的同学来说,那是要命的。所以送佛送到西,干脆你一个回车键,便能运行整套自动化case,那岂不是很cool。
长话短说,Terry会在之后的Flask针对ios的移动端学习过程陆续推出精品文章,欢迎关注百家号、和微信公号,都是“一叶扁舟行于水”。
我们先对flask有个了解,其实就是一个简单的框,如果你听说过Django那么这个和那个也差不多,区别Terry理解其实是把Django给封装了,感兴趣的同学可以去官网查看仔细阅读这块。
今天我就把flask的一个官网的例子在windows的环境下给大家做个比较系统的解说。
自己安装一个比较需要的工具pycharm的工具,pip软件安装管理器也需要安装,
1)好了之后,我们建立一个pypro的目录,然后找Flask插件进行安装如下图:
2)然后建立如下目录结构
/flaskr/flaskr
/static
/templates
flaskr.py
schema.sql
manifest.in
setup.py
3)分析每个文件中的大抵内容
我们先看一下MANFIFEST.in文件内容
大家可以看到该文件主要是告诉我们的项目html模板文件和需要的静态文件是那些,以及我们需要的sdl脚本。
如下图,我们看一下schema.sql中的sql语句原来是有三个自动,大家看一下就明了。
重量级的flaskr.py出来了,我们先看一个代码片段
红色框中就是应用的插件类库,这些都用,看到小g没,后面有用。
黄色框中就创建一个实例,你就那么写即可,这个实例肯定有些属性,属性就如下面的蓝色框内
蓝色框Database要在项目应用自动会创建一个flaskr.db,其他几个属性回头说。
def connect_db():
"""Connects to the specific database."""
rv = sqlite3.connect(app.config['DATABASE'])
rv.row_factory = sqlite3.Row
return rv
def get_db():
"""Opens a new database connection if there is none yet for the
current application context.
"""
if not hasattr(g, 'sqlite_db'):
g.sqlite_db = connect_db()
return g.sqlite_db
def init_db():
db = get_db()
with app.open_resource('schema.sql', mode='r') as f:
db.cursor().executescript(f.read())
db.commit()
@app.cli.command('initdb')
def initdb_command():
"""Initializes the database."""
init_db()
print('Initialized the database.')
上面这一段代码其实很简单,就是创建连接数据库,执行schema.sql语句
上面这段代码需要这样执行
cd flask/flask
set FLASK_APP=flaskr.py
flask initdb #这里的initdb单纯执行是找不到,因为我们app中定义在cli cmd下initdb时候就执行initdb_command方法
上面的几个粗体的地方大家看看g.sqlite_db如果属性没有就去创建数据库连接,上面我们配置中就是设置一个flaskr.db,然后就会执行schema.sql语句了
4) 创建接口
@app.route可是个好东西,你可以配置post还是get请求,
下面是一个查询show_entries,可以看一下里面的sql写法,基本地球人都懂。
再看一下插入语句的post请求,reqest.form['title'],在接口中需要传人这几个自动,不然肯定报错。
return会加载对应模板这块要体验的时候这块可以先替换成简单的比如return 'show entries'就可
5) 其实上面基本都好了就可以运行我们的应用了,但是大家想想,数据连接创建一旦我们的请求程序有错误,是不是没有关闭连接啊,那么这样以后连个请求异常了,数据库连接池就会打满的,所以的不管数据库连接成功还是失败我们都要正常释放连接
可以看到teardown_appcontext当不管程序是不是有问题一律走到该内容保证数据库连接正常释放,上面大家可以看到有个before_request意思都懂得呀,请求前肯定走的方法,自己脑补以后用在哪里。
6) 调试接口,看效果
同理我们把login logout的内容也加一下,上面我们app.config中是不是有对username和passwd进行设置啊,当然这个是demo你要是在生产环境中也这么搞,老板会找你的。app.run时候注意debug=true就是说明你更新了该文件即时生效不用再重启服务了,稍微优雅了一些。
我们看看运行一下我们的应用,在如下设置一下断点
运行后这个/add后我们传了两个参数,就会走到这里,当然你也可以再teardown_appcontext中设置断点
看看是不是走到close db了
7) 前端页面渲染加载
把如下文件copy到对应路径下,大家可以看到有个url_for()是flask的可以指定对应请求路径的方法
我们在login中看到seesion['logged_in'] = True有这样代码下面就可以用到该会话的属性内容进行条件判断走哪里分之了。
layout.html:
<!doctype html>
<title>Flaskr</title>
<link rel=stylesheet type=text/css href="{{ url_for('static', filename='style.css') }}">
<div class=page>
<h1>Flaskr</h1>
<div class=metanav>
{% if not session.logged_in %}
<a href="{{ url_for('login') }}">log in</a>
{% else %}
<a href="{{ url_for('logout') }}">log out</a>
{% endif %}
</div>
{% for message in get_flashed_messages() %}
<div class=flash>{{ message }}</div>
{% endfor %}
{% block body %}{% endblock %}
</div>
login.html
{% extends "layout.html" %}
{% block body %}
<h2>Login</h2>
{% if error %}<p class=error><strong>Error:</strong> {{ error }}{% endif %}
<form action="{{ url_for('login') }}" method=post>
<dl>
<dt>Username:
<dd><input type=text name=username>
<dt>Password:
<dd><input type=password name=password>
<dd><input type=submit value=Login>
</dl>
</form>
{% endblock %}
show_entries.html
{% extends "layout.html" %}
{% block body %}
{% if session.logged_in %}
<form action="{{ url_for('add_entry') }}" method=post class=add-entry>
<dl>
<dt>Title:
<dd><input type=text size=30 name=title>
<dt>Text:
<dd><textarea name=text rows=5 cols=40></textarea>
<dd><input type=submit value=Share>
</dl>
</form>
{% endif %}
<ul class=entries>
{% for entry in entries %}
<li><h2>{{ entry.title }}</h2>{{ entry.text|safe }}
{% else %}
<li><em>Unbelievable. No entries here so far</em>
{% endfor %}
</ul>
{% endblock %}
style.css
body { font-family: sans-serif; background: #eee; }
a, h1, h2 { color: #377ba8; }
h1, h2 { font-family: 'Georgia', serif; margin: 0; }
h1 { border-bottom: 2px solid #eee; }
h2 { font-size: 1.2em; }
.page { margin: 2em auto; width: 35em; border: 5px solid #ccc;
padding: 0.8em; background: white; }
.entries { list-style: none; margin: 0; padding: 0; }
.entries li { margin: 0.8em 1.2em; }
.entries li h2 { margin-left: -1em; }
.add-entry { font-size: 0.9em; border-bottom: 1px solid #ccc; }
.add-entry dl { font-weight: bold; }
.metanav { text-align: right; font-size: 0.8em; padding: 0.3em;
margin-bottom: 1em; background: #fafafa; }
.flash { background: #cee5F5; padding: 0.5em;
border: 1px solid #aacbe2; }
.error { background: #f0d6d6; padding: 0.5em; }
看效果:
第一节课程到这里了后面就设计ios环境配置啦,你可能忘记什么了
微信公号是什么?
......“一叶扁舟行于水”
你们要干什么?
关注,打赏~
以上是关于移动端自动化测试强化学习之路“Flask”的主要内容,如果未能解决你的问题,请参考以下文章