Github 地址 項目背景 最近做個項目,需要進行試駕分析,所謂“試駕”,是指顧客在 4S 店指定人員的陪同下,沿著指定的路線駕駛車輛,從而瞭解這款汽車的行駛性能和操控性能。通常,無論是車廠(製造商),還是4S店(經銷商),對車輛的試駕都比較感興趣。從車廠的角度,不僅僅可以知道某輛車是否受歡迎,還...
Github 地址
項目背景
最近做個項目,需要進行試駕分析,所謂“試駕”,是指顧客在 4S 店指定人員的陪同下,沿著指定的路線駕駛車輛,從而瞭解這款汽車的行駛性能和操控性能。通常,無論是車廠(製造商),還是4S店(經銷商),對車輛的試駕都比較感興趣。從車廠的角度,不僅僅可以知道某輛車是否受歡迎,還可以監控4S店對車輛的使用的情況(車廠肯定不願意原本是用來賣錢的車被私用)。
所以,試駕分析,是利用車載設備,比如 OBD、車機,或是其他能監控車輛的設備,我們採用 OBD,發送給軟體平臺一系列車輛實時狀態消息,如GPS定位、百公裡耗油、報警等,平臺根據這些消息,以及4S店設置的電子圍欄,進行試駕分析,包括試駕開始時間、試駕結束時間、試駕持續時間、行駛里程、油耗、平均速度、最大速度等。
試駕分析演算法,雖然有一定難度(核心演算法1000多行),但跟測試這個演算法相比,簡直容易得不了。OBD 由另一個公司生產,他們只給了我們文檔,來說明OBD消息二進位流的格式,由我們自己解析,再進行試駕分析。事實上,這個項目我的工作,要完成兩個程式:消息解析服務和試駕分析服務,2個月完成,一共將近3.8萬行代碼,但前期沒有任何手段進行測試,直到3個月後公司安排實車測試~
但問題來了,如果每次想測試軟體和演算法,都要用實車,這成本太高了,尤其是時間成本。程式員的時間很寶貴的。唯一的辦法是,另寫一個程式,能夠模擬 OBD發送消息,相當於把之前實車的數據“回放”一遍。不僅如此,最好能自定義幾個命令,來控制消息的發送以及電子圍欄和相關時間的設置,比如,
- “send”表示發送指定消息;
- “wait”表示等待指定時間後再發送一下一個消息;
- “set”表示設置電子圍欄,或採集時間,或報備時間,即試駕分析只在採集時間內、報備時間外進行。
- “echo”表示顯示信息。
示例:
send 5830
wait 1
send 5841
wait 1
echo 將發送報警...
send 5842
……
事實也是這麼做的。我用 Python 寫了一個程式,並利用 nestordeharo/mysql-python-class 庫訪問 MySQL,可意外來了,時不時地程式會報錯,MySQL 拒絕我的連接請求,有時一星期沒事,有時完全無法使用。雖然我也知道,這個程式訪問資料庫太頻繁,效率太低,但只是作為內部測試工具,沒必要寫的太好,而且一秒內訪問兩個資料庫,MySQL 不至於這麼弱吧,我是懷疑運維那邊,資料庫沒配置好~但實在受不了了,嚴重影響測試進度,就棄用上面的庫,自己寫個簡單的 Python 庫,它只訪問一次資料庫。
功能簡介
該 Python 庫只訪問一次 MySQL 資料庫。
API
假設,有個表 t1,它有四個欄位:id、name、age、loc。
* open(self)
打開資料庫。
* close(self)
關閉資料庫。
* select(self, table, where=None, args, *kwargs)
若查找ID為1的用戶:
SELECT id,name FROM t1 WHERE id='1'
可以這樣調用該方法:
select('t1', 'id = %s ', 'id', 'name', id='1')
* insert(self, table, args, *kwargs)
若想插入一條記錄:
INSERT INTO t1(id, name, age, loc) VALUES(2,'person2', '20', '北京')
可以這樣調用該方法:
insert('t1', id='2', name='person2', age='20')
* update(self, table, where=None, args, *kwargs)
若想更新一條記錄:
UPDATE t1 SET name='p2' WHERE id='2'
可以這樣調用該方法:
update('t1', 'id = %s ', '2', name='p2')
* delete(self, table, where=None, *args)
若想刪除ID為2的記錄:
DELETE FROM t1 where id='2'
可以這樣調用該方法:
delete('t1', ' id = %s ', '2')
* select_advanced(self, sql, *args)
若想查找北京地區的成年人:
SELECT id,name,age FROM t1 WHERE age>18 and loc='北京'
可以這樣調用該方法:
select_advanced('SELECT id,name FROM t1 WHERE age > %s AND loc = %s', ('age', '18'),('loc','北京'))