自動化測試是程式開發中,不可或缺的一環,而 xcode Instruments 裡面的 Automation tool ,便是 iOS UI 的自動化測試工具。
從 Automation tool 的測試腳本中,可以看得出來編譯完成的 APP,是符合 DOM(Document Object Model) 的。所以測試腳本,也很理所當然找了它最老的夥伴 - Javascript 來調用。
往下閱讀之前,建議一定要先看過...
DOM 雖然強大,但寫測試時卻又嫌囉嗦,要準確取得元件是一件很麻煩的事,看完上述連結,可以知道有兩種取得元件的方式:
- 用位置來取得,例如「window.buttons()[0]」,指的是第一個建立出來的 button。
- 用「name」來取得,例如「window.buttons()[“login”]」。
第二種方式是比較理想的,但必須在 xib 上,或是 Objective-C 程式碼中,另外指定 accessibilityLabel 來命名 DOM 這邊所謂的「name」,也是挺麻煩的。
上述連結有這兩種方式的圖文說明。
突然想到之前寫 RSpec(Ruby 的自動測試框架) 測試 RoR 的時候,所有的操作,都只需要直接使用「肉眼所看到的字」,便可正確取得元件的文字或是進行操作(如點擊),於是便動手進行實作,簡化測試的程式。
https://github.com/alexvollmer/tuneup_js
借用了上述的測試框架,將自己寫的整合了進去,主要寫了三個 function
function haveContent(text) {
var elements = window.elements();
for (i = 0; i < elements.length; i++) {
var element = elements[i];
if (element.name() == text && element.isValid()) {
return true;
}
}
return false;
}
function click_button(name) {
var buttons = window.buttons();
for (i = 0; i < buttons.length; i++) {
var button = buttons[i];
if (button.name() == name) {
button.tap();
}
}
}
function fill_in(name, text) {
var textFields = window.textFields();
for (i = 0; i < textFields.length; i++) {
var textField = textFields[i];
if (textField.name() == name) {
textField.setValue(text);
}
}
}
haveContent 與 click_button 這兩個 function,只需指定肉眼看得到的文字就好,例如
test("Clear Hello", function(app, target) {
click_button("Clear All");
assertFalse(haveContent("Hello World"));
});
fill_in 則還是得在 xib 上,或是 Objective-C 程式碼中,另外指定 accessibilityLabel ,讓測試程式可以準確的指定到輸入框中,例如
test("Say Hello", function(app, target) {
fill_in("name", "World");
click_button("Say Hello");
assertTrue(haveContent("Hello World"));
});
其實這三個 function 就可以搞定 95% 的測試了,其餘等需要時再補上,提供完整的範例下載
其它參考資源: