Android Instrumentation测试脱机案例

时间:2014-12-23 13:03:43

标签: android android-testing

对于我的仪器测试,我使用的是Robotium。大多数情况下,我能够测试除离线情况之外的所有内容。

一旦我禁用数据(使用adb,仿真器中的F8快捷键等等),测试就会断开连接。它在设备/模拟器中继续,但没有报告结果。

所以,我有一个想法,只将应用程序放在离线模式而不是整个设备。问题是我不知道如何......

使用iptablesApi我需要root设备。我已经读过Mobiwol应用程序使用某种VPN来限制应用程序的互联网访问,而无需生根设备。

问题 Mobiwol应用如何阻止每个应用的互联网连接?或者还有其他方法可以离线测试apks吗?

2014年12月30日编辑

我忘了说我可以脱机运行测试,但是当设备处于脱机状态时我必须开始测试。目前,我将测试分为OFFLINE和ONLINE。运行在线后,我执行着名的adb kill-serveradb start-server。之后我执行OFFLINEs。

5 个答案:

答案 0 :(得分:5)

只是提出一些建议,因为这里似乎有不同的问题。 1)如果您想要做的只是在运行OFFLINE测试用例之前关闭数据,您可能只想尝试使用robotium本身。

实施例: 对于WiFi:

WifiManager wifi=(WifiManager)solo.getCurrentActivity().getSystemService(Context.WIFI_SERVICE);
wifi.setWifiEnabled(false);

对于移动数据(使用反射):

ConnectivityManager dataManager=(ConnectivityManager)solo.getCurrentActivity().getSystemService(Context.CONNECTIVITY_SERVICE);

Method dataClass = ConnectivityManager.class.getDeclaredMethod(“setMobileDataEnabled”, boolean.class);
dataClass.setAccessible(true);
dataClass.invoke(dataManager, true);

在OFFLINE套件中运行单个测试用例之前,您可以使用setup()方法执行上述两个调用。 完成OFFLINE套件中的所有测试用例后,您可以在最后使用teardown()方法重新启用WiFi / DATA。

2)看看你在OP中发布的应用程序,它似乎就是这样:

  • 使用基于操作系统版本的ipTables

  • 根据所有应用程序的UID创建脚本标题 需要WiFi /数据

  • 应该在设备上获取已安装应用的列表 包管理器中的任何隐藏应用程序等。

  • 并再次根据黑名单和用户选择执行脚本 用所需的用户覆盖ipTable中的现有规则 规则。

非常肯定虽然一定很难对所有这些进行编码。但是以子弹点的形式更容易听到。

希望这对你有所帮助。

P.S:如果你确实想出了什么,请发一个更新的答案,想知道你是如何让它运作的

更新: 确保您拥有在应用程序清单中开启/关闭WiFi /数据的必要权限。 测试apk清单。 它可以成为应用程序清单本身。 有这个图书馆可以帮助你。它是独奏的延伸。 http://adventuresinqa.com/2014/02/17/extsolo-library-to-extend-your-robotium-test-automation/

答案 1 :(得分:2)

LinkedIn Test Butler有很棒的图书馆,只需拨打电话即可启用,禁用WiFi和移动数据:

TestButler.setGsmState(false);
TestButler.setWifiState(false);

此库的主要优点是它不需要您的清单中的任何权限,有关详细信息,请参阅项目网站:

https://github.com/linkedin/test-butler

答案 2 :(得分:1)

很抱歉,如果我过于简单化了,那么只需将手机/模拟器置于飞行模式下即可?通过实际的用户界面。这就是我测试脱机案例的方法。

答案 3 :(得分:0)

经过数小时的尝试,类似于user2511882的解决方案,但由于缺少权限(启用了“修改系统设置”权限),我仍然有一个例外。

我最终使用UI自动器完成了该操作:

public static void setAirplaneMode(boolean enable)
{
    if ((enable ? 1 : 0) == Settings.System.getInt(getInstrumentation().getContext().getContentResolver(),
            Settings.Global.AIRPLANE_MODE_ON, 0))
    {
        return;
    }
    UiDevice device = UiDevice.getInstance(getInstrumentation());
    device.openQuickSettings();
    // Find the text of your language
    BySelector description = By.desc("Airplane mode");
    // Need to wait for the button, as the opening of quick settings is animated.
    device.wait(Until.hasObject(description), 500);
    device.findObject(description).click();
    getInstrumentation().getContext().sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
}

您将在androidTest清单文件中需要ACCESS_NETWORK_STATE:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

别忘了在测试后禁用它。

如果您使用的语言不是英语,则需要将“飞行模式”更改为您的语言文字。由于我进行了几种翻译,因此我是从资源字符串中读取的。

答案 4 :(得分:0)

由于@user2511882 的回答,您可以通过以下方式在 Android X 测试 中使用 Application context 而不是 Activity:

<nav>
  <span>One</span>
  <span>Two</span>
  <span>Three</span>
  <span>Four</span>
  <span>Five</span>
  <span>Six</span>
  <span>Seven</span>
</nav>

<div>Some other text. The quick brown fox jumps over the lazy dog.</div>
<块引用>

考虑到此方法仅适用于 API <= 28。还有其他方法,例如使用 UI AutomatorAPI > 28