كيف يمكنني أن أجعل Cobertura/Emma يلعب بشكل جيد مع تطبيق Eclipse؟

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

سؤال

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

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

يبدو أنني يجب أن أكون قادرًا على تصدير المنتج لتطبيق الاختبار، وتجهيزه بأداة التغطية التي أختارها، ثم تشغيله؛ومع ذلك، يبدو أن أدوات التغطية ترغب في معرفة مسار الفصل الدراسي بأكمله الذي تتعامل معه.هل من الممكن جعل أي من هذه الأدوات تعمل بشكل جيد دون البحث في مساحة عمل البناء بالكامل عن الجرار والتبعيات؟

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

المحلول

تمكنت من تشغيل كل شيء بمساعدة سؤال SO الأقدم.

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

لقد أوصلتنا بعض الأدلة الجنائية في Google إلى ذلك مقتطف من هذا الكتاب, ، والذي يغطي بشكل مناسب التسلسل الهرمي لمحمل فئة OSGi.وذلك بإضافة osgi.parentClassloader=app سطرًا إلى ملف config.ini الخاص بتطبيق الاختبار الجاري تشغيله، يمكننا تحديد مسار فئة في سطر الأوامر.يجب أن يتضمن مسار الفصل هذا ما يلي:

  • الكسوف startup.jar
  • جرارات Java SDK التي يستخدمها التطبيق
  • الجرار الخاصة بأداة التغطية

وبطبيعة الحال، كنا نجري الاختبارات عبر <java jar="foo.jar"> مهمة النملة، والتي تتجاهل بصمت أي معلومات مسار الفصل التي تقدمها وتستخدم الجرة فقط.بعد أن جعلنا Emma تعمل، انتقلنا إلى Cobertura، ويبدو نص Ant النهائي (مختصر قليلاً ومجهول المصدر) كما يلي:

<target name="generate.coverage" depends="buckminster.init">
  <!-- Generate the classpath. -->
  <path id="cobertura.classpath">
    <fileset dir="${tasks.dir}/lib/cobertura">
      <include name="cobertura.jar" />
      <include name="**/*.jar" />
    </fileset>
  </path>
  <taskdef classpathref="cobertura.classpath" resource="tasks.properties" />

  <!-- Get ready to run the unit tests app, and delete old coverage data. -->
  <unzip src="${test-app.artifact}" dest="${output.dir}" overwrite="true" />
  <delete file="${output.dir}/cobertura.ser" />

  <!-- Instrument the jars in-place. Make sure to only capture what you want instrumented! -->
  <cobertura-instrument datafile="${output.dir}/cobertura.ser">
    <fileset dir="${output.dir}/test-app/plugins">
      <include name="**/*our.company_*.jar" />
    </fileset>
  </cobertura-instrument>

  <!-- Run the unit test application, by classname rather than by jar. -->
  <java fork="true" classname="org.eclipse.equinox.launcher.Main" logerror="true" failonerror="true" maxmemory="1G">
    <classpath>
      <pathelement location="${output.dir}/test-app/startup.jar" />
      <pathelement location="${tasks.dir}/lib/cobertura/cobertura.jar" />
      <fileset dir="${tasks.dir}/lib/cobertura">
        <include name="**/*.jar" />
      </fileset>
      <pathelement location="${java.class.path}" />
    </classpath>
    <sysproperty key="net.sourceforge.cobertura.datafile" file="${output.dir}/cobertura.ser" />            
    <arg value="-data" />
    <arg value="${output.dir}/test-app/workspace" />
    <arg value="--formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter:${log.dir}/test-results.xml" />
  </java>

  <!-- Generate the coverage reports. -->
  <cobertura-report format="html" datafile="${output.dir}/cobertura.ser" destdir="${output.dir}/cobertura-report">
    <fileset dir="${workspace.dir}/plugins">
      <include name="**/*.java" />
    </fileset>
  </cobertura-report>
</target>

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

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