羅廣恒
(中國電子科技集團公司第十研究所,四川成都610036)
自動測試系統(ATS)是指完全或大部分代替人工,利用計算機執行程序控制測試儀器和被測設備,自動進行測量以及數據處理,自動顯示、輸出或保存測試結果的系統。隨著各生產行業智能制造的發展,高效靈活的生產模式、產業鏈的有效協作與整合、新型生產服務型制造、系統開發和云制造等智能化優勢越來越多地得到企業的認同和追逐。智能工廠創造價值的主要技術前提是大量生產數據的集成[1],自動測試系統實現了生產現場測試數據的采集,但對測試數據的后端應用卻較為不足。因此,從生產現場管理或企業運營角度來說,將自動化與信息化技術緊密結合,把來自不同測試系統的測試數據網絡化歸集、融合、分析和可視化的需求,顯得越來越迫切。近年來,隨著計算機技術的蓬勃發展,開源軟件在操作系統、數據庫、Web服務等各個方面的應用已成為主流,使用開源軟件可快速、低成本構建企業獨特的應用系統。本文運用開源的Django網絡框架和MySQL數據庫構建自動測試數據查詢系統,突破測試測量中數據孤島的現狀,實現測試數據從測試端到應用端的網絡連通。
Django是一種基于python語言的具有完整架站能力的開源網絡框架。通過Django,設計人員可以專注于網站應用業務邏輯的實現,而無須處理網絡底層協議、線程、進程等方面的問題,這樣大大提高了開發效率和Web應用質量[2]。測試數據查詢系統基于B/S架構,分為三層設計,包括前端、后端和數據庫,Django的MTV模型(即Model+Template+View設計模式)基于這三層設計優化而來,框架結構如圖1所示。
Model:使用ORM(對象數據映射)機制,封裝與應用程序業務邏輯相關的數據及對數據的處理方法,是Django框架和數據庫的交互層;
Template:通過格式化模板,將數據與HTML語言、Js語言等結合起來的引擎,用于Web頁面的前端渲染;
View:負責實際的業務邏輯實現,即后端的查詢操作和數據處理。
在工程開發時,Django用文件夾(包)的形式組織腳本文件和靜態文件,通過路由文件進行路徑關聯,從而使整個工程目錄清晰有序,適用于前后端設計人員的分離和協同開發。
圖2所示為測試數據查詢系統的文件組織結構圖,在shell中執行django-admin startproject xxx語句,可自動創建工程目錄和manage.py文件,然后根據需要在此基礎上進行文件擴展和應用創建。測試數據查詢系統中建立了賬戶管理應用和數據查詢應用,在項目設計過程中,主要就是圍繞這2種應用,運用MTV的思想進行前后端設計。測試數據查詢系統中的應用說明見表1。

表1 測試數據查詢系統中的應用說明

圖1 Django網絡框架結構圖
同Oracle、SQL Server等大型數據庫相比,MySQL在功能性和安全性等方面表現得差一些,規模也較小。但由于MySQL的開源特性,可以以較低的資金和開發成本滿足大多數中小用戶的使用需求。本文選用MySQL作為測試數據庫的搭建平臺,適用于由若干自動測試設備和計算機構建的企業局域網環境。在數據頻次不高、數據量較小的情況下,使用一臺服務器即可滿足要求,后期隨著數據容量增加可考慮通過建設分布式數據庫的方式來提高系統性能。
測試數據查詢系統使用MySQL作為數據存儲和管理的數據庫管理系統,作為一種關系型數據庫,數據表的設計應遵循固定的范式[3]。數據表中盡量不要出現重復字段,并且每個字段不能再拆分。
Django自帶網站的后臺應用管理功能,包括賬戶的登陸管理、權限管理、應用管理等,功能已較為齊備。因此,為了方便設計,賬戶管理應用的數據表直接沿用Django的用戶表和用戶權限管理表,然后再關聯自定義的用戶信息附加表即可,本文重點介紹測試數據表的設計方法。從測試數據查詢系統業務應用的角度出發,管理人員或技術人員除了關注測試本身的信息,包括測試項目、測試時間、測試產品、測試指標和測試結論等信息,還關注與測試相關的工藝環節和工程信息,以便進行多層次查詢和分類統計分析。隨著網絡化自動測試站的增加,測試數據的存儲量隨著時間呈指數級增長,為了提高測試數據的存儲、刪減、修改和查詢效率,依據層級關系,測試數據庫中將建成測試結果表、測試記錄表、工程信息表、產品信息表和調試工藝表,各表之間通過id進行外鍵關聯,實現聯合查詢。以測試數據中較為重要的測試記錄表和測試結果表為例,其表中字段的定義如表2所示。

圖2 測試數據查詢系統的文件組織結構
Django使用ORM機制在數據庫和業務應用之間進行映射,這樣在訪問數據庫時,不需構建復雜且難以拼裝的SQL語句,通過簡單地操作對象的屬性和方法即可輕松實現數據的訪問,甚至進行一些功能性的操作。在MySQL數據庫中創建2.1節的數據表,只需在相應應用的models.py文件中編寫數據模型類,然后執行數據遷移操作,每個數據模型類都是django.db.models.Model的子類,都將對應著數據庫中的一張數據表。下面將具體討論如何運用ORM機制創建和訪問MySQL數據庫。
第一步:在遠程服務器上安裝MySQL數據庫,并設置數據庫的名稱、管理員賬戶、地址和端口號,本系統中使用的是MySQL5.7版本。
第二步:在shell中,運行命令pip install PyMySQL(也可通過離線文件包安裝),安裝MySQL的python庫,作為Django訪問MySQL的引擎。
第三步:在Django的工程腳本文件settings.py中,設置MySQL引擎和訪問數據庫的地址、端口、用戶名、密碼等信息,用于連接遠程數據庫。
DATABASES={

表2 測試數據庫中測試結果表和測試記錄表示例
′db01′:{
′ENGINE′:′django.db.backends.mysql′,
′NAME′:′數據庫名′,
′USER′:′用戶名’
′PASSWORD′:′密碼
′HOST′:′遠程地址
‘PORT′:端口號,
},
}
第四步:在Django數據查詢應用的腳本文件models.py中,創建相關數據表的類,并在類中定義字段的類型和關聯關系,下面以測試結果表和測試數據表為例進行說明。
#測試記錄表的類
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"
#測試結果表的類
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”
第五步:執行數據表遷移工作,在shell中執行命令“python manage.py migrate應用名”,則Django將調用ORM機制在數據庫中自動創建與models.py中的類相對應的數據表。
第六步:從models.py文件中導入類到應用的views.py文件,并創建類相對應的對象,通過對象的函數訪問數據庫中的表和字段,執行數據的查詢操作,包括簡單查詢、過濾、跨表查詢等。
#依據id號進行簡單查詢示例
from.models import MeasureRecord,MeasureResult#導入類
def DataDetail(request,id):
reslist=MeasureResult.objects.filter(record_id=id)#創建對象并用filter函數執行過濾操作
record=MeasureRecord.objects.get(id=id)#創建對象并用get函數執行查詢操作
用戶通過瀏覽器的Web頁面執行數據庫的查詢操作,查詢進程、查詢結果等信息通過Web頁面進行可視化展示。Web頁面的設計應遵從用戶至上的理念,以方便用戶理解和操作為前提進行開發,并配以生動的色彩、圖形、排版等形式,讓數據以最直觀的方式呈現出來。
為了提高數據查詢的靈活性,數據查詢的關鍵詞包含工程代碼、產品名稱、工藝名稱、測試項目和測試起止時間,用戶可自由選擇組合關鍵詞進行查詢。查詢功能的設計主要包括:用戶權限認證、關鍵詞自動關聯和依據關鍵詞進行數據查詢3個方面。
用戶權限認證是指執行查詢函數之前對當前是否登錄以及登錄用戶是否授權進行查詢。為降低開發難度,直接沿用Django的用戶權限認證函數,只要在查詢函數之前添加裝飾函數@login_required(login_url=“/account/login/”)即可。關鍵詞自動關聯是根據數據庫的已有數據,按照“工程代碼-產品名稱”進行二級聯動,即初始查詢頁面會在下拉框中顯示數據庫已有的工程代碼列表,用戶選定某一項工程代碼之后,頁面會自動查詢并顯示該工程代碼對應的全部產品列表。當用戶選定或錄入關鍵詞之后,查詢函數將依據關鍵詞組裝ORM查詢語句,執行查詢,查詢完成后,將查詢結果進行整理并轉換成JSON格式,最終渲染到Web頁面中來,用戶即可看到生動靈活的可視化數據。數據查詢函數的執行流程如圖3所示。

圖3 數據查詢函數執行流程
Js(JavaScript)是一種面向客戶端瀏覽器的基于對象、事件驅動式的腳本語言。得益于開源技術的蓬勃發展,目前在網絡上有各式各樣面向不同功能的Js庫,Js庫簡化了Js編程,使代碼更簡潔,可以直接運用在Html頁面中。在本系統中,主要運用的Js庫及其功能如表3所示。

表3 測試數據查詢系統中應用的Js庫
Django有一套自成體系的模板系統,包含很多內置標簽和接口函數,方便頁面的繼承和擴展。在頁面設計中使用模板和Js庫,后臺程序只需要將JSON格式的數據傳遞給指定路徑的Html模板文件,就可以很便利地動態生成Html頁面。

圖4 網站管理頁面
以一臺連網的Windows服務器布置網站服務端程序和MySQL數據庫,開啟服務端的網絡服務后,將10臺自動測試系統通過終端計算機接入局域網,終端上的應用程序將測試數據自動上傳到服務端的數據庫中。測試數據查詢系統主要包括用戶權限認證和測試數據查詢兩個模塊。
4.1.1 用戶權限認證
用戶主要分為管理員用戶、普通用戶和未注冊用戶,由于本系統沿用Django自帶的用戶權限控制模塊,因此在瀏覽器中將直接使用系統默認的管理頁面。
管理員用戶:主要指對網站進行后臺管理的人員,按權限范圍又可分為超級管理員和受限管理員。主要功能包括用戶管理、應用模塊管理、歷史操作追溯等。當管理員通過超鏈接進入后臺管理頁面時,首先輸入用戶名和密碼,然后進入網站管理頁面,如圖4所示。
普通用戶:由于系統面向的是企業用戶,因此不采用開放注冊的模式,用戶只能通過管理員添加。普通用戶是指經過管理員在Users組中添加賬戶的用戶,其可以正常訪問網站,通過自動測試系統的終端應用向數據庫上傳測試數據,在瀏覽器中查詢、修改和刪除測試數據等。
未注冊用戶:未注冊用戶是指在Users組中沒有相關賬戶的用戶,其不能訪問網站,也不能通過自動測試系統的終端應用向數據庫上傳測試數據。
4.1.2 測試數據添加
測試數據添加主要分兩種,一種是通過自動測試系統軟件在當前項目測試完成后自動添加,前提是確保測試時自動測試系統已正常接入測試局域網,然后通過自動測試軟件訪問網絡端的測試數據庫,自動找到對應的測試數據表并追加測試數據;另一種是自動測試在離線環境下完成,測試數據無法即時上傳到服務器數據庫中,而是保存在本地的MySQL數據庫,可以通過使用Navicat軟件訪問測試數據服務器,然后手動上傳數據至服務端。
4.1.3 測試數據查詢
從遠程計算機的瀏覽器輸入服務端的網頁地址,瀏覽器首先訪問網站的登陸頁面,輸入用戶名和密碼后,進入測試數據查詢頁面。如圖5所示,為查詢頁面的最終效果,頁面按照典型的空間布局方式(上、下、左、右、中)分割,包括用戶管理區、功能導航區、數據查詢區和圖形化分析展示區。數據查詢區可實現6種關鍵詞(工程代碼、產品名稱、工藝名稱、測試項目、開始時間和結束時間)的組合查詢,選擇或錄入查詢關鍵詞,點擊查詢按鈕即可將數據庫中的信息按條件可視化地展示在數據網格中。查詢出的數據自動分頁展示,用戶可自定義按照時間順序正序或倒序排列數據,數據中的不合格項以紅底色顯現,頁面右端將以柱狀圖分析各工程的指標合格率。由此,用戶在遠程計算機上即可實現測試數據的網絡化查詢,后期將在此基礎上進行深度開發,如擴展數據表和字段、強化后端查詢和數據處理、增強數據分析能力等,讓該系統變得更豐富、更智能。

圖5 查詢頁面實際應用展示
隨著系統使用過程中數據量的不斷積累,會面臨數據量大導致效率無法滿足要求的情況,因此需要探索對數據庫查詢性能的持續優化。查詢性能的優化主要涉及MySQL數據庫中表結構優化、索引優化和查詢操作優化。當單表中存儲數據量過大,查詢冗余過多時,會直接導致數據庫執行許多不必要的操作和遍歷大量無關數據,影響查詢時間。因此,在數據表設計時,可以以工程代碼為后綴對測試結果表和測試數據表進行分表存儲,這樣,當執行查詢時,就不會去訪問無關工程的數據表,大大減少遍歷的數據行。同時,在測試數據表中,以測試項目作索引,并進行排序,也可提高數據的檢索速度。其缺點是,當新增工程時,需要在Django的models.py文件中新增以工程代碼為標識的數據表類,并執行數據表遷移操作,在數據庫中增加新的數據表。
另一方面,由于MySQL的數據是存儲在磁盤上的,訪問MySQL需要進行磁盤的IO操作,因此直接從MySQL中讀取數據不如直接從內存中讀取數據的效率高。為了提高訪問效率,可以在數據庫和應用程序之間放置一個基于內存的緩存系統。在查詢數據時,先從內存中查找,如果找到則使用,沒有找到再訪問真正的數據庫,并將查詢到的結果放入緩存中供第二次查詢時使用。本系統在后期優化中,將考慮采用目前較為流行的Redis NoSQL數據庫(以下簡稱Redis)作為MySQL數據庫的緩存,形成以MySQL(主)+Redis(輔)的數據存儲形式。需要注意的是,Redis是以鍵-值對的形式存儲在內存中,而MySQL是按行存儲數據的,要將行數據存儲于Redis中,需要在Redis中找到一種對應于MySQL行的數據結構。由于JSON格式也是一種鍵-值對的形式,并且能被python識別和使用,因此,可將結果集格式化為若干JSON對象,然后將JSON對象序列化為字符串存入Redis中。
運用Django和MySQL可以成功搭建網絡化測試數據查詢系統,開源軟件提供了功能豐富的庫和框架,具有很強的實用性和擴展性,讓設計人員在開發過程中更專注于查詢邏輯和用戶體驗,而不需理會底層復雜的協議和算法。該系統讓原來離線的測試數據統一歸集于網絡數據庫,并利用瀏覽器遠程查詢和可視化展示。本文所探討的測試數據網絡化方法,是實現智能物聯的基礎技術途徑之一,其以較低的成本和靈活的技術手段快速搭建起整個系統,并最終成功部署應用,可供中小型企業(項目)參考應用。同時,參閱互聯網上的各種技術方案,該系統還可以繼續擴展和優化,如提高數據查詢性能、增加業務處理工作流程、強化數據分析能力等。