JYAutoTester - 量測自動化軟體
已更新:1月30日
量測自動化的場景最常出現在(1)設計開發驗證以及(2)產品品質驗證的場景中。隨著產品複雜度提升以及測試需求變得更多元, 測試過程中所需要的設備更多元,測試的判定結果條件也更複雜。簡儀科技設計了JYAutoTester的自動化測試軟體, 希望用最輕量化的解決方案提高開發者、驗證人員的效率。

JYAutoTester具備以下幾個特點:
同一套UI應用在不同的測試需求
UI測試介面與使用到的硬體以及判定pass/fail的邏輯完全無關, 換句話說, 更換硬體或是更換邏輯都不需要對UI測試介面重新改寫
Text-in, Text-out 設計
軟體從設定檔讀取(1)硬體設定、(2)測試流程、(3)外部路徑等純文字資訊, 自動解析並動態加載到程式, 執行完畢後可以將結果匯出文字檔
使用文字格式進行硬體控制操作以及排程設定
硬體控制採用Json格式後的文字進行傳輸控制, 意味控制也可以透過網路進行操作。排程的設定同樣採用Json格式的文字進行編排
操作步驟可以參考以下
設計概念
簡儀科技將兩個核心的程式獨立, 讓開發者自行完成其中客製的內容
硬體的控制操作程式
邏輯判定的程式
以上兩項的程式, 在開發者開發完畢之後, 即可透過文字設定檔的方式加載到JYAutoTester裡面, 並對其進行排程的設計跟操作。設定檔採用Json格式, 可讀性以及編輯方便性大幅提高。 不像其他的排程軟體, JYAutoTester的使用需要部份的C#軟體開發, 但也因此讓軟體能夠以最輕量化的方式達到測試的目標。
使用前準備
Visual Studio 或Visual Studio Code 開發環境
具備基本C# 程式開發經驗
在開發專案裡面新增 nuget package - MATSys
操作四步驟
1. 模組設計(Module Design)
"Module"代表在JYAutoTeser裡面可以被控制的最小操作單元, 例如量測儀器、馬達控制等。 設計過程只需要三個步驟就可以完成, 如下圖

將客製的類別繼承ModuleBase的抽象類
產生構造函數的重載, 不需要修改其中的內容
在客製化類別的方法上面, 新增一個[MATSysCommand]的屬性標記。(重要: 方法內的參數不能有ref 或 out, 如果有請用其他中介方法取代)
完成設計後, 此類別(Handler)便可以從設定檔中動態加載, 並且可以透過Json格式的文字信行方法的操作。以此類別(Handler)為例, DoSomething的方法可以透過以下格式的文字進行操作
{"Handler" : { "DoSomething": [1, "Hello"]}}
上述的文字中, "Handler"代表的是實例化後的暱稱(同個類別可以有多個實例, 需要用暱稱分辨), "DoSomething"則是類別中的方法, 而"[1,"Hello"]"則是此方法的參數。需要注意的是參數的格式也是Json格式。 方法的返回值則會用Json格式壓縮後回傳, 如果是void的話則回傳空字串。
2. 邏輯判定設計(Analyzer Design)
在JYAutoTester中, 方法的返回值會先存入一個"AnalyzingData"的實例中, 接下來會從Analyzer類別裡的方法進行分析與邏輯判定。邏輯判定的擴充以及內容可以由開發人員自行定義。更多延伸方法的說明, 可以參考微軟官網。 範例如下
public static class WhatEverClassName
{
public static bool LargerThan(this AnalyzingData data,double v)
{
return JsonSerializer.Deserialize<double>(data.Value) > v;
}
public static bool SmallerThan(this AnalyzingData data,double v)
{
return JsonSerializer.Deserialize<double>(data.Value) < v;
}
…
}
如上方的程式碼, 定義了一個LargerThan的方法判定"AnalyzingData"實例中的值是否大於期望值, 返回的內容則為boolean。因此Analyzer的邏輯分析方法可以透過以下的文字實現
{"LargerThan": [ 0.2 ] }
3. 系統設定檔修改(System Configuration)
JYAutoTester所有的資訊都是從exe執行檔所在資料夾下的appsetting.json設定檔中獲取, 因此開發者可以直接透過編輯此檔案來切換測試的系統設定。 系統設定包含幾個類別
MATSys區段下的References
MATSys區段下的Modules
MATSys區段下的Runner
NLog
{
"MATSys": {
"Modules": [ ],
"Runner": { },
"References": { }
},
"NLog": { }
}
[References]
References存放的是需要動態加載的專案dll, 例如前兩點所述的Module和Analyzer的dll, 需要注意的是如果動態加載的dll有引用到其他dll的話, 也需要一併放在同個資料夾下。以下是新增完後的範例
"References": {
“Modules": [ ".\\modules\\myModule.dll"],
“Analyzer": [".\\modules\\myAnalyzer.dll"],
}
[Modules]
Modules下存放的是整個JYAutoTester需要加載的Module資訊, 其中Type是類型的名稱, 而Alias則是暱稱。暱稱是用來辨別不同實例, 必須設定不同的值。以下是兩個Module資訊的範例
"Modules": [
{
"Type": "Tester",
"Alias": "Tester"
},
{
"Type": "Handler",
"Alias": "Handler"
}
]
[Runner]
Runner下存放的是排程的資訊, 請參考以下章節
[NLog]
JYAutoTester在ModuleBase中嵌入了工作日誌的開源模組NLog, 如果遇到需要除錯紀錄的時候可以透過修改此區段的內容完成紀錄。更多NLog的資訊可以操考連結。
4. 排程內容修改(TestScript Editing)
進入編輯排程之前, 先以下圖介紹JYAutoTester的排程結構
[排程結構]

TestScript包含三個Group, 分別是"Setup", "Test", 以及"Teardown", 其中Setup和Teardown只會執行一次, 可以作為整個系統初始化以及結束節釋放的排程操作。 每一個Group包含一個或多個"TestItem"實例, TestItem就是每個測試項目的最小單元, 每個TestItem在執行過程中, 會先執行獲取資料的"Executer"功能, 接著將返回的資訊使用"Analyzer"功能判定Pass/Fail。TestItem同時支援Retry/Loop的SubTestItem功能。Retry是測試直到Pass或是達到次數上限後返回, 而Loop則是測試直到Fail或達到次數上限後返回。
[排程執行階段事件]
整個TestScript執行過程中有不同階段的事件可以使用, 可以參考下圖。

[排程編輯]
在MATSys區段中的Runner區段, 存放了所有排程的資訊, 請參考下方範例
"Runner": {
"Type": "ScriptRunner",
"RootDirectory": ".\\scripts",
"Setup": [ { "Script": "setup.ats" } ],
"Test": [ { "Script": "main.ats" } ],
"Teardown": [ { "Script": "teardown.ats" } ]
}
其中"Type"的部分不能變更, "RootDirectory"設定的是排程文字檔案的資料夾路徑。而"Setup","Test","Teardown"存放的則是三個不同Group的排程文字檔(Group介紹參考此) 設定的方式有分成兩種, 第一種是從檔案讀取, 另一種則是直接設定Executer以及Analyzer內容, 分別介紹如下
從檔案讀取(設定"Script")
以上述範例的此行為例:
{"Script": "main.ats" }
JYAutoTester會從目錄中讀取main.ats的檔案, 並將其中的內容轉換成TestItem, ats檔案的內容範例可參考下方
[
{
"Executer": { "Tester": { "MeasureVoltage": [] } },
"Analyzer": { "Between": [ 2, 5 ] },
}
]
直接編輯測試內容(設定Executer和Analyazer)
{
"Executer": { "Tester": { "PowerInBand": [] } },
"Analyzer": { "LargerThan": [ 0.2 ] },
"Retry": 3
}
區段Executer存放的是控制Module的指令, 而區段Analyzer存放的則是判定邏輯的指令。如果沒有Analyzer區段的話, 此測試項目會以Skip做為測試結果輸出。TestItem可以額外增加Retry/Loop的標記。