java - طريقة سهلة لتشغيل اختبار junit نفسه مرارا وتكرارا؟




5 Answers

الطريقة الأسهل (كما في أقل كمية من الكود الجديد المطلوب) هي أن تقوم بإجراء الاختبار كاختبار parametrized ( @RunWith(Parameterized.class) مع @RunWith(Parameterized.class) وإضافة طريقة لتوفير 10 معلمات فارغة). وبهذه الطريقة ، سيتم تشغيل الاختبار 10 مرات.

يجب أن يكون هذا الاختبار هو الاختبار الوحيد في الفصل ، أو يجب وضع جميع طرق الاختبار بشكل أفضل 10 مرات في الفصل.

هنا مثال:

@RunWith(Parameterized.class)
public class RunTenTimes {

    @Parameterized.Parameters
    public static Object[][] data() {
        return new Object[10][0];
    }

    public RunTenTimes() {
    }

    @Test
    public void runsTenTimes() {
        System.out.println("run");
    }
}

مع ما سبق ، من الممكن حتى القيام بذلك باستخدام منشئ أقل معلمة ، لكنني لست متأكداً مما إذا كان مؤلفو إطار العمل يقصدون ذلك ، أو ما إذا كان ذلك سوف ينكسر في المستقبل.

إذا كنت تقوم بتنفيذ العداء الخاص بك ، فيمكنك تشغيل العداء 10 مرات. إذا كنت تستخدم @Rule لجهة خارجية ، فيمكنك باستخدام التعليقات التوضيحية @Rule الجديدة وتطبيق واجهة MethodRule بحيث تأخذ العبارة MethodRule 10 مرات في حلقة for. العيب الحالي في هذا الأسلوب هو أن @After و @After يتم @After مرة واحدة فقط. من المحتمل أن يتغير هذا في الإصدار التالي من JUnit (سيتم تشغيل @Rule بعد @Rule ) ، ولكن بغض النظر عن أنك @Rule على نفس مثيل الكائن (شيء غير صحيح من العداء Parameterized ). هذا يفترض أن أي عداء تقوم بتشغيله مع فئة يتعرف بشكل صحيح على التعليقات التوضيحية لـ @Rule . هذا هو الحال فقط إذا كان المفوض إلى المتسابقين JUnit.

إذا كنت تعمل مع عداء مخصص لا يتعرف على التعليق التوضيحي لـ @Rule ، فأنت فعليًا عالقًا في أن @Rule على @Rule الخاص الذي يفوضه بشكل مناسب إلى Runner ويديرها 10 مرات.

لاحظ أن هناك طرقًا أخرى لحل هذه المشكلة (مثل نظريات النظريات) ولكنها تتطلب كلًا عداءًا. للأسف JUnit لا يدعم حاليا طبقات من المتسابقين. هذا هو العداء الذي سلاسل المتسابقين الآخرين.

مثل العنوان يقول ، أنا أبحث عن طريقة بسيطة لتشغيل اختبارات JUnit 4.x عدة مرات في صف تلقائيا باستخدام Eclipse.

مثال على ذلك هو تشغيل الاختبار نفسه 10 مرات في صف واحد والإبلاغ عن النتيجة.

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

الحل المثالي هو أن يكون البرنامج المساعد / الإعداد / الميزة Eclipse التي لا أعلم عنها.




مستوحاة من هذا الحل :

استخدم @Repeat annotation مثل هذا:

public class MyTestClass {

    @Rule
    public RepeatRule repeatRule = new RepeatRule();

    @Test
    @Repeat(10)
    public void testMyCode() {
        //your test code goes here
    }
}

ستحتاج فقط إلى هاتين الفئتين:

Repeat.java:

import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.METHOD;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention( RetentionPolicy.RUNTIME )
@Target({ METHOD, ANNOTATION_TYPE })
public @interface Repeat {
    int value() default 1;
}

RepeatRule.java:

import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;

public class RepeatRule implements TestRule {

    private static class RepeatStatement extends Statement {
        private final Statement statement;
        private final int repeat;    

        public RepeatStatement(Statement statement, int repeat) {
            this.statement = statement;
            this.repeat = repeat;
        }

        @Override
        public void evaluate() throws Throwable {
            for (int i = 0; i < repeat; i++) {
                statement.evaluate();
            }
        }

    }

    @Override
    public Statement apply(Statement statement, Description description) {
        Statement result = statement;
        Repeat repeat = description.getAnnotation(Repeat.class);
        if (repeat != null) {
            int times = repeat.value();
            result = new RepeatStatement(statement, times);
        }
        return result;
    }
}

2016-10-25 تعديل: لاستخدام هذا الحل عند استخدام @RunWith(PowerMockRunner.class) ، قم بتحديث إلى Powermock 1.6.5 ( والذي يتضمن هذا التصحيح ).




مع JUnit 5 تمكنت من حل هذه المشكلة باستخدام التعليق @RepeatedTest :

@RepeatedTest(10)
public void testMyCode() {
    //your test code goes here
}

لاحظ أنه لا ينبغي استخدام التعليق التوضيحي لـ @RepeatedTest مع @RepeatedTest .




هذا يعمل أسهل بكثير بالنسبة لي.

public class RepeatTests extends TestCase {

    public static Test suite() {
        TestSuite suite = new TestSuite(RepeatTests.class.getName());

        for (int i = 0; i < 10; i++) {              
        suite.addTestSuite(YourTest.class);             
        }

        return suite;
    }
}



أبني وحدة تسمح بإجراء هذا النوع من الاختبارات. لكنه يركز ليس فقط في تكرار. ولكن في ضمان أن بعض قطعة من رمز الخيط الآمن.

https://github.com/anderson-marques/concurrent-testing

اعتمادية مخضرم:

<dependency>
    <groupId>org.lite</groupId>
    <artifactId>concurrent-testing</artifactId>
    <version>1.0.0</version>
</dependency>

مثال على الاستخدام:

package org.lite.concurrent.testing;

import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import ConcurrentTest;
import ConcurrentTestsRule;

/**
 * Concurrent tests examples
 */
public class ExampleTest {

    /**
     * Create a new TestRule that will be applied to all tests
     */
    @Rule
    public ConcurrentTestsRule ct = ConcurrentTestsRule.silentTests();

    /**
     * Tests using 10 threads and make 20 requests. This means until 10 simultaneous requests.
     */
    @Test
    @ConcurrentTest(requests = 20, threads = 10)
    public void testConcurrentExecutionSuccess(){
        Assert.assertTrue(true);
    }

    /**
     * Tests using 10 threads and make 20 requests. This means until 10 simultaneous requests.
     */
    @Test
    @ConcurrentTest(requests = 200, threads = 10, timeoutMillis = 100)
    public void testConcurrentExecutionSuccessWaitOnly100Millissecond(){
    }

    @Test(expected = RuntimeException.class)
    @ConcurrentTest(requests = 3)
    public void testConcurrentExecutionFail(){
        throw new RuntimeException("Fail");
    }
}

هذا هو مشروع مفتوح المصدر. لا تتردد في تحسين.




Related

java eclipse junit