سؤال

أنا أستخدم JUnit 4.4 وMaven ولدي عدد كبير من اختبارات التكامل طويلة الأمد.

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

أعتقد حقًا أنه سيكون حلاً أكثر نظافة لتشغيل فئات اختبار X مختلفة في سلاسل X بالتوازي.لدي مئات الاختبارات لذا لا أهتم حقًا بربط فصول الاختبار الفردية.

هل هناك أي طريقة للقيام بذلك؟

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

المحلول 2

ومن أداة JUnit 4.7 انها من الممكن الآن لتشغيل الاختبارات بالتوازي دون استخدام TestNG. في الواقع أصبح من الممكن منذ 4.6، ولكن هناك عدد من الحلول التي تبذل في 4.7 من شأنها أن تجعل منه خيارا قابلا للتطبيق. يمكنك أيضا إجراء اختبارات متوازية مع الربيع، والتي يمكنك أن تقرأ عن <لأ href = "http://incodewetrustinc.blogspot.com/2009/07/run-your-junit-tests-in-parallel-with.html" يختلط = "noreferrer"> هنا

نصائح أخرى

استخدم مخضرم المساعد:

<build>
    <plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.7.1</version>
        <configuration>
            <parallel>classes</parallel>
            <threadCount>5</threadCount>
        </configuration>
    </plugin>
    </plugins>
</build>

مستوحاة من تجربة JUnit ParallelComputer عداء لقد بنيت بلدي ParallelSuite و ParallelParameterized العدائين.باستخدام هؤلاء المتسابقين، يمكن للمرء بسهولة موازاة مجموعات الاختبار والاختبارات ذات المعلمات.

ParallelSuite.java

public class ParallelSuite extends Suite {

    public ParallelSuite(Class<?> klass, RunnerBuilder builder) throws InitializationError {

        super(klass, builder);

        setScheduler(new RunnerScheduler() {

            private final ExecutorService service = Executors.newFixedThreadPool(4);

            public void schedule(Runnable childStatement) {
                service.submit(childStatement);
            }

            public void finished() {
                try {
                    service.shutdown();
                    service.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
                } catch (InterruptedException e) {
                    e.printStackTrace(System.err);
                }
            }
        });
    }
}

ParallelParameterized.java

public class ParallelParameterized extends Parameterized {

    public ParallelParameterized(Class<?> arg0) throws Throwable {

        super(arg0);

        setScheduler(new RunnerScheduler() {

            private final ExecutorService service = Executors.newFixedThreadPool(8);

            public void schedule(Runnable childStatement) {
                service.submit(childStatement);
            }

            public void finished() {
                try {
                    service.shutdown();
                    service.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
                } catch (InterruptedException e) {
                    e.printStackTrace(System.err);
                }
            }
        });
    }
}

الاستخدام بسيط.فقط تغير @إركض مع قيمة التعليقات التوضيحية لأحد هذه موازي* الطبقات.

@RunWith(ParallelSuite.class)
@SuiteClasses({ATest.class, BTest.class, CTest.class})
public class ABCSuite {}

تيمبوس-fugit تقدم شيئا من هذا القبيل، والتحقق من مستندات للحصول على التفاصيل. وهي تعتمد على أداة JUnit 4.7 وكنت للتو بمناسبة اختبار ل@RunWith(ConcurrentTestRunner).

وهتاف

TestNG تستطيع أن تفعل ذلك (وهذا كان أول رد فعل لي - ثم رأيت كنت تواجه بالفعل الكثير من testcases).

لأداة JUnit، والنظر في موازية أداة JUnit .

ويمكنك التحقق من مكتبة مفتوحة المصدر - اختبار موازن . وهو يفعل بالضبط ما تسأل عنه - تشغيل الطبقات اختبار مختلفة في نفس الوقت. هذا يدمج في مستوى النمل أداة JUnit بحيث لم يكن لديك لتغيير الاختبارات الخاصة بك في أي حال. أنا واحد من الكتاب من المكتبة.

وأيضا، والتفكير لا يعمل منهم في المواضيع كما قد تحتاج رمل مستوى العملية. على سبيل المثال، إذا كنت ضرب DB في اختبارات التكامل الخاص بك، فإنك لا تريد اختبار واحد إلى فشل بسبب اختبار آخر إضافة بعض البيانات في موضوع مختلف. أكثر من مرة، لا يتم كتابة التجارب مع هذا في الاعتبار.

وأخيرا، كيف تم حل هذه المشكلة حتى الآن؟

ويمكنك تشغيل الاختبارات بالتوازي باستخدام ParallelComputer التي تقدمها أداة JUnit نفسها. وهنا قصاصة صغيرة للحصول على انك بدأته.

Class[] cls = { TestCase1.class, TestCase2.class };
Result result = JUnitCore.runClasses(ParallelComputer.classes(), cls);
List<Failure> failures = result.getFailures();

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

تجدر الإشارة إلى أنه سيتم تشغيل هذا كل حالات الاختبار في موازاة ذلك، إذا كان لديك أي تبعيات بين حالات الاختبار المختلفة قد يؤدي إلى ايجابيات كاذبة. يجب أن لا يكون اختبارات مترابطة على أي حال.

ويمكنك تغيير اختبار ليكون اختبار TestNg في دقيقة واحدة (تحتاج فقط إلى تغيير الواردات)، TestNG هو الأفضل في اختبار الموازي.

هل يمكن أن تحاول Gridgain التي تمكنك من تشغيل توزيع الاختبارات عبر شبكة حساب.

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