羅廣恒
(中國電子科技集團公司第十研究所,四川成都610036)
自動測試系統(tǒng)(ATS)是指完全或大部分代替人工,利用計算機執(zhí)行程序控制測試儀器和被測設(shè)備,自動進行測量以及數(shù)據(jù)處理,自動顯示、輸出或保存測試結(jié)果的系統(tǒng)。隨著各生產(chǎn)行業(yè)智能制造的發(fā)展,高效靈活的生產(chǎn)模式、產(chǎn)業(yè)鏈的有效協(xié)作與整合、新型生產(chǎn)服務(wù)型制造、系統(tǒng)開發(fā)和云制造等智能化優(yōu)勢越來越多地得到企業(yè)的認同和追逐。智能工廠創(chuàng)造價值的主要技術(shù)前提是大量生產(chǎn)數(shù)據(jù)的集成[1],自動測試系統(tǒng)實現(xiàn)了生產(chǎn)現(xiàn)場測試數(shù)據(jù)的采集,但對測試數(shù)據(jù)的后端應(yīng)用卻較為不足。因此,從生產(chǎn)現(xiàn)場管理或企業(yè)運營角度來說,將自動化與信息化技術(shù)緊密結(jié)合,把來自不同測試系統(tǒng)的測試數(shù)據(jù)網(wǎng)絡(luò)化歸集、融合、分析和可視化的需求,顯得越來越迫切。近年來,隨著計算機技術(shù)的蓬勃發(fā)展,開源軟件在操作系統(tǒng)、數(shù)據(jù)庫、Web服務(wù)等各個方面的應(yīng)用已成為主流,使用開源軟件可快速、低成本構(gòu)建企業(yè)獨特的應(yīng)用系統(tǒng)。本文運用開源的Django網(wǎng)絡(luò)框架和MySQL數(shù)據(jù)庫構(gòu)建自動測試數(shù)據(jù)查詢系統(tǒng),突破測試測量中數(shù)據(jù)孤島的現(xiàn)狀,實現(xiàn)測試數(shù)據(jù)從測試端到應(yīng)用端的網(wǎng)絡(luò)連通。
Django是一種基于python語言的具有完整架站能力的開源網(wǎng)絡(luò)框架。通過Django,設(shè)計人員可以專注于網(wǎng)站應(yīng)用業(yè)務(wù)邏輯的實現(xiàn),而無須處理網(wǎng)絡(luò)底層協(xié)議、線程、進程等方面的問題,這樣大大提高了開發(fā)效率和Web應(yīng)用質(zhì)量[2]。測試數(shù)據(jù)查詢系統(tǒng)基于B/S架構(gòu),分為三層設(shè)計,包括前端、后端和數(shù)據(jù)庫,Django的MTV模型(即Model+Template+View設(shè)計模式)基于這三層設(shè)計優(yōu)化而來,框架結(jié)構(gòu)如圖1所示。
Model:使用ORM(對象數(shù)據(jù)映射)機制,封裝與應(yīng)用程序業(yè)務(wù)邏輯相關(guān)的數(shù)據(jù)及對數(shù)據(jù)的處理方法,是Django框架和數(shù)據(jù)庫的交互層;
Template:通過格式化模板,將數(shù)據(jù)與HTML語言、Js語言等結(jié)合起來的引擎,用于Web頁面的前端渲染;
View:負責實際的業(yè)務(wù)邏輯實現(xiàn),即后端的查詢操作和數(shù)據(jù)處理。
在工程開發(fā)時,Django用文件夾(包)的形式組織腳本文件和靜態(tài)文件,通過路由文件進行路徑關(guān)聯(lián),從而使整個工程目錄清晰有序,適用于前后端設(shè)計人員的分離和協(xié)同開發(fā)。
圖2所示為測試數(shù)據(jù)查詢系統(tǒng)的文件組織結(jié)構(gòu)圖,在shell中執(zhí)行django-admin startproject xxx語句,可自動創(chuàng)建工程目錄和manage.py文件,然后根據(jù)需要在此基礎(chǔ)上進行文件擴展和應(yīng)用創(chuàng)建。測試數(shù)據(jù)查詢系統(tǒng)中建立了賬戶管理應(yīng)用和數(shù)據(jù)查詢應(yīng)用,在項目設(shè)計過程中,主要就是圍繞這2種應(yīng)用,運用MTV的思想進行前后端設(shè)計。測試數(shù)據(jù)查詢系統(tǒng)中的應(yīng)用說明見表1。
表1 測試數(shù)據(jù)查詢系統(tǒng)中的應(yīng)用說明
圖1 Django網(wǎng)絡(luò)框架結(jié)構(gòu)圖
同Oracle、SQL Server等大型數(shù)據(jù)庫相比,MySQL在功能性和安全性等方面表現(xiàn)得差一些,規(guī)模也較小。但由于MySQL的開源特性,可以以較低的資金和開發(fā)成本滿足大多數(shù)中小用戶的使用需求。本文選用MySQL作為測試數(shù)據(jù)庫的搭建平臺,適用于由若干自動測試設(shè)備和計算機構(gòu)建的企業(yè)局域網(wǎng)環(huán)境。在數(shù)據(jù)頻次不高、數(shù)據(jù)量較小的情況下,使用一臺服務(wù)器即可滿足要求,后期隨著數(shù)據(jù)容量增加可考慮通過建設(shè)分布式數(shù)據(jù)庫的方式來提高系統(tǒng)性能。
測試數(shù)據(jù)查詢系統(tǒng)使用MySQL作為數(shù)據(jù)存儲和管理的數(shù)據(jù)庫管理系統(tǒng),作為一種關(guān)系型數(shù)據(jù)庫,數(shù)據(jù)表的設(shè)計應(yīng)遵循固定的范式[3]。數(shù)據(jù)表中盡量不要出現(xiàn)重復(fù)字段,并且每個字段不能再拆分。
Django自帶網(wǎng)站的后臺應(yīng)用管理功能,包括賬戶的登陸管理、權(quán)限管理、應(yīng)用管理等,功能已較為齊備。因此,為了方便設(shè)計,賬戶管理應(yīng)用的數(shù)據(jù)表直接沿用Django的用戶表和用戶權(quán)限管理表,然后再關(guān)聯(lián)自定義的用戶信息附加表即可,本文重點介紹測試數(shù)據(jù)表的設(shè)計方法。從測試數(shù)據(jù)查詢系統(tǒng)業(yè)務(wù)應(yīng)用的角度出發(fā),管理人員或技術(shù)人員除了關(guān)注測試本身的信息,包括測試項目、測試時間、測試產(chǎn)品、測試指標和測試結(jié)論等信息,還關(guān)注與測試相關(guān)的工藝環(huán)節(jié)和工程信息,以便進行多層次查詢和分類統(tǒng)計分析。隨著網(wǎng)絡(luò)化自動測試站的增加,測試數(shù)據(jù)的存儲量隨著時間呈指數(shù)級增長,為了提高測試數(shù)據(jù)的存儲、刪減、修改和查詢效率,依據(jù)層級關(guān)系,測試數(shù)據(jù)庫中將建成測試結(jié)果表、測試記錄表、工程信息表、產(chǎn)品信息表和調(diào)試工藝表,各表之間通過id進行外鍵關(guān)聯(lián),實現(xiàn)聯(lián)合查詢。以測試數(shù)據(jù)中較為重要的測試記錄表和測試結(jié)果表為例,其表中字段的定義如表2所示。
圖2 測試數(shù)據(jù)查詢系統(tǒng)的文件組織結(jié)構(gòu)
Django使用ORM機制在數(shù)據(jù)庫和業(yè)務(wù)應(yīng)用之間進行映射,這樣在訪問數(shù)據(jù)庫時,不需構(gòu)建復(fù)雜且難以拼裝的SQL語句,通過簡單地操作對象的屬性和方法即可輕松實現(xiàn)數(shù)據(jù)的訪問,甚至進行一些功能性的操作。在MySQL數(shù)據(jù)庫中創(chuàng)建2.1節(jié)的數(shù)據(jù)表,只需在相應(yīng)應(yīng)用的models.py文件中編寫數(shù)據(jù)模型類,然后執(zhí)行數(shù)據(jù)遷移操作,每個數(shù)據(jù)模型類都是django.db.models.Model的子類,都將對應(yīng)著數(shù)據(jù)庫中的一張數(shù)據(jù)表。下面將具體討論如何運用ORM機制創(chuàng)建和訪問MySQL數(shù)據(jù)庫。
第一步:在遠程服務(wù)器上安裝MySQL數(shù)據(jù)庫,并設(shè)置數(shù)據(jù)庫的名稱、管理員賬戶、地址和端口號,本系統(tǒng)中使用的是MySQL5.7版本。
第二步:在shell中,運行命令pip install PyMySQL(也可通過離線文件包安裝),安裝MySQL的python庫,作為Django訪問MySQL的引擎。
第三步:在Django的工程腳本文件settings.py中,設(shè)置MySQL引擎和訪問數(shù)據(jù)庫的地址、端口、用戶名、密碼等信息,用于連接遠程數(shù)據(jù)庫。
DATABASES={
表2 測試數(shù)據(jù)庫中測試結(jié)果表和測試記錄表示例
′db01′:{
′ENGINE′:′django.db.backends.mysql′,
′NAME′:′數(shù)據(jù)庫名′,
′USER′:′用戶名’
′PASSWORD′:′密碼
′HOST′:′遠程地址
‘PORT′:端口號,
},
}
第四步:在Django數(shù)據(jù)查詢應(yīng)用的腳本文件models.py中,創(chuàng)建相關(guān)數(shù)據(jù)表的類,并在類中定義字段的類型和關(guān)聯(lián)關(guān)系,下面以測試結(jié)果表和測試數(shù)據(jù)表為例進行說明。
#測試記錄表的類
class MeasureRecord(models.Model):
measurename=models.CharField(max_length=20)
projectname=models.ForeignKey(ProjectDb,on_delete=models.DO_NOTHING,related_name=“prjname”)
people=models.ForeignKey(User,on_delete=models.DO_NOTHING)
product=models.ForeignKey(ProductDb,on_delete=models.DO_NOTHING)
craft=models.ForeignKey(CraftDb,on_delete=models.DO_NOTHING)
starttime=models.DateTimeField()
endtime=models.DateTimeField()
def__str__(self):
return self.measurename
def get_absolute_url(self):
return reverse(“record:datadetail”,args=[self.id,])
class Meta:
app_label="RecordApp"
#測試結(jié)果表的類
class MeasureResult(models.Model):
record=models.ForeignKey(MeasureRecord,on_delete=models.CASCADE)
quotaname=models.CharField(max_length=20)
resultvalue=models.CharField(max_length=20)
conclusion=models.CharField(max_length=20)
starttime=models.DateTimeField()
endtime=models.DateTimeField()
def__str__(self):
return self.quotaname
class Meta:
app_label=“RecordApp”
第五步:執(zhí)行數(shù)據(jù)表遷移工作,在shell中執(zhí)行命令“python manage.py migrate應(yīng)用名”,則Django將調(diào)用ORM機制在數(shù)據(jù)庫中自動創(chuàng)建與models.py中的類相對應(yīng)的數(shù)據(jù)表。
第六步:從models.py文件中導(dǎo)入類到應(yīng)用的views.py文件,并創(chuàng)建類相對應(yīng)的對象,通過對象的函數(shù)訪問數(shù)據(jù)庫中的表和字段,執(zhí)行數(shù)據(jù)的查詢操作,包括簡單查詢、過濾、跨表查詢等。
#依據(jù)id號進行簡單查詢示例
from.models import MeasureRecord,MeasureResult#導(dǎo)入類
def DataDetail(request,id):
reslist=MeasureResult.objects.filter(record_id=id)#創(chuàng)建對象并用filter函數(shù)執(zhí)行過濾操作
record=MeasureRecord.objects.get(id=id)#創(chuàng)建對象并用get函數(shù)執(zhí)行查詢操作
用戶通過瀏覽器的Web頁面執(zhí)行數(shù)據(jù)庫的查詢操作,查詢進程、查詢結(jié)果等信息通過Web頁面進行可視化展示。Web頁面的設(shè)計應(yīng)遵從用戶至上的理念,以方便用戶理解和操作為前提進行開發(fā),并配以生動的色彩、圖形、排版等形式,讓數(shù)據(jù)以最直觀的方式呈現(xiàn)出來。
為了提高數(shù)據(jù)查詢的靈活性,數(shù)據(jù)查詢的關(guān)鍵詞包含工程代碼、產(chǎn)品名稱、工藝名稱、測試項目和測試起止時間,用戶可自由選擇組合關(guān)鍵詞進行查詢。查詢功能的設(shè)計主要包括:用戶權(quán)限認證、關(guān)鍵詞自動關(guān)聯(lián)和依據(jù)關(guān)鍵詞進行數(shù)據(jù)查詢3個方面。
用戶權(quán)限認證是指執(zhí)行查詢函數(shù)之前對當前是否登錄以及登錄用戶是否授權(quán)進行查詢。為降低開發(fā)難度,直接沿用Django的用戶權(quán)限認證函數(shù),只要在查詢函數(shù)之前添加裝飾函數(shù)@login_required(login_url=“/account/login/”)即可。關(guān)鍵詞自動關(guān)聯(lián)是根據(jù)數(shù)據(jù)庫的已有數(shù)據(jù),按照“工程代碼-產(chǎn)品名稱”進行二級聯(lián)動,即初始查詢頁面會在下拉框中顯示數(shù)據(jù)庫已有的工程代碼列表,用戶選定某一項工程代碼之后,頁面會自動查詢并顯示該工程代碼對應(yīng)的全部產(chǎn)品列表。當用戶選定或錄入關(guān)鍵詞之后,查詢函數(shù)將依據(jù)關(guān)鍵詞組裝ORM查詢語句,執(zhí)行查詢,查詢完成后,將查詢結(jié)果進行整理并轉(zhuǎn)換成JSON格式,最終渲染到Web頁面中來,用戶即可看到生動靈活的可視化數(shù)據(jù)。數(shù)據(jù)查詢函數(shù)的執(zhí)行流程如圖3所示。
圖3 數(shù)據(jù)查詢函數(shù)執(zhí)行流程
Js(JavaScript)是一種面向客戶端瀏覽器的基于對象、事件驅(qū)動式的腳本語言。得益于開源技術(shù)的蓬勃發(fā)展,目前在網(wǎng)絡(luò)上有各式各樣面向不同功能的Js庫,Js庫簡化了Js編程,使代碼更簡潔,可以直接運用在Html頁面中。在本系統(tǒng)中,主要運用的Js庫及其功能如表3所示。
表3 測試數(shù)據(jù)查詢系統(tǒng)中應(yīng)用的Js庫
Django有一套自成體系的模板系統(tǒng),包含很多內(nèi)置標簽和接口函數(shù),方便頁面的繼承和擴展。在頁面設(shè)計中使用模板和Js庫,后臺程序只需要將JSON格式的數(shù)據(jù)傳遞給指定路徑的Html模板文件,就可以很便利地動態(tài)生成Html頁面。
圖4 網(wǎng)站管理頁面
以一臺連網(wǎng)的Windows服務(wù)器布置網(wǎng)站服務(wù)端程序和MySQL數(shù)據(jù)庫,開啟服務(wù)端的網(wǎng)絡(luò)服務(wù)后,將10臺自動測試系統(tǒng)通過終端計算機接入局域網(wǎng),終端上的應(yīng)用程序?qū)y試數(shù)據(jù)自動上傳到服務(wù)端的數(shù)據(jù)庫中。測試數(shù)據(jù)查詢系統(tǒng)主要包括用戶權(quán)限認證和測試數(shù)據(jù)查詢兩個模塊。
4.1.1 用戶權(quán)限認證
用戶主要分為管理員用戶、普通用戶和未注冊用戶,由于本系統(tǒng)沿用Django自帶的用戶權(quán)限控制模塊,因此在瀏覽器中將直接使用系統(tǒng)默認的管理頁面。
管理員用戶:主要指對網(wǎng)站進行后臺管理的人員,按權(quán)限范圍又可分為超級管理員和受限管理員。主要功能包括用戶管理、應(yīng)用模塊管理、歷史操作追溯等。當管理員通過超鏈接進入后臺管理頁面時,首先輸入用戶名和密碼,然后進入網(wǎng)站管理頁面,如圖4所示。
普通用戶:由于系統(tǒng)面向的是企業(yè)用戶,因此不采用開放注冊的模式,用戶只能通過管理員添加。普通用戶是指經(jīng)過管理員在Users組中添加賬戶的用戶,其可以正常訪問網(wǎng)站,通過自動測試系統(tǒng)的終端應(yīng)用向數(shù)據(jù)庫上傳測試數(shù)據(jù),在瀏覽器中查詢、修改和刪除測試數(shù)據(jù)等。
未注冊用戶:未注冊用戶是指在Users組中沒有相關(guān)賬戶的用戶,其不能訪問網(wǎng)站,也不能通過自動測試系統(tǒng)的終端應(yīng)用向數(shù)據(jù)庫上傳測試數(shù)據(jù)。
4.1.2 測試數(shù)據(jù)添加
測試數(shù)據(jù)添加主要分兩種,一種是通過自動測試系統(tǒng)軟件在當前項目測試完成后自動添加,前提是確保測試時自動測試系統(tǒng)已正常接入測試局域網(wǎng),然后通過自動測試軟件訪問網(wǎng)絡(luò)端的測試數(shù)據(jù)庫,自動找到對應(yīng)的測試數(shù)據(jù)表并追加測試數(shù)據(jù);另一種是自動測試在離線環(huán)境下完成,測試數(shù)據(jù)無法即時上傳到服務(wù)器數(shù)據(jù)庫中,而是保存在本地的MySQL數(shù)據(jù)庫,可以通過使用Navicat軟件訪問測試數(shù)據(jù)服務(wù)器,然后手動上傳數(shù)據(jù)至服務(wù)端。
4.1.3 測試數(shù)據(jù)查詢
從遠程計算機的瀏覽器輸入服務(wù)端的網(wǎng)頁地址,瀏覽器首先訪問網(wǎng)站的登陸頁面,輸入用戶名和密碼后,進入測試數(shù)據(jù)查詢頁面。如圖5所示,為查詢頁面的最終效果,頁面按照典型的空間布局方式(上、下、左、右、中)分割,包括用戶管理區(qū)、功能導(dǎo)航區(qū)、數(shù)據(jù)查詢區(qū)和圖形化分析展示區(qū)。數(shù)據(jù)查詢區(qū)可實現(xiàn)6種關(guān)鍵詞(工程代碼、產(chǎn)品名稱、工藝名稱、測試項目、開始時間和結(jié)束時間)的組合查詢,選擇或錄入查詢關(guān)鍵詞,點擊查詢按鈕即可將數(shù)據(jù)庫中的信息按條件可視化地展示在數(shù)據(jù)網(wǎng)格中。查詢出的數(shù)據(jù)自動分頁展示,用戶可自定義按照時間順序正序或倒序排列數(shù)據(jù),數(shù)據(jù)中的不合格項以紅底色顯現(xiàn),頁面右端將以柱狀圖分析各工程的指標合格率。由此,用戶在遠程計算機上即可實現(xiàn)測試數(shù)據(jù)的網(wǎng)絡(luò)化查詢,后期將在此基礎(chǔ)上進行深度開發(fā),如擴展數(shù)據(jù)表和字段、強化后端查詢和數(shù)據(jù)處理、增強數(shù)據(jù)分析能力等,讓該系統(tǒng)變得更豐富、更智能。
圖5 查詢頁面實際應(yīng)用展示
隨著系統(tǒng)使用過程中數(shù)據(jù)量的不斷積累,會面臨數(shù)據(jù)量大導(dǎo)致效率無法滿足要求的情況,因此需要探索對數(shù)據(jù)庫查詢性能的持續(xù)優(yōu)化。查詢性能的優(yōu)化主要涉及MySQL數(shù)據(jù)庫中表結(jié)構(gòu)優(yōu)化、索引優(yōu)化和查詢操作優(yōu)化。當單表中存儲數(shù)據(jù)量過大,查詢?nèi)哂噙^多時,會直接導(dǎo)致數(shù)據(jù)庫執(zhí)行許多不必要的操作和遍歷大量無關(guān)數(shù)據(jù),影響查詢時間。因此,在數(shù)據(jù)表設(shè)計時,可以以工程代碼為后綴對測試結(jié)果表和測試數(shù)據(jù)表進行分表存儲,這樣,當執(zhí)行查詢時,就不會去訪問無關(guān)工程的數(shù)據(jù)表,大大減少遍歷的數(shù)據(jù)行。同時,在測試數(shù)據(jù)表中,以測試項目作索引,并進行排序,也可提高數(shù)據(jù)的檢索速度。其缺點是,當新增工程時,需要在Django的models.py文件中新增以工程代碼為標識的數(shù)據(jù)表類,并執(zhí)行數(shù)據(jù)表遷移操作,在數(shù)據(jù)庫中增加新的數(shù)據(jù)表。
另一方面,由于MySQL的數(shù)據(jù)是存儲在磁盤上的,訪問MySQL需要進行磁盤的IO操作,因此直接從MySQL中讀取數(shù)據(jù)不如直接從內(nèi)存中讀取數(shù)據(jù)的效率高。為了提高訪問效率,可以在數(shù)據(jù)庫和應(yīng)用程序之間放置一個基于內(nèi)存的緩存系統(tǒng)。在查詢數(shù)據(jù)時,先從內(nèi)存中查找,如果找到則使用,沒有找到再訪問真正的數(shù)據(jù)庫,并將查詢到的結(jié)果放入緩存中供第二次查詢時使用。本系統(tǒng)在后期優(yōu)化中,將考慮采用目前較為流行的Redis NoSQL數(shù)據(jù)庫(以下簡稱Redis)作為MySQL數(shù)據(jù)庫的緩存,形成以MySQL(主)+Redis(輔)的數(shù)據(jù)存儲形式。需要注意的是,Redis是以鍵-值對的形式存儲在內(nèi)存中,而MySQL是按行存儲數(shù)據(jù)的,要將行數(shù)據(jù)存儲于Redis中,需要在Redis中找到一種對應(yīng)于MySQL行的數(shù)據(jù)結(jié)構(gòu)。由于JSON格式也是一種鍵-值對的形式,并且能被python識別和使用,因此,可將結(jié)果集格式化為若干JSON對象,然后將JSON對象序列化為字符串存入Redis中。
運用Django和MySQL可以成功搭建網(wǎng)絡(luò)化測試數(shù)據(jù)查詢系統(tǒng),開源軟件提供了功能豐富的庫和框架,具有很強的實用性和擴展性,讓設(shè)計人員在開發(fā)過程中更專注于查詢邏輯和用戶體驗,而不需理會底層復(fù)雜的協(xié)議和算法。該系統(tǒng)讓原來離線的測試數(shù)據(jù)統(tǒng)一歸集于網(wǎng)絡(luò)數(shù)據(jù)庫,并利用瀏覽器遠程查詢和可視化展示。本文所探討的測試數(shù)據(jù)網(wǎng)絡(luò)化方法,是實現(xiàn)智能物聯(lián)的基礎(chǔ)技術(shù)途徑之一,其以較低的成本和靈活的技術(shù)手段快速搭建起整個系統(tǒng),并最終成功部署應(yīng)用,可供中小型企業(yè)(項目)參考應(yīng)用。同時,參閱互聯(lián)網(wǎng)上的各種技術(shù)方案,該系統(tǒng)還可以繼續(xù)擴展和優(yōu)化,如提高數(shù)據(jù)查詢性能、增加業(yè)務(wù)處理工作流程、強化數(shù)據(jù)分析能力等。