كيف يمكنني تشغيل كل JUnit وحدة الاختبارات باستثناء تلك التي تنتهي في "IntegrationTest" في IntelliJ فكرة المشروع باستخدام اختبار متكاملة عداء ؟

StackOverflow https://stackoverflow.com/questions/176913

سؤال

أنا في الأساس تريد تشغيل جميع JUnit وحدة اختبارات في IntelliJ فكرة المشروع (باستثناء JUnit اختبارات التكامل) ، وذلك باستخدام ثابت جناح() طريقة JUnit.لماذا استخدام ثابت جناح() الأسلوب ؟ لأنه لا يمكن بعد ذلك استخدام IntelliJ IDEA JUnit اختبار عداء لتشغيل كل وحدة الاختبارات في طلبي (و بسهولة استبعاد جميع اختبارات التكامل من خلال تسمية الاتفاقية).مدونة حتى الآن يبدو مثل هذا:

package com.acme;

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class AllUnitTests extends TestCase {

    public static Test suite() {
        List classes = getUnitTestClasses();
        return createTestSuite(classes);
    }

    private static List getUnitTestClasses() {
        List classes = new ArrayList();
        classes.add(CalculatorTest.class);
        return classes;
    }

    private static TestSuite createTestSuite(List allClasses) {
        TestSuite suite = new TestSuite("All Unit Tests");
        for (Iterator i = allClasses.iterator(); i.hasNext();) {
            suite.addTestSuite((Class<? extends TestCase>) i.next());
        }
        return suite;
    }

}

طريقة getUnitTestClasses() يجب أن تكون إعادة كتابة لإضافة كل مشروع فصول تمتد TestCase إلا إذا كان اسم الفئة ينتهي في "IntegrationTest".

وأنا أعلم أنني يمكن أن تفعل هذا بسهولة في مخضرم على سبيل المثال, ولكن أنا بحاجة إلى أن تفعل ذلك في IntelliJ IDEA لذا يمكن استخدام اختبار متكاملة عداء - أحب شريط أخضر :)

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

المحلول

لقد كتبت بعض التعليمات البرمجية للقيام بمعظم العمل.أنها لا تعمل إلا إذا كان لديك ملفات على القرص المحلي بدلا من جرة.كل ما تحتاجه هو فئة واحدة في الحزمة.يمكنك لهذا الغرض ، إنشاء Locator.java الدرجة فقط أن تكون قادرة على العثور على الحزمة.

public class ClassEnumerator {
    public static void main(String[] args) throws ClassNotFoundException {
        List<Class<?>> list = listClassesInSamePackage(Locator.class, true);

        System.out.println(list);
    }

    private static List<Class<?>> listClassesInSamePackage(Class<?> locator, boolean includeLocator) 
                                                                      throws ClassNotFoundException {

        File packageFile = getPackageFile(locator);

        String ignore = includeLocator ? null : locator.getSimpleName() + ".class";

        return toClassList(locator.getPackage().getName(), listClassNames(packageFile, ignore));
    }

    private static File getPackageFile(Class<?> locator) {
        URL url = locator.getClassLoader().getResource(locator.getName().replace(".", "/") + ".class");
        if (url == null) {
            throw new RuntimeException("Cannot locate " + Locator.class.getName());
        }

        try {
        return new File(url.toURI()).getParentFile();
        }
        catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }
    }

    private static String[] listClassNames(File packageFile, final String ignore) {
        return packageFile.list(new FilenameFilter(){
            @Override
            public boolean accept(File dir, String name) {
                if (name.equals(ignore)) {
                    return false;
                }
                return name.endsWith(".class");
            }
        });
    }

    private static List<Class<?>> toClassList(String packageName, String[] classNames)
                                                             throws ClassNotFoundException {

        List<Class<?>> result = new ArrayList<Class<?>>(classNames.length);
        for (String className : classNames) {
            // Strip the .class
            String simpleName = className.substring(0, className.length() - 6);

            result.add(Class.forName(packageName + "." + simpleName));
        }
        return result;
    }
}

نصائح أخرى

حول كيفية وضع كل مجموعة رئيسية من junit الاختبارات في الجذر الحزمة.يمكنني استخدام هذه الحزمة هيكل في المشروع:

test.
  quick.
    com.acme
  slow.
    com.acme

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

ماذا عن استخدام JUnit4 و جناح-عداء ؟

على سبيل المثال:

@RunWith(Suite.class)
@Suite.SuiteClasses({
UserUnitTest.class,
AnotherUnitTest.class
})
public class UnitTestSuite {}

أنا جعلت قذيفة صغيرة-نصي تجد كل وحدة الاختبارات وآخر إلى إيجاد التكامل-الاختبارات.إلقاء نظرة على بلدي بلوق دخول:http://blog.timomeinen.de/2010/02/find-all-junit-tests-in-a-project/

إذا كنت تستخدم الربيع TestContext يمكنك استخدام @IfProfile الشرح تعلن الاختبارات المختلفة.

مع أطيب التحيات ، تيمو Meinen

الربيع نفذت ممتازة classpath وظيفة البحث في PathMatchingResourcePatternResolver.إذا كنت تستخدم classpath*:بادئة يمكنك أن تجد جميع الموارد ، بما في ذلك دروس في التسلسل الهرمي ، وحتى تصفية لهم إذا كنت تريد.ثم يمكنك استخدام الأطفال من AbstractTypeHierarchyTraversingFilter, AnnotationTypeFilter و AssignableTypeFilter إلى تصفية تلك الموارد سواء على مستوى الصف الشروح أو على واجهات تنفيذها.

http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/core/io/support/PathMatchingResourcePatternResolver.html

http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/core/type/filter/AbstractTypeHierarchyTraversingFilter.html

الحل: https://github.com/MichaelTamm/junit-toolbox
استخدام الميزات التالية

@RunWith(WildcardPatternSuite.class)
@SuiteClasses({"**/*.class", "!**/*IntegrationTest.class"})
public class AllTestsExceptionIntegrationSuit {
}

على افتراض انك بعد تسمية نمط حيث التكامل اختبارات نهاية في ...IntegrationTest ويمكنك وضع الملف في الأعلى حزمة (حتى **/*.فئة البحث سيكون لديك فرصة لالتقاط جميع الاختبارات الخاصة بك)

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