4

我正在使用 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 解决方案为此,可能涉及从应用程序的源目录中抓取已编译的文件。

4

3 回答 3

6

您可以获得上下文:

val context = InstrumentationRegistry.getTargetContext()

然后在你的测试中:

context.getString(R.string.more_options)
于 2017-08-01T11:01:04.643 回答
3

我通常通过资源 ID 定位 UI 元素。这些是相当静态的。我错过了什么吗?

于 2013-10-07T18:16:22.710 回答
2

我遇到了类似的问题。我最终在 Java 中为所有字符串文字创建了一个静态哈希映射。所以我有不同语言的文件,它们具有相同的键和它们的本地化值。

然后编写了一个模块来在运行时操作设备语言,并为一个键返回相应的本地化值。

于 2013-10-08T18:34:13.697 回答