سؤال

أقوم بإجراء بعض اختبارات JUnit على تطبيقاتي.يحتوي كل اختبار على طريقة استدعاء حلقة for 10000 مرة.تنتج الطرق التي تم اختبارها الكثير من السجلات.يتم أيضًا جمع هذه السجلات تلقائيًا بواسطة JUnit كمخرجات اختبار.يأخذ هذا الموقف OutOfMemoryError لأن المخزن المؤقت للسلسلة حيث يحتفظ JUnit بالإخراج يصبح كبيرًا جدًا.لا أحتاج إلى هذه السجلات أثناء الاختبارات، لذا إذا كانت هناك طريقة لإخبار JUnit "لا تحتفظ بمخرجات البرنامج" فسيكون ذلك كافيًا.أيه أفكار؟

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

المحلول

ما نوع التسجيل الذي تستخدمه؟هل هناك طريقة يمكنك من خلالها تجاوز سلوك التسجيل الافتراضي لتجاهل كافة رسائل السجل؟

نصائح أخرى

بعض الخيارات:

  1. قم بتغيير التسجيل الخاص بك بحيث يتم تفريغه إلى ملف بدلاً من الإخراج القياسي.
  2. زيادة الحد الأقصى لحجم الكومة مع -Xmx <some number>M, ، يحب -Xmx 256M.

وأود فقط زيادة الذاكرة المتوفرة..حاول إضافة -Xmx256m -Xmx256m إلى جهاز VM الخاص بك.

كان الحل هو تجاوز خصائص التسجيل.لقد قمت الآن بتعطيل التسجيل ويبدو أن كل شيء يعمل (لا يزال الاختبار قيد التشغيل).إذا نجح الأمر، فسوف أقوم بتكوين طريقة لتسجيل الدخول إلى ملف.شكرًا للجميع (وتهانينا لجيف والأصدقاء على هذا الموقع).

أرى أنه قد تم قبول الإجابة بالفعل، ولكن إليك ما كنت سأرسله لو كنت قد كتبته واختبرته بشكل أسرع:

إذا كنت تقصد بكلمة "تسجيل" System.out.println() أو System.err.println()، وإذا كنت متأكدًا من أن الاختبار الخاص بك لا يحتاج حقًا إلى السجلات، فيمكنك إعادة توجيه stdout وstderr برمجيًا.

// Save the original stdout and stderr
PrintStream psOut = System.out;
PrintStream psErr = System.err;
PrintStream psDevNull = null;
try
{
    // Send stdout and stderr to /dev/null
    psDevNull = new PrintStream(new ByteArrayOutputStream());
    System.setOut(psDevNull);
    System.setErr(psDevNull);
    // run tests in loop
    for (...)
    {
    }
}
finally
{
    // Restore stdout and stderr
    System.setOut(psOut);
    System.setErr(psErr);
    if (psDevNull != null)
    {
        psDevNull.close();
        psDevNull = null;
    }
}

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

ant test &> /dev/null

تؤدي إعادة توجيه سطر الأوامر إلى إعادة توجيه جميع مخرجات Ant/JUnit، وليس فقط ما يأتي من الفصل الذي تختبره، لذلك ربما لا يكون هذا ما تريده.تؤدي إعادة التوجيه البرمجي إلى إعادة توجيه عمليات الطباعة/الكتابة إلى System.out وSystem.err في برنامجك فقط، وستظل تحصل على الإخراج من Ant وJUnit.

إذا كان هناك أي مساعدة، فإن تعيينputtoformatters='no' يحل جميع مشكلات الذاكرة الخاصة بي (في Ant 1.7.1، يمنع هذا إرسال الإخراج الناتج عن الاختبارات إلى منسقي الاختبار).

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