سؤال

لسبب ما لا يمكنني الحصول على البرنامج المساعد Maven 2 Surefire لتنفيذ فئة اختبار Junit 4.

public class SimpleTest {
  @org.junit.Test
  public void simple() {
     System.out.println("foo");
  }
}

ولكن إذا قمت بتغيير هذه الفئة ليكون Junit-3 مثل، مثل

public class SimpleTest extends junit.framework.TestCase {
  public void testBar() {
     System.out.println("bar");
  }

  @org.junit.Test
  public void simple() {
     System.out.println("foo");
  }
}

ثم يتم تنفيذها. إليك ما فعلته:

  • التحقق من الإصدار: Apache Maven 2.2.1 (R801777؛ 2009-08-06 20: 16: 01 + 0100)
  • نسخة موثوقة Surefire: تمت متابعة هذه النصيحة
  • التحقق من مؤكدا مؤكدا: تم التحقق من الجرار Surefire في بلدي ~/.m2/repository/org/apache/maven/surefire - كل منهم إما الإصدار 2.4.2 أو 2.4.3
  • القيام به mvn dependency:tree | grep junit للتأكد من أنني أعتمد فقط على إصدار Junit 4.7

الوحدة التي أواجهها هذه المشكلة ليس لها اختبارات جاريت 3.

هل هناك أي شيء آخر أنا في عداد المفقودين؟

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

المحلول

mvn -X ساعدني في الكشف عن ما يلي:

...
[INFO] [surefire:test {execution: default-test}]
[DEBUG] dummy:dummy:jar:1.0 (selected for null)
[DEBUG]   org.apache.maven.surefire:surefire-booter:jar:2.4.3:runtime (selected for runtime)
[DEBUG]     org.apache.maven.surefire:surefire-api:jar:2.4.3:runtime (selected for runtime)
[DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/org/apache/maven/surefire/surefire-booter/2.4.3/surefire-booter-2.4.3.jar
[DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/org/apache/maven/surefire/surefire-api/2.4.3/surefire-api-2.4.3.jar
[DEBUG] dummy:dummy:jar:1.0 (selected for null)
[DEBUG]   org.testng:testng:jar:jdk15:5.8:test (selected for test)
[DEBUG]     junit:junit:jar:3.8.1:test (selected for test)
[DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/org/testng/testng/5.8/testng-5.8-jdk15.jar
[DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/junit/junit/3.8.1/junit-3.8.1.jar
[DEBUG] dummy:dummy:jar:1.0 (selected for null)
[DEBUG] Retrieving parent-POM: org.apache.maven.surefire:surefire-providers:pom:2.4.3 for project: null:surefire-testng:jar:null from the repository.
[DEBUG] Adding managed dependencies for unknown:surefire-testng
[DEBUG]   org.apache.maven.surefire:surefire-api:jar:2.4.3
[DEBUG]   org.apache.maven.surefire:surefire-booter:jar:2.4.3
[DEBUG]   org.codehaus.plexus:plexus-utils:jar:1.5.1
[DEBUG]   org.apache.maven.surefire:surefire-testng:jar:2.4.3:test (selected for test)
[DEBUG]     org.apache.maven:maven-artifact:jar:2.0:test (selected for test)
[DEBUG]       org.codehaus.plexus:plexus-utils:jar:1.0.4:test (selected for test)
[DEBUG]     junit:junit:jar:3.8.1:test (selected for test)
[DEBUG]     org.testng:testng:jar:jdk15:5.7:test (selected for test)
[DEBUG]     org.apache.maven.surefire:surefire-api:jar:2.4.3:test (selected for test)
...
[DEBUG] Test Classpath :
...
[DEBUG]   /home/mindas/.m2/repository/junit/junit/4.7/junit-4.7.jar

لذلك يبدو أن المشكلة قادم من testng جرة تتطلب جونيت v3.8.1. بالرغم من Test Classpath تم ضبطه على الاعتماد على Junit 4، لقد فات الأوان.

testng كان التبعية موجودة في بلدي بوم:

<dependency>
  <groupId>org.testng</groupId>
  <artifactId>testng</artifactId>
  <version>5.8</version>
  <scope>test</scope>
  <classifier>jdk15</classifier>
</dependency>

مباشرة بعد أن علقت بها، بدأت الاختبارات في التنفيذ.

الدروس المستفادة:

  • mvn dependency:tree ليس دائما ما يكفي، mvn -X هو صديق.
  • Surefire غير مصنوع للمطور الجنة (لقد أدركت ذلك أثناء النظر في مشروع JIRA Project). هذا صحيح بشكل خاص لأنه لا توجد بدائل أخرى إذا كنت تستخدم Maven.

بفضل الجميع لمساعدتكم. لسوء الحظ، لا توجد وسيلة لتقسيم نقاط الإجابة بين Pascal و Kaleb، لكن نصيحة Kaleb للاستخدام mvn -X ساعدني في الحصول على المسار الصحيح، لذا فإن نقاط الإجابة الصحيحة تذهب إليه.

نصائح أخرى

أرقام البرنامج المساعد SUTFRIRE الذي يجب استخدام مزود Junit بناء على ClassPath. إذا كانت هناك إصدارات جاريت متعددة على ClassPath، فيمكنك إما تصحيح ClassPath للحصول على إصدار Junit واحد فقط على ClassPath (كما تمت مناقشته أعلاه)، أو يمكنك تحديد مزود تريد الاستخدام بشكل صريح. على سبيل المثال، تحديد ما يلي في قوات POM (الأصل) باستخدام أحدث مزود (على سبيل المثال، "Surefire-Junit47"):

[...]
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.8</version>
  <dependencies>
    <!-- Force using the latest JUnit 47 provider -->
    <dependency>
      <groupId>org.apache.maven.surefire</groupId>
      <artifactId>surefire-junit47</artifactId>
      <version>2.8</version>
    </dependency>
  </dependencies>
[...]

ملاحظة ومع ذلك، فقد غيرت Surefire 2.7 الطريقة التي يحددها تحديد فئات اختبار الوحدات. السلوك الجديد عند استخدام Surefire 2.7 (أو الأحدث) مع Junit 4 هو أن أي اختبار بدون توضيحية @ Stest سيتم تخطيها تلقائيا. قد يكون هذا رائعا إذا كان لديك اختبارات Junit 4 وحدة، ولكن إذا كان لديك مزيج من اختبارات Junit 3 و 4 Unit Unit، فلن يعمل موفر "Surefire-Junit47" على العمل بشكل صحيح. في مثل هذه الحالات، من الأفضل اختيار مزود "Surefire-Junit4" بشكل صريح:

[...]
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.8</version>
  <dependencies>
    <dependency>
      <groupId>org.apache.maven.surefire</groupId>
      <!-- Use the older JUnit 4 provider -->
      <artifactId>surefire-junit4</artifactId>
      <version>2.8</version>
    </dependency>
  </dependencies>
[...]

لا أعرف ما تقصده "لا يمكن التنفيذ"، ولكن هل يساعد ذلك بشكل صريح في تعيين الأساس الذي يستخدمه maven-surefire-plugin?

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.4.3</version>
    <configuration>
        <includes>
            <include>**/*Test.java</include>
        </includes>
    </configuration>
</plugin>

أيضا، يقومون بتشغيل Maven مع -X علم تقديم أي معلومات مفيدة؟

يمكن أن يكون سبب واحد ممكن هذا الخطأ (مغلقا "لن إصلاح"): https://issues.apache.org/jira/browse/surefire-587.

Summary Summary: لا يتم التقاط اختبارات تمديد اختبار (ولكن غير استخدام التعليقات التوضيحية) إذا كان اسمهم لا ينتهي ب "اختبار".

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

لدي كل من Junit و TESTNG كعائم. لكنني أريد failsafe لتشغيل اختباراتي الوظيفية باستخدام Testng و Surefire لتشغيل اختبارات وحدتي باستخدام Junit.

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

في وقت لاحق صادفت هذا القضية مافن وتكوين Surefire لتشغيل اختبارات "Junit" فقط مثل هذا:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <properties>
      <property>
        <name>junit</name>
        <value>true</value>
      </property>
    </properties>
  </configuration>
</plugin>

أمل أن هذا يساعد شخصاما.

من أجل الاستفادة من Googleers، عندما كان لدي هذه المشكلة، كان ذلك لأنني أدرج اعتمادا على Testng

لقد استخدمت علامة التبويب "التسلسل الهرمي" M2ECLIPSE من محرر POM للعثور على التبعية والنقر بزر الماوس الأيمن لتوليد الاستبعاد (انظر XML أدناه).

للتأكد من اكتمال (ولأولئك الذين لا يستخدمون M2ECLIPSE) إليك XML التي تستثني الاعتماد - جئت فقط عبر هذه الميزة من Maven عن طريق رؤية هذه العلامات التي تم إنشاؤها تلقائيا:

<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-mockito-release-full</artifactId>
  <version>1.4.9</version>
  <classifier>full</classifier>
  <exclusions>
    <exclusion>
      <artifactId>powermock-module-testng</artifactId>
      <groupId>org.powermock</groupId>
    </exclusion>
  </exclusions>
</dependency>

(في حالتي، باستثناء "powermock-module-testng" كان كافيا، ولكن يمكنك استبعاد TESTNG مباشرة إذا كانت تأتي من مكان آخر.)

التحقق الذي قمت به جيدا، لا سيما التحقق من أنك تستخدم الإصدار 2.3+ من البرنامج المساعد Surefire (افتراضيا، ستحصل على الإصدار 2.4.3 مع Maven 2.1 سوبر بوم لذلك يجب أن يكون هذا موافق) والتحقق من أنك لا تسحب junit-3.8.1.jar الاعتماد على نطاق واسع.

الآن، فقط للتحقق من صحة هذه ليست "مشكلة عالمية" (لا أعتقد ذلك حتى TBH)، هل يمكن أن تنشئ مشروعا من نقطة الصفر، على سبيل المثال عن طريق تشغيل:

mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=maven-junit4-testcase

ثم قم بتحديث تبعية Junit:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.7</version>
  <scope>test</scope>
</dependency>

وتكوين مستوى المحول البرمجي لمدة 1.5+

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <source>1.5</source>
    <target>1.5</target>
  </configuration>
</plugin>

أخيرا وضعت الخاص بك SimpleTest.java بجوار AppTest.java و اهرب mvn test.

إذا كان يعمل mvn test يعمل بشكل جيد لهذا المشروع (وأتوقع أن يتم تشغيله دون مشكلة)، هل يمكن أن يرجى تحديث سؤالك مع تكوين POM الذي تستخدمه (من المشروع الذي يمتلك مشاكل)؟

واحد تغيير صغير ساعدني بشكل فادح !!!

لقد غيرت اسم الفصل من MyClasstest إلى TestMyclass، لقد حصلت على هذه الفكرة بعد Veryfing My Prother Pom.xml يحتوي على خط أدناه

<test.include.pattern> **/Test*.java <test.include.pattern/>

1.) تشمل متابعة البرنامج المساعد Surefire في Pom.xml

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20</version>
<configuration>
</configuration>
</plugin>

2.) بواسطة برنامج Surefire Plugin Surefire يختار اختبار فئة من الحزمة: - SRC / اختبار / Java / ....

لذا انتقل إلى بناء المسار وتشمل مجلد الاختبار في ClassPath مثل أدناه:

enter image description here enter image description here

3.) الذهاب إلى -> تشغيل كما -> اختبار مين

[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.081 
s - in com.bnym.dcm.api.controller.AccountControllerTest
[INFO] Running com.bnym.dcm.api.controller.DCMApiControllerTest
[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 s - 
in com.bnym.dcm.api.controller.DCMApiControllerTest
[INFO] 
[INFO] Results:
[INFO] 
[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0
[INFO] 
[INFO] ----------------------------------------------------------------------
--
[INFO] BUILD SUCCESS

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

هل قمت بتكوين البرنامج المساعد الخاص ب Maven-Compile الخاص بك لمستوى المحول البرمجي الصحيح، مثل:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <source>1.5</source>
    <target>1.5</target>
  </configuration>
</plugin>

وإلا فإن مافن سيكون له مشكلة في التعليقات التوضيحية

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