2015-05-10 13 views
13

Trong trường hợp thử nghiệm của tôi, tôi phải ghi lại trong 1 giờ, trong robotium solo.sleep (600000) đã thực hiện công việc của tôi, nhưng trong espresso tôi đang bối rối với khái niệm IdlingResource. Tôi phải bắt đầu ghi âm và chờ đợi một thời gian (tùy thuộc vào loại thử nghiệm) 15mins, 60mins, vvEspresso cách đợi một thời gian (1 giờ)?

mã tương đương trong robotium

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

Tôi cố gắng để sử dụng nó như thế này trong 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()); 

    } 
} 

chạy không tải tài nguyên

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; 
} 
} 

Ngoại lệ:

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

Trả lời

32

Bạn cần một IdlingResource với một isIdleNow() trả true chỉ khi số tiền cụ thể thời gian đã trôi qua. Để đạt được điều đó, tiết kiệm thời gian bắt đầu và so sánh nó với thời gian hiện tại:

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; 
    } 
} 

Tạo và đăng ký nguồn idling này trong thử nghiệm của bạn:

@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); 
} 

Bạn cần setMasterPolicyTimeoutsetIdlingResourceTimeout cuộc gọi để đảm bảo Espresso không chấm dứt kiểm tra do hết thời gian.

Full dụ: https://github.com/chiuki/espresso-samples/tree/master/idling-resource-elapsed-time

+1

Cách tiếp cận này không hoạt động nếu tôi có nhiều hơn một phương pháp thử nghiệm và phải nhàn rỗi ở cuối mỗi phương pháp cho tự nhiên. Tôi sử dụng Espresso 2.x. –

+0

sử dụng 'registerIdleTransitionCallback' phương pháp này là gì và cách sử dụng? –

12

Thời gian chờ mặc định mà Espresso sẽ chờ tất cả các tài nguyên đã đăng ký trở thành không hoạt động là một phút.

Bạn có thể thay đổi điều này bằng cách sử dụng lớp IdlingPolicies để thiết lập một thời gian chờ rõ ràng:

IdlingPolicies.setIdlingResourceTimeout(1, TimeUnit.HOURS); 
+0

Cũng có thể cần 'IdlingPolicies.setMasterPolicyTimeout (1, TimeUnit.HOURS); 'để ngăn chặn' AppNotIdleException'. – Travis

Các vấn đề liên quan