一、背景
- 我們目前并沒(méi)有很好的可視化數(shù)據(jù)來(lái)統(tǒng)計(jì)我們每個(gè)版本的測(cè)試質(zhì)量,以及開(kāi)發(fā)人員當(dāng)月的特性bug數(shù)來(lái)統(tǒng)計(jì)各開(kāi)發(fā)人員的提測(cè)質(zhì)量
- 我們希望有一個(gè)質(zhì)量平臺(tái)可以提供各項(xiàng)的可視化數(shù)據(jù)來(lái)統(tǒng)計(jì)我們的一個(gè)版本質(zhì)量。當(dāng)然我們也希望我們做的各項(xiàng)自動(dòng)化輔助工具能夠集成進(jìn)來(lái)方面大家的使用揩页。
- 另外我們的發(fā)版報(bào)告能夠做到一鍵發(fā)送等等想法,我們從零開(kāi)始搭建一個(gè)自動(dòng)化質(zhì)量平臺(tái)。
- 我們的最終目標(biāo)是希望能實(shí)現(xiàn):不管是服務(wù)端和app(ios/Android)届宠,以及H5,當(dāng)開(kāi)發(fā)提交任意部分存在代碼提交的時(shí)候乘粒,能夠拉取最新代碼進(jìn)行部署并能夠執(zhí)行自動(dòng)化回歸測(cè)試豌注,及時(shí)的將情況反饋開(kāi)發(fā)人員。
二灯萍、現(xiàn)狀
平臺(tái)架構(gòu)如下:
平臺(tái)框架圖如下:
目前我們的基礎(chǔ)框架已經(jīng)搭建起來(lái)轧铁,目前只實(shí)現(xiàn)基本的一個(gè)框架,相應(yīng)的功能待集成和開(kāi)發(fā)旦棉,目前我們劃分的模塊如下:
- UI自動(dòng)化:基于目前的Maxim自動(dòng)遍歷工具和協(xié)議腳本齿风,這些完成之后后續(xù)會(huì)分層ios/Android/H5的自動(dòng)化功能測(cè)試
- 接口自動(dòng)化:基于開(kāi)發(fā)提供的已有的接口實(shí)現(xiàn)項(xiàng)目管理,模塊管理绑洛,用例配置聂宾,以及持續(xù)構(gòu)建執(zhí)行自動(dòng)化
- 輔助工具:目前的運(yùn)營(yíng)商測(cè)試輔助工具、加解密的頁(yè)面整合
- jira數(shù)據(jù):一系列的可視化數(shù)據(jù)來(lái)統(tǒng)計(jì)我們的版本質(zhì)量和提測(cè)質(zhì)量
- 其他:不確定
- 測(cè)試報(bào)告:發(fā)版的報(bào)告做到一鍵發(fā)送
- 平臺(tái)FAQ:報(bào)告平臺(tái)的一些bug
三诊笤、項(xiàng)目結(jié)構(gòu)
項(xiàng)目代碼結(jié)構(gòu)樹(shù):
項(xiàng)目代碼結(jié)構(gòu)解析:
- app文件夾為項(xiàng)目的主應(yīng)用
- app/templates文件夾中用來(lái)存放網(wǎng)站每個(gè)html頁(yè)面
- app/static文件夾中用來(lái)存放一些網(wǎng)站的靜態(tài)文件系谐,如平臺(tái)框架的css樣式,js模板,一些image背景圖片纪他,圖標(biāo)之類的
- app/models.py中用來(lái)存放數(shù)據(jù)庫(kù)模型鄙煤,所有的數(shù)據(jù)庫(kù)表都在這里建立
- app/main/views.py中用來(lái)存放路由函數(shù),所有的請(qǐng)求接口功能都是在這里定義的
- app/_ init _.py中主要初始化一個(gè)應(yīng)用茶袒,app=Flask( _ name _)用來(lái)創(chuàng)建flask對(duì)象梯刚,并提供注冊(cè)藍(lán)圖函數(shù)的功能
- app/main/_ init _.py 用來(lái)引入藍(lán)圖并創(chuàng)建藍(lán)圖對(duì)象
- test中是測(cè)試代碼
- config.py用來(lái)存放項(xiàng)目的一些配置信息
- manager.py用來(lái)存放一些通用的函數(shù),數(shù)據(jù)庫(kù)操作類
四薪寓、如何協(xié)作
各模塊各自獨(dú)立開(kāi)發(fā)和維護(hù):
-
創(chuàng)建對(duì)應(yīng)按鈕的跳轉(zhuǎn)路由和視圖函數(shù)
①在base.html模板中找到對(duì)應(yīng)的標(biāo)簽亡资,加上對(duì)應(yīng)的跳轉(zhuǎn)鏈接。
例如加上:href="/user/maxim":
<li class="active"> <a href="/user/maxim" class="active"> <i class="fa fa-angle-right"></i> <span>Maxim自動(dòng)遍歷工具</span> </a> </li>
②然后在app/main/views.py里面加上對(duì)應(yīng)的視圖函數(shù)
例如:
@main.route('/user/maxim')
def maxim():
return render_template('/maxim.html')
-
編寫待開(kāi)發(fā)的html布局
①在app/templates/創(chuàng)建maxim.html
②然后編寫它的html布局
jinja模板中最強(qiáng)大的就是模板繼承向叉,模板集成允許你構(gòu)建一個(gè)包含你站點(diǎn)共同元素的基本模板“骨架”锥腻,并定義子模板可以覆蓋的塊。
我們是基于基本模板base.html模板進(jìn)行開(kāi)發(fā)母谎,它定義了一個(gè)基本的HTML骨架瘦黑,你可以使用左欄頁(yè)面,補(bǔ)充子模版的空白內(nèi)容奇唤,進(jìn)行開(kāi)發(fā)幸斥。
一般子模板繼承例如:
{% extends "base.html" %}
{% block title %}Maxim自動(dòng)化{% endblock %}
{% block content %}
<div style="padding: 50px 400px 20px 100px;">
子模板的內(nèi)容
</div>
{% endblock %}
-
相應(yīng)的表單交互可以寫在子模板的<script></script>或者app/static/js/app1.v1.js里面
①方法一:寫在app/static/js/app1.v1.js里面,并且可以增加它的復(fù)用性
例如一個(gè)下拉選擇列表在maxim.html的布局如下:
<input type="text" id="run" class="form-control" placeholder="選擇運(yùn)行時(shí)間">
<div class="input-group-btn">
<button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
運(yùn)行時(shí)間
<span class="caret"></span>
</button>
<ul id="runtime" class="dropdown-menu pull-right">
<li><a href="#">0.5h</a></li>
<li><a href="#">1h</a></li>
<li><a href="#">2h</a></li>
<li><a href="#">4h</a></li>
我們可以在app/static/js/app1.v1.js后面加上對(duì)應(yīng)的js命令咬扇,如下:
$("#runtime").on("click", "li", function(){$("#run").val($(this).text());});
②方法二:我們也可以在子模板下的<script></script>里面加上相應(yīng)的ajax請(qǐng)求
html布局如下:
<div>
<button type="button" class="col-md-offset-1 btn btn-success" data-toggle="modal" data-target="#myModal"
id="send" onclick="add_modajax('#add_module')">點(diǎn)擊提交</button>
</div>
<script>
... ...
function add_modajax(id) {
document.getElementById('popmsg').innerHTML='';
var data = $(id).serializeJSON();
if(data['module_name'].length == 0 )
{
document.getElementById('popmsg').innerHTML='模塊不能為空!';
return;
}
if(data['lifting_time'].length == 0 )
{
document.getElementById('popmsg').innerHTML='提測(cè)時(shí)間不能為空!';
return;
}
var url;
var addpro =data['belong_user'];
if (id ==='#add_module') {
url = '/api/'+ addpro+'/add_module/';
}
$.ajax({
type:'post',
url:url,
data:JSON.stringify(data),
contentType:"application/json",
success: function (data) {
if (data ==='添加成功'){
document.getElementById('popmsg').innerHTML=data;
$('#myModal').modal('show');
$(function () {
$('#myModal').on('hide.bs.modal', function () {
window.location.href='/api/'+ addpro+'/add_module/';
})
});
}else {
document.getElementById('popmsg').innerHTML=data;
return;
}
},
error: function () {
alert('sorry,服務(wù)器可能開(kāi)小差了甲葬,請(qǐng)重試')
}
});
... ...
</script>
五、相關(guān)鏈接
1.月分析之獲取jira缺陷數(shù)據(jù):http://url.cn/5CFZ8Ae
2.Python-Jenkins官網(wǎng):https://pypi.python.org/pypi/python-jenkins/
3.Python-Jenkins Doc:http://python-jenkins.readthedocs.io/en/latest/index.html
4.CSS鏈接:http://www.runoob.com/css/css-link.html
5.js鏈接:http://www.runoob.com/js/js-tutorial.html
6.bootstrap相關(guān)組件:https://v3.bootcss.com/components/