对于我的仪器测试,我使用的是Robotium。大多数情况下,我能够测试除离线情况之外的所有内容。
一旦我禁用数据(使用adb,仿真器中的F8快捷键等等),测试就会断开连接。它在设备/模拟器中继续,但没有报告结果。
所以,我有一个想法,只将应用程序放在离线模式而不是整个设备。问题是我不知道如何......
使用iptablesApi我需要root设备。我已经读过Mobiwol应用程序使用某种VPN来限制应用程序的互联网访问,而无需生根设备。
问题 Mobiwol应用如何阻止每个应用的互联网连接?或者还有其他方法可以离线测试apks吗?
2014年12月30日编辑
我忘了说我可以脱机运行测试,但是当设备处于脱机状态时我必须开始测试。目前,我将测试分为OFFLINE和ONLINE。运行在线后,我执行着名的adb kill-server
和adb start-server
。之后我执行OFFLINEs。
答案 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);
此库的主要优点是它不需要您的清单中的任何权限,有关详细信息,请参阅项目网站:
答案 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 Automator 或 API > 28