我想知道,在仪器测试执行期间是否存在与系统通信的任何方式。 例如: 我有一个带有红外端口的手机。我可以通过私有SDK使用它,我也可以用我的应用程序调整它。在我的Instrumentation测试用例中,我想要在测试单独测试执行之前根据外部事件测试应用程序行为 它看起来像
@Test
public void test() throws Exception {
setupExternalCondition(condition1_ON); // setup external transiver
assertNotNull(IR.read());
assertTrue(assertIR.write());
setupExternalCondition(condition1_OFF);
assertNotNull(IR.read());
assertFalse(IR.write());
}
这是一个非常简单的例子,但有很多"条件"和sdk更新频率到高。我无法手动完成所有这些验证,也无法询问" transiver& SDK团队"制作一个模拟状态列表,仅用于编写覆盖单元测试。因此,我想以某种方式将外部组件执行注入TestRuner,以便在本地计算机(或CI计算机)上接收事件(或测试用例执行前的testName)以设置外部条件。
简单的解决方案(我认为)在appUnderTest上运行tcp服务器并请求外部条件更改 - 我不确定是否可能,并且不确定稳定连接(wifi),因此可能是做adb。
有什么建议吗?
P.S:测试设备具有root权限。
答案 0 :(得分:0)
所以,找到不错但不理想的解决方案。 仍然等待更好的主张,如果不是,这个答案对某人有帮助; 为了在本地机器和AndroidJUnitTest之间“构建桥梁”,我将下一个类添加到测试中:
class IPCServiceBridge extends BroadcastReceiver {
private static final String FILTER_ID = "IPC_SERVICE";
private static IPCServiceBridge sInstance;
private boolean mIsPermitted;
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("ipc.service.action")) {
mIsPermitted = true;
}
}
public static IPCServiceBridge getInstance() {
if (sInstance == null) {
sInstance = new IPCServiceBridge();
IntentFilter filter = new IntentFilter();
filter.addAction("ipc.service.action");
Context context = InstrumentationRegistry.getContext();
context.registerReceiver(sInstance, filter);
}
return sInstance;
}
public void sendIpcCommand(String commandName) {
try {
int i = 30;
mIsPermitted = false;
while (i > 0) {
pub("request:" + commandName);
Thread.sleep(1000);
if (mIsPermitted) {
break;
}
i--;
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
if (!mIsPermitted) {
throw new RuntimeException("IPC service does not respond");
}
}
private static void pub(String msg) {
Log.e(FILTER_ID, msg);
}
}
我启动adb logcat -s“filter_name”,解析并检查应该对InsttUnit测试应用哪个条件。当条件准备就绪时,我发回广播接收器并采取必要的行动。
@Test
public void test2() throws Exception {
IPCServiceBridge.getInstance().sendIpcCommand("CONDITION#123");
}
工作得很好,但我不确定它会非常稳定。