在 Eclipse 中設定 GDA 和 CDA 專案,首先需要理解專案結構和關鍵檔案,例如 Java 專案中的 pom.xml 和 Python 專案中的 ConstrainedDeviceApp.py。正確設定 PYTHONPATH 環境變數對於 Python 專案至關重要,確保程式碼能夠正確載入和執行。應用程式組態則透過 ConfigUtil 類別管理,允許載入預設或自定義的組態檔案,並提供安全儲存憑證的機制。測試策略涵蓋單元測試、整合測試和效能測試,以確保程式碼的品質和系統的穩定性。
設定開發與測試環境
在 Eclipse 中建立 GDA(Gateway Device Application)專案後,讓我們來探索專案內的檔案。導航至該專案並點選插入符號(>)以展開它,如圖 1-7 所示。
瞭解 GDA 專案結構
專案內已經包含兩個檔案:一個是位於 programmingtheiot.gda.app 套件中的 GatewayDeviceApp,另一個是位於頂層的 pom.xml。GatewayDeviceApp 是一個初始的佔位符,你可以替換成自己的應用程式,但建議保持相同的命名慣例,因為 pom.xml 依賴此命名慣例進行編譯、測試和封裝。
pom.xml 的重要性
對於不熟悉 Maven 的開發者來說,pom.xml 是 Maven 的主要設定檔,包含載入依賴項、版本、命名慣例、建置和封裝指令等資訊。大多數依賴項已經包含在內,但你可以根據需要新增其他有用的依賴項。Maven 有其預設的目錄結構,這裡保持了 Java 儲存函式庫的結構。要了解更多關於 Maven 的功能,建議瀏覽五分鐘的 Maven 教學。
建置、封裝和執行 GDA
- 確保工作站連線到網際網路。
- 建置專案並建立可執行套件:
- 在 Project Workspace 中右鍵點選
piot-java-components專案,選擇 “Run As”,然後點選 “Maven install”。 - 檢查 Eclipse IDE 畫面底部的控制檯輸出。應該沒有錯誤,最後幾行應該類別似以下內容:
[INFO] --- maven-install-plugin:2.4:install (default-install) @ gateway-device-app
- 在 Project Workspace 中右鍵點選
[INFO] Installing E:\aking\workspace\gda\java-components\target\gateway-device-app-0.0.1.jar to C:\Users\aking\.m2\repository\programmingtheiot\gda\gateway-device-app\0.0.1\gateway-device-app-0.0.1.jar
[INFO]
[INFO] BUILD SUCCESS
[INFO]
[INFO] Total time: 4.525 s
[INFO] Finished at: 2020-07-04T14:31:45-04:00
[INFO]
```
- 在 Eclipse 中執行 GDA 應用程式:
- 再次右鍵點選
java-components專案,選擇 “Run As”,然後點選 “Java application”。 - 檢查控制檯輸出,應該沒有錯誤,輸出內容類別似以下:
Jul 04, 2020 3:10:49 PM programmingtheiot.gda.app.GatewayDeviceApp initConfig INFO: Attempting to load configuration. Jul 04, 2020 3:10:49 PM programmingtheiot.gda.app.GatewayDeviceApp startApp INFO: Starting GDA... Jul 04, 2020 3:10:49 PM programmingtheiot.gda.app.GatewayDeviceApp startApp INFO: GDA ran successfully.
- 再次右鍵點選
設定 Constrained Device Application(CDA)專案
此過程與 GDA 設定過程類別似,但需要將 PyDev 新增至 Eclipse。
安裝 PyDev:
- 開啟 Eclipse IDE,並在瀏覽器中導航至 PyDev Python IDE for Eclipse 下載頁面。
- 將 PyDev “Install” 圖示拖曳至 Eclipse IDE 的頂部,Eclipse 將自動安裝 PyDev 及其依賴項。
設定 Python 直譯器:
- 安裝 PyDev 後,切換 Python 直譯器以使用 venv(或 virtualenv)環境。選擇 Preferences → PyDev → Interpreters → “Python Interpreter”。
- 新增一個新的直譯器,並將 venv(或 virtualenv)直譯器設為預設。
匯入 CDA 專案:
- 選擇 File → Import,並匯入之前從 GitHub 複製的
python-componentsGit 儲存函式庫。 - 這將建立一個新的專案
piot-python-components,代表 CDA 元件已在 Eclipse IDE 中設定完成。
- 選擇 File → Import,並匯入之前從 GitHub 複製的
檢視 CDA 專案檔案
導航至 piot-python-components,點選插入符號(>)以展開它,如圖 1-10 所示,即可檢視內部檔案。
程式碼說明
此處未包含任何程式碼範例。若有需要,將在後續章節中提供相關程式碼及其詳細解說。
相關 Plantuml 圖表
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title 物聯網裝置應用程式開發與測試環境設定
package "安全架構" {
package "網路安全" {
component [防火牆] as firewall
component [WAF] as waf
component [DDoS 防護] as ddos
}
package "身份認證" {
component [OAuth 2.0] as oauth
component [JWT Token] as jwt
component [MFA] as mfa
}
package "資料安全" {
component [加密傳輸 TLS] as tls
component [資料加密] as encrypt
component [金鑰管理] as kms
}
package "監控審計" {
component [日誌收集] as log
component [威脅偵測] as threat
component [合規審計] as audit
}
}
firewall --> waf : 過濾流量
waf --> oauth : 驗證身份
oauth --> jwt : 簽發憑證
jwt --> tls : 加密傳輸
tls --> encrypt : 資料保護
log --> threat : 異常分析
threat --> audit : 報告生成
@enduml
此圖表展示了 GDA 和 CDA 專案的基本結構。GDA 專案包含 pom.xml 和 GatewayDeviceApp,而 CDA 專案則與 python-components 相關聯。
設定開發與測試環境
在前面的章節中,我們已經完成了基礎的開發環境設定,接下來將探討如何設定和執行CDA(Constrained Device Application)專案。
初始化CDA專案
當你完成CDA專案的建立後,會發現專案中已經包含許多Python檔案。其中,ConstrainedDeviceApp.py位於programmingtheiot.cda.app套件下,是CDA的應用程式包裝器。就像之前介紹的GDA(Gateway Device Application)範例一樣(該範例使用Java撰寫),ConstrainedDeviceApp僅僅是一個讓你快速上手的基礎範本。
此外,專案中還有兩個.txt檔案:basic_imports.txt和cv_imports.txt。前者將用於安裝支援即將到來的CDA程式設計練習所需的函式庫依賴項。後者則不會在與本文相關的練習中使用,它主要是為了方便你開始進行基本的電腦視覺設定而提供的。
組態PYTHONPATH環境變數
如果你具備豐富的Python開發經驗,你可能對PYTHONPATH環境變數並不陌生。由於我們試圖保持GDA和CDA的套件結構相似,你可能需要告知PyDev(以及你的virtualenv環境)如何導航此目錄結構以執行你的應用程式。請確保為main和test下的python資料夾設定正確的PYTHONPATH。
具體步驟如下:
- 右鍵點選「piot-python-components」,選擇「PyDev - PYTHONPATH」。
- 點選「Add source folder」,然後選擇
main下的python資料夾,點選「Apply」。對test下的python資料夾重複此步驟。 - 點選「Apply and Close」以完成設定。
執行CDA應用程式
要在Eclipse中執行CDA應用程式,請按照以下步驟操作:
- 再次右鍵點選「piot-python-components」專案,將遊標移到「Run As」,然後點選「Python Run」。
- 檢查Eclipse IDE底部控制檯中的輸出結果。與執行GDA測試時類別似,不應出現任何錯誤,輸出結果應類別似於:
2020-07-06 17:15:39,654:INFO:Attempting to load configuration... 2020-07-06 17:15:39,655:INFO:Starting CDA... 2020-07-06 17:15:39,655:INFO:CDA ran successfully.
應用程式組態
在執行CDA和GDA之後,你可能會注意到與組態相關的日誌訊息。正如本章前面所討論的組態管理,每個應用程式都會處理多個不同的組態引數。為此,我們在每個程式碼倉函式庫中提供了一個基本的工具類別來協助處理這些組態——它被命名為ConfigUtil。
在Python中,ConfigUtil委託其內建的configparser模組來處理組態;而在Java中,它委託Apache的commons-configuration函式庫。這兩種實作方式都允許你載入預設的組態檔案(位於./config/PiotConfig.props),或者載入自定義版本的組態檔案。
組態檔案格式
CDA和GDA的組態檔案格式是相同的。下面是CDA的PiotConfig.props組態檔案的一個簡短範例:
[ConstrainedDevice]
deviceLocationID = constraineddevice001
enableEmulator = False
enableSenseHAT = False
enableMqttClient = True
enableCoapClient = False
enableLogging = True
pollCycleSecs = 60
testGdaDataPath = /tmp/gda-data
testCdaDataPath = /tmp/cda-data
同樣地,以下是GDA的PiotConfig.props組態檔案的一個片段:
[GatewayDevice]
deviceLocationID = gatewaydevice001
enableLogging = True
pollCycleSecs = 60
enableMqttClient = True
enableCoapServer = False
enableCloudClient = False
enableSmtpClient = False
enablePersistenceClient = False
testGdaDataPath = /tmp/gda-data
testCdaDataPath = /tmp/cda-data
請注意,組態檔案中的區段是以括號內的關鍵字來標示的,而屬性則是以key = value的格式呈現。這使得新增區段和鍵值對變得非常容易。
安全儲存憑證
每個實作的ConfigUtil都允許你定義並載入一個單獨的組態檔案,其中包含憑證或其他敏感資料,這些資料不應該存放在你的倉函式庫組態中。每個區段都允許你指定一個名為credFile的值,它對映到一個本地檔案,該檔案應該位於你的倉函式庫之外。
組態策略
本章介紹的組態方法相當基礎,主要用於測試和原型開發。在本文的第三和第四部分,你將學習一些額外的技術,用於在Edge Tier和Cloud Tier中動態設定組態資訊。
定義測試策略
既然你的GDA和CDA開發環境已經建立,接下來我們可以討論如何測試即將開發的程式碼。良好的測試是任何工程工作中極為重要的一部分,程式設計也不例外。你構建的每個應用程式都應該經過徹底的測試,無論它是完全獨立運作還是與其他系統緊密整合。此外,你編寫的每個程式碼單元都應該被測試,以確保其行為符合預期。
對於我們的目標而言,一個單元始終由你想要測試的一個函式或方法來代表。
內容解密:
本段落主要講解了如何設定開發和測試環境,包括建立CDA專案、組態PYTHONPATH、執行CDA應用程式、理解應用程式組態以及定義測試策略。其中,重點介紹瞭如何使用ConfigUtil類別處理組態,以及如何安全地儲存憑證。最後,強調了良好測試實踐的重要性,並概述了接下來的測試策略討論。
單元測試、整合測試與效能測試的重要性
在開發物聯網(IoT)解決方案時,測試是確保系統穩定性和可靠性的關鍵步驟。測試可以分為多種型別,包括單元測試、整合測試和效能測試,每種型別的測試都有其特定的目標和方法。
單元測試:驗證程式碼的基本單元
單元測試是用於驗證程式碼中最小可測試單元的正確性,例如函式或方法。這些測試旨在檢查給定輸入是否會產生預期的輸出結果,同時也會測試邊界條件,以確保函式或方法能夠正確處理這些情況。
單元測試的特點
- 測試最小的可測試單元,如函式或方法。
- 驗證給定輸入的輸出結果是否符合預期。
- 檢查邊界條件的處理是否正確。
Java 中的單元測試範例
@Test
public void testAddTwoIntegers() {
MyClass mc = new MyClass();
// 基礎測試
assertTrue(mc.addTwoIntegers(0, 0) == 0);
assertTrue(mc.addTwoIntegers(1, 2) == 3);
assertTrue(mc.addTwoIntegers(-1, 1) == 0);
assertTrue(mc.addTwoIntegers(-1, -2) == -3);
assertFalse(mc.addTwoIntegers(1, 2) == 4);
assertFalse(mc.addTwoIntegers(-1, -2) == -4);
}
#### 內容解密:
@Test註解表示該方法是一個單元測試。assertTrue和assertFalse用於驗證方法的輸出是否符合預期。- 這個範例展示瞭如何使用 JUnit 框架進行單元測試。
Python 中的單元測試範例
def testAddTwoIntegers(self):
mc = MyClass()
# 基礎測試
self.assertTrue(mc.addTwoIntegers(0, 0) == 0)
self.assertTrue(mc.addTwoIntegers(1, 2) == 3)
self.assertTrue(mc.addTwoIntegers(-1, 1) == 0)
self.assertTrue(mc.addTwoIntegers(-1, -2) == -3)
self.assertFalse(mc.addTwoIntegers(1, 2) == 4)
self.assertFalse(mc.addTwoIntegers(-1, -2) == -4)
#### 內容解密:
self.assertTrue和self.assertFalse用於驗證方法的輸出是否符合預期。- 使用 Python 的 unittest 框架進行單元測試。
- 與 Java 範例類別似,這個測試檢查了
addTwoIntegers方法的正確性。
整合測試:驗證系統間的互動
整合測試對於 IoT 系統至關重要,因為它們能夠驗證不同系統和應用程式之間的連線和互動是否按預期工作。當某個功能依賴於外部資料或服務時,整合測試可以確保這些依賴關係正確運作。
整合測試的特點
- 驗證不同系統或應用程式之間的互動。
- 需要設定特定的測試環境,可能涉及外部服務或資料來源。
- 通常需要手動執行和驗證。
為何整合測試在 IoT 中尤其重要
在 IoT 環境中,系統往往依賴於多個外部服務和資料來源,這使得整合測試變得更加複雜和重要。一個簡單的功能可能需要與多個外部系統互動,因此需要透過整合測試來確保整個流程的正確性。
手動執行整合測試
由於 IoT 系統的複雜性,大部分的整合測試需要手動執行和驗證。這意味著開發者需要在命令列中執行這些測試,並觀察結果以確定成功或失敗。
管理開發與測試環境的關鍵要素
效能測試(Performance Testing)是用於評估系統在不同條件下的處理速度或效率的重要方法。這些測試可以用於單元測試(Unit Tests)和整合測試(Integration Tests),例如,需要測量回應時間或支援的平行連線數。
效能測試的實務應用
假設有多個系統需要從資料儲存函式庫檢索資料列表,並且每個系統都希望在應用程式傳回資料之前對資料進行排序。忽略系統設計和資料函式庫結構最佳化,一系列效能測試可用於測量每個系統請求的回應時間(從初始請求到回應),以及在應用程式無法正常回應之前可以存取的平行系統數量。
效能測試的另一個重要方面是測試應用程式執行所在的系統負載,這對於物聯網(IoT)應用程式尤為重要。IoT裝置通常在某些方面受到限制,例如記憶體、CPU、儲存等,而雲端服務則可以根據需求擴充套件。因此,我們的第一個IoT應用程式將為監控每個裝置的效能奠定基礎。
由於效能測試通常與整合測試和單元測試密切相關,我們將繼續使用Maven和專門的單元測試,並結合開源工具來進行效能測試。
效能測試工具的選擇
有多種效能測試工具可供選擇,也可以自行編寫測試指令碼。例如,Locust是一個允許編寫自定義效能測試並包含網頁介面(UI)的工具。
練習的測試技巧
本文中的每個練習都提供了單元測試,可以用來測試所編寫的程式碼。這些單元測試是java-components和python-components儲存函式庫的一部分,用於確保實作正確運作。
實作驗證
每個練習的實作應該透過所有提供的單元測試,且成功率達到100%。當然,也可以根據需要新增更多的單元測試。提供的整合測試和效能測試也將有助於驗證實作的有效性。