سؤال

هل هناك أي طريقة لإجراء اختبارات جماعية في Junit ، حتى أتمكن من تشغيل بعض المجموعات فقط؟

أم أنه من الممكن التعليق على بعض الاختبارات ثم تعطيلها عالميًا؟

أنا استخدم Junit 4, ، لا يمكنني استخدام testng.

تعديل: Runwith و SuiteClasses يعمل بشكل رائع. ولكن هل من الممكن التعليق مثل هذا فقط بعض الاختبارات في فئة الاختبار؟ أو هل يجب علي التعليق على فئة اختبار كاملة؟

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

المحلول

هل تريد تجميع اختبارات داخل فئة اختبار أم تريد تجميع فصول الاختبار؟ سأفترض هذا الأخير.

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

بشكل عام ، ما أقوم به هو أن لدي شجرة من أجنحة الاختبار. يبدو جناح اختبار في Junit 4 شيئًا مثل:

 @RunWith(Suite.class)
 @SuiteClasses(SomeUnitTest1.class, SomeUnitTest2.class)
 public class UnitTestsSuite {
 }

لذلك ، ربما يكون لديّ اختبار وظيفي و unittessuite ، ثم alltestsuite الذي يتضمن اثنين آخرين. إذا قمت بتشغيلها في Eclipse ، فستحصل على منظر هرمي لطيف للغاية.

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

نصائح أخرى

Junit 4.8 يدعم التجميع:

public interface SlowTests {}
public interface IntegrationTests extends SlowTests {}
public interface PerformanceTests extends SlowTests {}

وثم...

public class AccountTest {

    @Test
    @Category(IntegrationTests.class)
    public void thisTestWillTakeSomeTime() {
        ...
    }

    @Test
    @Category(IntegrationTests.class)
    public void thisTestWillTakeEvenLonger() {
        ...
    }

    @Test
    public void thisOneIsRealFast() {
        ...
    }
}

و اخيرا،

@RunWith(Categories.class)
@ExcludeCategory(SlowTests.class)
@SuiteClasses( { AccountTest.class, ClientTest.class })
public class UnitTestSuite {}

مأخوذة من هنا: http://weblogs.java.net/blog/johnsmart/archive/2010/04/25/grouping-tests-using-junit-catevories-0

أيضا ، Arquillian نفسه يدعم التجميع:https://github.com/weld/core/blob/master/tests-arquillian/src/test/java/org/jboss/weld/tests/categories.java

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

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

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

private class CustomRunner implements Runner
 private Runner runner;

    public CustomRunner(Class<?> klass, RunnerBuilder builder) throws Throwable {
        if (!isRunCustomTests()) {
            runner = new IgnoredClassRunner(klass);
        } else {
            runner = getAppropriateRunnerForClass(klass, builder);
    }

    public Description getDescription() {
        return runner.getDescription();
    }

    public void run(RunNotifier notifier) {
        runner.run(notifier);
    }
}

تحرير: علامة Runwith تعمل فقط لفئة كاملة. تتمثل إحدى الطرق في العمل حول هذا القيد على نقل أساليب الاختبار إلى فئة داخلية ثابتة وتوضيح ذلك. وبهذه الطريقة لديك ميزة التعليق التوضيحي مع تنظيم الفصل. ولكن ، لن يساعد ذلك في أي علامات @beforeClass ، سيتعين عليك إعادة إنشاء تلك الموجودة في الفصل الداخلي. يمكن أن يطلق على طريقة الفئة الخارجية ، ولكن يجب أن يكون لها طريقة خاصة بها.

محاولة مجموعات اختبار Junit. من الوثائق:

@TestGroup("integration")
public class MyIntegrationTest {
   @ClassRule
   public static TestGroupRule rule = new TestGroupRule();

   ...
}
  • تنفيذ مجموعة اختبار بسيطة: -dtestGroup = التكامل
  • تنفيذ مجموعات اختبار متعددة: -dtestGroup = Group1 ، Group2
  • تنفيذ جميع مجموعات الاختبار: -dtestGroup = الكل

في Junit 5 يمكنك الإعلان @Tag للاختبارات تصفية ، إما في فئة أو مستوى الطريقة ؛ مماثل لاختبار المجموعات في testng أو الفئات في Junit 4

من جافادوك :

تُستخدم العلامات لتصفية الاختبارات التي يتم تنفيذها لخطة اختبار معينة. على سبيل المثال ، يجوز لفريق التطوير علامة الاختبارات بقيم مثل "Fast" ، "Slow" ، "CI-Server" ، وما إلى ذلك ، ثم توفير قائمة من العلامات التي سيتم استخدامها لخطة الاختبار الحالية ، والتي يحتمل أن تعتمد على التيار بيئة.

على سبيل المثال ، يمكنك إعلان فئة اختبار مع أ "slow" @Tag سيتم مورث ذلك لجميع الطرق وتجاوزها لبعض الطرق إذا لزم الأمر:

import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;

@Tag("slow") 
public class FooTest{

   // 
   @Test
   void loadManyThings(){ 
        ...
   }

   @Test
   void loadManyManyThings(){ 
        ...
   }


   @Test
   @Tag("fast")
   void loadFewThings(){ 
        ...
   }

}

يمكنك تطبيق نفس المنطق لفئات الاختبار الأخرى.
وبهذه الطريقة ، تنتمي فئات الاختبار (والطرق أيضًا) إلى علامة محددة.

كممارسة جيدة بدلاً من النسخ واللصق @Tag("fast") و @Tag("slow") خلال فئات الاختبار ، يمكنك إنشاء تعليقات مخصصة مخصصة.
فمثلا :

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.junit.jupiter.api.Tag;

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Tag("slow")
public @interface Slow {
}

واستخدمها على النحو التالي:

@Test
@Slow
void slowProcessing(){ 
    ...
}   

لتمكين أو تعطيل الاختبار المميز بعلامة محددة أثناء تنفيذ النص ، يمكنك الاعتماد على وثائق Maven-Surefire-Plugin :

لتضمين العلامات أو تعبيرات العلامات ، استخدم groups.

لاستبعاد العلامات أو تعبيرات العلامات ، استخدم أيضًا excludedGroups.

ما عليك سوى تكوين POM.xml الخاص بك المكون الإضافي وفقًا لمتطلباتك (مثال على المستند):

 <build>
     <plugins>
         ...
         <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-surefire-plugin</artifactId>
             <version>2.22.0</version>
             <configuration>
                 <groups>acceptance | !feature-a</groups>
                 <excludedGroups>integration, regression</excludedGroups>
             </configuration>
         </plugin>
     </plugins> 
</build> 

للحصول على معلومات اختبار وثائق الهدف لم يتم تحديثه.

يمكنك إنشاء اختبار جناح الكائنات التي تحتوي على مجموعات من الاختبارات. بدلاً من ذلك ، قد يكون لدى IDE (مثل Eclipse) دعمًا لتشغيل جميع الاختبارات الواردة في حزمة معينة.

يمكنك استخدام مجموعة الاختبار (http://qaautomated.blogspot.in/2016/09/junit-test-suits-and-test-execution.html) أو يمكنك فئات Junit (http://qaautomated.blogspot.in/2016/09/junit-catevories.html) لتجميع حالات الاختبار الخاصة بك بفعالية.

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