自从将项目放到 github(https://github.com/jerrylizilong/autotest_platform ), 不少人对其中的一些设计和运行原理提出了疑问。闲来无事,把其中的一些设计和架构整理一下,也是自己的一个总结。
当初在尝试将原有用 python+selenium 实现的自动化框架做成平台化时,心目中最简单的需求是:
出于这个简单的目的,在 python 的几个 web 框架中,选择了轻量级的 flask,并选用 bootstrap 组件来实现前端布局 。
和大部分的 flask 项目相同,实际开发中分为以下几个模块:
view 模块是 flask 实现 web 路由跳转和接口接收的关键。
简单说一下对 html\js\css 的关系理解:
主要控制:
由于我们平台的页面都是基础的增删查改,因此要做的工作是:
选取一个模块(如用例管理),确定需求:需要新增用例、修改用例、获取用例列表、获取用例详情、删除用例、复制用例
## 新增用例保存
def new_test_case(self,module,name,steps,description, isPublic):
sql = string.Template('insert into test_case (module,name,steps,description,isPublicFunction) values ("$module","$name","$steps","$description",$isPublic);')
sql = sql.substitute(name = name, module = module, steps = steps,description=description, isPublic=isPublic)
useDB.useDB().insert(sql)
@mod.route('/add_test_case', methods=['POST', 'GET']) #新增用例接口
@user.authorize
def save_new_test_case():
log.log().logger.info(request)
if request.method == 'GET':
log.log().logger.info('post')
return render_template("uitest/new_test_cases.html")
if request.method == 'POST':
info = request.form
log.log().logger.info('info : %s' %info)
name = viewutil.getInfoAttribute(info,'name')
module = viewutil.getInfoAttribute(info,'module')
description = viewutil.getInfoAttribute(info,'description')
steps = viewutil.getInfoAttribute(info,'steps')
steps=steps.replace('"',"'")
type = viewutil.getInfoAttribute(info,'type')
if module == '' or name == '' or steps=='' or type=='':
return '必填字段不得为空!'
else:
if type=='公共用例':
isPublic = 1
else:
isPublic = 0
test_case_manage.test_case_manage().new_test_case(module, name, steps, description, isPublic) # 保存用例
return redirect('test_cases')
此时直接访问对应接口,可以实现增、删、改、查等功能。
@mod.route('/test_cases')
@user.authorize
def test_cases():
return render_template("uitest/test_cases.html")
完成这步后,此时直接访问对应的路由路径,就可以打开对应的 html 页面。
// submit form
function submitAddForm() {
$("#new_test_case").validate();
$.validator.setDefaults({
submitHandler: function() {
document.getElementById("new_test_case").submit();
}
});
}
此时需要做的,是将页面的元素与后台的接口关联起来。
到这里,相关的模块功能就实现好了。
查询:
新增:
修改:
在实现后一个模块后,如果要开发新的模块,可以直接套用,只需要修改里面关键的标题、元素、id 等信息即可。 这样只需要复制、批量修改(例如直接把 test_case 替换为 test_suite),很快就能把类似的模块开发出来。