gpt4 book ai didi

android - Espresso 如何等待一段时间(1 小时)?

转载 作者:IT老高 更新时间:2023-10-28 23:37:58 25 4
gpt4 key购买 nike

在我的测试用例中,我必须记录 1 小时,在 robotium solo.sleep(600000) 中完成了我的工作,但在 espresso 中,我对 IdlingResource 概念感到困惑。我必须开始录制并等待一段时间(取决于测试类型)15 分钟、60 分钟等。

robotium 中的等效代码

    solo.clickOnView(solo.getView("start_record"));
solo.sleep(duration * 60 * 1000);
solo.clickOnView(solo.getView("stop_record"));

我尝试在 espresso 中这样使用它

@RunWith(AndroidJUnit4.class)
@SmallTest
public class AaEspressoTest {

private static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME = "com.absd.rec.RecorderActivity";
private static Class<?> launcherActivityClass;
private Solo solo;
private static CoreRecordingTest skyroTestRunner;


private static Class<? extends Activity> activityClass;

static {
try {
activityClass = (Class<? extends Activity>) Class.forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}

@Rule
public final ActivityTestRule<?> activityRule
= new ActivityTestRule<>(activityClass);

private IntentServiceIdlingResource idlingResource;

@Before
public void registerIntentServiceIdlingResource() {
Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
idlingResource = new IntentServiceIdlingResource(instrumentation.getTargetContext());
Espresso.registerIdlingResources(idlingResource);
}

@After
public void unregisterIntentServiceIdlingResource() {
Espresso.unregisterIdlingResources(idlingResource);
}

@Test
public void testHello() throws Exception {

onView(withId(AaEspressoTest.getId("recorderpage_record"))).perform(click());

registerIntentServiceIdlingResource();

onView(withId(AaEspressoTest.getId("recorderpage_stop"))).perform(click());

}
}

闲置资源

public class IntentServiceIdlingResource implements IdlingResource {
private final Context context;
private ResourceCallback resourceCallback;
public static boolean status = false;

public IntentServiceIdlingResource(Context context) {
this.context = context;
}

@Override
public String getName() {
return IntentServiceIdlingResource.class.getName();
}

@Override
public boolean isIdleNow() {
return getTimer();
}

@Override
public void registerIdleTransitionCallback(ResourceCallback resourceCallback) {
this.resourceCallback = resourceCallback;

}

private static boolean getTimer() {

new CountDownTimer(5000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
// Do Nothing
status = false;
}

@Override
public void onFinish() {
status = true;
}
};
return status;
}
}

异常(exception):

android.support.test.espresso.IdlingResourceTimeoutException: Wait for [com.adbs.recorder.IntentServiceIdlingResource] to become idle timed out

最佳答案

您需要一个带有 isIdleNow()IdlingResource,它仅在经过特定时间后才返回 true。为此,请保存开始时间并将其与当前时间进行比较:

public class ElapsedTimeIdlingResource implements IdlingResource {
private final long startTime;
private final long waitingTime;
private ResourceCallback resourceCallback;

public ElapsedTimeIdlingResource(long waitingTime) {
this.startTime = System.currentTimeMillis();
this.waitingTime = waitingTime;
}

@Override
public String getName() {
return ElapsedTimeIdlingResource.class.getName() + ":" + waitingTime;
}

@Override
public boolean isIdleNow() {
long elapsed = System.currentTimeMillis() - startTime;
boolean idle = (elapsed >= waitingTime);
if (idle) {
resourceCallback.onTransitionToIdle();
}
return idle;
}

@Override
public void registerIdleTransitionCallback(
ResourceCallback resourceCallback) {
this.resourceCallback = resourceCallback;
}
}

在您的测试中创建并注册此空闲资源:

@Test
public static void waitForOneHour() {
long waitingTime = DateUtils.HOUR_IN_MILLIS;

// Start
onView(withId(AaEspressoTest.getId("recorderpage_record")))
.perform(click());

// Make sure Espresso does not time out
IdlingPolicies.setMasterPolicyTimeout(
waitingTime * 2, TimeUnit.MILLISECONDS);
IdlingPolicies.setIdlingResourceTimeout(
waitingTime * 2, TimeUnit.MILLISECONDS);

// Now we wait
IdlingResource idlingResource = new ElapsedTimeIdlingResource(waitingTime);
Espresso.registerIdlingResources(idlingResource);

// Stop
onView(withId(AaEspressoTest.getId("recorderpage_stop")))
.perform(click());

// Clean up
Espresso.unregisterIdlingResources(idlingResource);
}

您需要调用 setMasterPolicyTimeoutsetIdlingResourceTimeout 来确保 Espresso 不会因超时而终止测试。

完整示例:https://github.com/chiuki/espresso-samples/tree/master/idling-resource-elapsed-time

关于android - Espresso 如何等待一段时间(1 小时)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30155227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com