2013-07-18 68 views
2

我正在使用Android上的UI Automator進行一組測試。我有它的工作,但我目前的測試是用大量的字符串文字。訪問Android UI Automator測試的資源

字符串文字很好,當我只是想讓事情在第一時間工作,但他們會很糟糕。如果應用程序發生更改,字符串文字將需要更改以匹配。另外,我的測試必須完全重做才能測試其他語言的本地化版本,這很愚蠢。

應用程序本身具有存儲在資源中的所有字符串。每串有一個不變的標識......這裏有一個例子:

<string name="more_options">More options</string> 

的應用程序代碼總是會使用名稱more_options查找字符串資源,而不是硬編碼"More options"到代碼。

所以我想要的是導入所有的字符串資源,將它們存儲在某種地圖對象中,然後在我的UI Automator測試代碼中使用類似m.get("more_options")而不是像現在這樣的字面字符串"More options"。不管我做什麼,我都希望它成爲構建並推送到設備以運行測試的JAR文件的一部分。例如,我不想將XML字符串資源文件推送到設備,並嘗試在測試運行時讀取它們。我想在構建JAR文件時創建數據。

我看着構建應用程序產生的文件,而像more_options這樣的名稱只設置爲整數。這些必須是索引或指向資源庫的指針,但我不知道如何將該商店複製到我的UI Automator項目中並將其連接起來;在Android應用中,您使用Context對象來訪問資源,並且UI Automator JAR文件沒有Context

這是一個常見問題,人們必須已經解決了這個問題,但是我的谷歌搜索沒有發現人們如何解決這個問題。

如果我沒有得到任何建議,我將編寫一個Python腳本來導入XML文件並編寫一個具有構建我需要的映射的函數的Java文件,然後從我的UI Automator中調用該腳本測試程序。 (我有一個Python腳本,運行一系列命令行工具來啓動一個UI Automator測試,無論如何......我不介意讓它做更多的工作。)但是我認爲應該有一個純Java解決方案爲此,可能需要從應用程序的源目錄中抓取已編譯的文件。

+1

它看起來當反用APK-工具的應用程序,該字符串由他們的名字不是他們的資源ID代表。也許查看[source](https://github.com/iBotPeaches/Apktool) – tophernuts

+0

這種有用的工作方式: 'String value = this.getApp()。getApplicationContext()。getResources()。getText(id) .toString()' –

回答

2

我被一個類似的問題困住了。 我最終在Java中爲所有字符串文字創建了靜態哈希映射。 所以我有不同的語言與相同的密鑰和他們的本地化值的文件。

然後編寫了一個模塊來在運行時操作設備語言並返回鍵的相應本地化值。

+0

這就是我我寫了一個Python程序,它使用Python XML庫來吸入所有的字符串資源,然後寫入一個字符串資源的靜態'HashMap '我認爲任何人都不會給我一個比這個更好的答案,所以我接受它。謝謝。 – steveha

3

我通常通過資源ID定位一個UI元素。這些是非常靜態的。我錯過了什麼嗎?

+0

您能解釋一下'UiAutomator'程序如何使用另一個APK的資源ID訪問其他APK中的字符串?我不是在談論針對給定APK(「白盒測試」)編譯的單元測試,我正在討論一個完全獨立的程序,它使用'UiAutomator'來測試(「黑盒測試」)。如果這是可能的,這將是對我的問題的一個很好的答案。 – steveha

+0

@steveha - 我今天想到了這一點,我注意到'resourceId'API直到4.3(API 18)才被添加。基本上,所有的按鈕,TextViews等都應該可以通過包/標識符進行識別。查看'UiSelector'類和[在Android文檔中]的'resourceId(String resourceId)'方法(http://developer.android.com/tools/help/uiautomator/UiSelector.html#resourceId(java.lang。字符串)使用'uiautomatorviewer'查看這些資源ID –

+0

現在,這非常有趣,我們還沒有使用API​​ 18,所以我現在還不能使用它,但是這樣看起來好像是 – steveha

1

您可以獲取上下文:

val context = InstrumentationRegistry.getTargetContext() 

,然後在你的測試:

context.getString(R.string.more_options) 
+0

我不知道爲什麼沒有人贊成這個asnwer。 – CoderSpinoza