كيف يمكنني تشغيل جميع اختبارات Junit برمجيا في تطبيق Java الخاص بي؟

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

  •  18-09-2019
  •  | 
  •  

سؤال

من Eclipse، يمكنني تشغيل جميع اختبارات Junit بسهولة في طلبي.

أرغب في أن أكون قادرا على تشغيل الاختبارات على النظم المستهدفة من جرة التطبيق، دون الكسوف (أو النملة أو الأداة أو أي أداة تطوير أخرى).

أستطيع أن أرى كيفية تشغيل اختبار أو مجموعة محددة من سطر الأوامر.

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

يحتوي Eclipse Junit Plugin على معالج لإنشاء مجموعة اختبار، ولكن لسبب ما لا "ترى" فئات الاختبار الخاصة بي. قد تبحث عن اختبارات Junit 3، وليس Junit 4 اختبارات مشروحة.

يمكنني كتابة أداة من شأنها إنشاء الجناح تلقائيا عن طريق مسح الملفات المصدر.

أو يمكنني كتابة التعليمات البرمجية بحيث سيقوم التطبيق بمسح ملف JAR الخاص به للاختبارات (إما عن طريق تسمية الاتفاقية أو عن طريق البحث عن التعليقات التوضيحية

يبدو أن هناك يجب أن تكون هناك طريقة أسهل. ماذا ينقصني؟

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

المحلول 2

ركضت مشكلة بسيطة مع الحل الأخير. إذا ركضت "جميع الاختبارات" من الكسوف، فقد ركضوا مرتين لأنهم هبطوا الاختبارات الفردية والجناح. كان بإمكاني العمل حوله، ولكن بعد ذلك أدركت أنه كان هناك حل أبسط:

package suneido;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

public class RunAllTests {

    public static void run(String jarfile) {
        String[] tests = findTests(jarfile);
        org.junit.runner.JUnitCore.main(tests);
    }

    private static String[] findTests(String jarfile) {
        ArrayList<String> tests = new ArrayList<String>();
        try {
            JarFile jf = new JarFile(jarfile);
            for (Enumeration<JarEntry> e = jf.entries(); e.hasMoreElements();) {
                String name = e.nextElement().getName();
                if (name.startsWith("suneido/") && name.endsWith("Test.class")
                        && !name.contains("$"))
                    tests.add(name.replaceAll("/", ".")
                            .substring(0, name.length() - 6));
            }
            jf.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return tests.toArray(new String[0]);
    }

    public static void main(String[] args) {
        run("jsuneido.jar");
    }

}

نصائح أخرى

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

مرتكز على http://burtbeckwith.com/blog/؟p=52. لقد توصلت إلى ما يلي. يبدو انه يشتغل جيدا.

يمكنني تشغيله من داخل التعليمات البرمجية الخاصة بي مع:

org.junit.runner.JUnitCore.main("suneido.AllTestsSuite");

نقطة ضعف واحدة هي أنه يعتمد على اتفاقية التسمية ("اختبار" لاحقة) لتحديد الاختبارات. نقطة ضعف أخرى هي أن اسم ملف جرة مشفرة بجد.

package suneido;

import java.io.IOException;
import java.lang.reflect.Modifier;
import java.util.*;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.model.InitializationError;

/**
 * Discovers all JUnit tests in a jar file and runs them in a suite.
 */
@RunWith(AllTestsSuite.AllTestsRunner.class)
public final class AllTestsSuite {
    private final static String JARFILE = "jsuneido.jar";

    private AllTestsSuite() {
    }

    public static class AllTestsRunner extends Suite {

        public AllTestsRunner(final Class<?> clazz) throws InitializationError {
            super(clazz, findClasses());
        }

        private static Class<?>[] findClasses() {
            List<String> classFiles = new ArrayList<String>();
            findClasses(classFiles);
            List<Class<?>> classes = convertToClasses(classFiles);
            return classes.toArray(new Class[classes.size()]);
        }

        private static void findClasses(final List<String> classFiles) {
            JarFile jf;
            try {
                jf = new JarFile(JARFILE);
                for (Enumeration<JarEntry> e = jf.entries(); e.hasMoreElements();) {
                    String name = e.nextElement().getName();
                    if (name.startsWith("suneido/") && name.endsWith("Test.class")
                            && !name.contains("$"))
                        classFiles.add(name.replaceAll("/", ".")
                                .substring(0, name.length() - 6));
                }
                jf.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }

        private static List<Class<?>> convertToClasses(
                final List<String> classFiles) {
            List<Class<?>> classes = new ArrayList<Class<?>>();
            for (String name : classFiles) {
                Class<?> c;
                try {
                    c = Class.forName(name);
                }
                catch (ClassNotFoundException e) {
                    throw new AssertionError(e);
                }
                if (!Modifier.isAbstract(c.getModifiers())) {
                    classes.add(c);
                }
            }
            return classes;
        }
    }

}

لم أحاول ذلك حتى الآن، لكنه جاء عبر هذا بلوق مؤخرا: http://burtbeckwith.com/blog/؟p=52.

يوفر المؤلف فئة تكتشف كل ما تبذلونه من المقارض ويديرها، لذلك إذا فتحت هذا في مشروعك، فقد يوفر القدرة المطلوبة؟

أتمنى أن يساعدك هذا.

احصل على مشروع Java ونقل المشروع

JUnitLaunchShortcut jUnitLaunchShortcut = new JUnitLaunchShortcut();
jUnitLaunchShortcut.launch("Pass the Java Project containing JUnits Classes", "run");

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

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