سؤال

لدي حالة غير عادية أقوم باختبارها.أنا أستخدم قهوة الإسبريسو لكتابة اختباراتي.أعلم أن Espresso وInstrumentationTestCase ليس المقصود منهما القيام بذلك.

لدي مستمع قمت بإنشائه في أحد فصولي والذي سيُعلمني بتغيير قيمة معينة.أستخدم المستمع في مجموعة الاختبار الخاصة بي.

عندما أحصل على القيمة من المستمع، أحتاج إلى تأكيد أن القيمة قد تغيرت على هذا النحو.

مشكلتي هي أن الاختبار سينتهي قبل أن أتلقى القيمة من المستمع.

    private void sendSpeedChanges() {
    setStaticSpeed(new Random().nextInt(10) + 2);
    try {
        runTestOnUiThread(new Runnable() {
            @Override
            public void run() {
                consoleActivity.onSpeedChanged(getStaticSpeed(), false);
            }
        });
    } catch (Throwable throwable) {
        throwable.printStackTrace();
    }

}

private void createSpeedDelegate() {
    EspressoMachineValues.setOnSpeedChangeListener(new EspressoMachineValues.OnSpeedChangeListener() {
        @Override
        public void onSpeedChanged(double speed) {
            //assert speed is correct.
            assertTrue(getStaticSpeed() == speed);
        }
    });

}

هذه هي الطريقتين التي أستخدمها.ال createSpeedDelegate() هو الدعوة في البداية.ثم أتصل sendSpeedChanges.أحتاج إلى القيام بهذا المبلغ X من المرات.


ملحوظة:

  • يستغرق استرداد المعلومات حوالي 200 مللي ثانية (في المتوسط).
  • أنا غير قادر على الاتصال sendSpeedChanges() حتى قمت بالتحقق من القيمة onSpeedChange()
  • لا أستطيع استخدام Thread.sleep(); لأن المستمع على الموضوع الرئيسي.

لقد حاولت إضافة أ getInstrumentation().wait(2000); و أيضا getInstrumentation().waitForIdleSync(); ومن الواضح أن لا يعمل.

في عالم مثالي، سأفعل هذا:

   for (int i = 0; i < 42; i++) {
        sendSpeedChanges();
        i++;
    }

لكن هذا لن ينتظر حتى يتم التحقق من القيمة.وإذا انتظرت القيمة، يعتقد القائم بالاختبار أن جميع الاختبارات قد تمت وانتهت.

سؤالي هو، هل ستكون هناك طريقة للتحكم عند انتهاء الاختبار؟رغم اختباراتي يظهر أن يتم.

هل كانت مفيدة؟

المحلول

في الاختبار الخاص بك، ستحتاج إلى إنشاء بيان تحكم يبقي هذا الاختبار قيد التشغيل طالما كنت تريد تشغيله.

while(myTestNeedsToRun) {
    if(speedChangeReceived) {
        sendSpeedChange();
        speedChangeReceived = false;
    }
}

private void createSpeedDelegate() {
   EspressoMachineValues.setOnSpeedChangeListener(new EspressoMachineValues.OnSpeedChangeListener() {
    @Override
    public void onSpeedChanged(double speed) {
        //assert speed is correct.
        assertTrue(getStaticSpeed() == speed);
        speedChangedReceived = true;
    }
});

بمجرد أن تقرر الانتهاء من إجراء الاختبار الخاص بك، قم بتعيينه للتو myTestNeedsToRun = false وبعد ذلك سوف ينتهي الاختبار الخاص بك.

نصائح أخرى

وبدلاً من ذلك، يمكنك إنشاء IdlingResource لمراقبة سرعتك.IdlingResource هي الطريقة التي يستخدمها Espresso للتحقق من أن سلسلة المحادثات الرئيسية خاملة أو أنه لا يوجد AsyncTasks قيد التشغيل في تجمع AsyncTask.

قم بإلقاء نظرة على coutingIdlingResource فئة في كود مصدر المكتبة.يمكنك تنفيذ شيء مماثل لذلك.في حالتك، يمكن أن يكون شيء من هذا القبيل:

[...]

private int mTargetSpeed;
private volatile ResourceCallback resourceCallback;

@Override
public boolean isIdleNow() {
  boolean isIdle = false;
  if (getStaticSpeed() == mTargetSpeed) {
     isIdle = true;
     resourceCallback.onTransitionToIdle();
  } else {
     isIdle = false;
  }

  return isIdle;
}

في اختباراتك، كلما أردت الانتظار حتى تصل السرعة إلى المستوى المطلوب، عليك القيام بما يلي:

[...]
SpeedIdlingResource speedIdlingResource = new SpeedIdlingResource ("my_idling_resource");
Espresso.registerIdlingResources(speedIdlingResource);

بهذه الطريقة، سيتم حظر Espresso حتى يخبر المورد الخامل إطار العمل بأن جهاز SpeedMonitor الخاص بك خامل.يعد هذا أمرًا جيدًا لأنك تستفيد من إطار عمل مزامنة Espresso بالكامل لمراقبة وقت وصولك إلى السرعة المستهدفة، وبالتالي ستكون اختباراتك أكثر موثوقية وأسرع من الانتظار المزدحم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top