هل يمكنني قصر إخراج تغطية الأنف على الدليل (بدلاً من الحزمة)؟

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

سؤال

يبدو SUT الخاص بي كما يلي:

foo.py
bar.py
tests/__init__.py [empty]
tests/foo_tests.py
tests/bar_tests.py
tests/integration/__init__.py [empty]
tests/integration/foo_tests.py
tests/integration/bar_tests.py

عندما أركض nosetests --with-coverage, ، أحصل على تفاصيل لجميع أنواع الوحدات النمطية التي أفضل تجاهلها.ولكن لا أستطيع استخدام--cover-package=PACKAGE الخيار بسبب foo.py & bar.py ليسوا في حزمة.(راجع الموضوع بعدhttp://lists.idyll.org/pipermail/testing-in-python/2008-November/001091.htmlلأسباب عدم وضعها في حزمة.)

هل يمكنني قصر مخرجات التغطية على foo.py & bar.py فقط؟

تحديث - على افتراض أنه لا يوجد إجابة أفضل من ناديهأدناه، لقد طرحت سؤال متابعة: "كيف أكتب بعض البرامج النصية (bash) Shell لتحويل جميع أسماء الملفات المطابقة في الدليل إلى خيارات سطر الأوامر؟"

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

المحلول

ويمكنك استخدامه مثل هذا:

--cover-package=foo --cover-package=bar

وكان لي نظرة سريعة على شفرة المصدر الأنف للتأكيد: <لأ href = "https://github.com/nose-devs/nose/blob/master/nose/plugins/cover.py" يختلط = "noreferrer "> هذا هو خط

    if options.cover_packages:
        for pkgs in [tolist(x) for x in options.cover_packages]:

نصائح أخرى

ويمكنك استخدام:

--cover-package=.

وأو حتى تعيين متغير البيئة

NOSE_COVER_PACKAGE=.

واختبار مع الأنف 1.1.2

لدي الكثير من ملفات/حزم Python عالية المستوى وأجد أنه من المزعج إدراجها جميعًا يدويًا باستخدام --cover-package، لذلك قمت بإنشاء اسمين مستعارين لنفسي.الاسم المستعار nosetests_cover سيتم تشغيل التغطية مع جميع ملفات/حزم Python ذات المستوى الأعلى المدرجة في --cover-package.الاسم المستعار nosetests_cover_sort سيفعل الشيء نفسه وسيقوم أيضًا بفرز نتائجك حسب نسبة التغطية.

nosetests_cover_cmd="nosetests --with-coverage --cover-erase --cover-inclusive --cover-package=\$( ls | sed -r 's/[.]py$//' | fgrep -v '.' | paste -s -d ',' )"
alias nosetests_cover=$nosetests_cover_cmd
alias nosetests_cover_sort="$nosetests_cover_cmd 2>&1 | fgrep '%' | sort -nr -k 4"

ملحوظات:

  • هذا من ملفي .bashrc.قم بالتعديل بشكل مناسب إذا كنت لا تستخدم bash.
  • ويجب تشغيلها من دليل المستوى الأعلى لديك.وإلا فإن أسماء الحزم ستكون غير صحيحة وستفشل التغطية بصمت في معالجتها (أي.بدلاً من إخبارك بأن --cover-package الخاص بك غير صحيح، سيتصرف وكأنك لم توفر الخيار على الإطلاق).
  • أستخدم حاليًا Python 2.7.6 على Ubuntu 13.10، مع إصدار الأنف 1.3.0 وإصدار التغطية 3.7.1.هذا هو الإعداد الوحيد الذي اختبرت فيه هذه الأوامر.
  • أثناء استخدامك، قم بإزالة --cover-erase و --cover-inclusive إذا لم يتوافقا مع احتياجاتك.
  • إذا كنت تريد الفرز بالترتيب العادي بدلاً من الترتيب العكسي، فاستبدله -nr مع -n في أمر الفرز.
  • تفترض هذه الأوامر أن جميع ملفات/حزم Python ذات المستوى الأعلى تمت تسميتها بدون نقطة (بخلاف النقطة في ".py").إذا لم يكن هذا صحيحًا بالنسبة لك، فاقرأ قسم التفاصيل أدناه لفهم أجزاء الأمر، ثم قم بتعديل الأوامر حسب الاقتضاء.

تفاصيل:

لا أدعي أن هذه هي الأوامر الأكثر فعالية لتحقيق النتائج التي أريدها.إنها مجرد أوامر تصادف أنني توصلت إليها.= ف

الشيء الرئيسي الذي يجب شرحه هو الحجة الخاصة بـ --cover-package.يقوم بإنشاء قائمة مفصولة بفواصل لأسماء ملفات/حزمة Python ذات المستوى الأعلى (مع إزالة ".py" من أسماء الملفات) على النحو التالي:

  • \$ - يهرب من $ حرف في سلسلة ذات علامات اقتباس مزدوجة.
  • $( ) - إدراج نتيجة الأمر الموجود بداخله.
  • ls - يسرد جميع الأسماء في الدليل الحالي (يجب أن يكون دليل Python عالي المستوى).
  • | sed -r 's/[.]py$//' -- في القائمة، يتم استبدال "foo_bar.py" بـ "foo_bar".
  • | fgrep -v '.' - في القائمة، تتم إزالة جميع الأسماء التي لا تحتوي على نقطة (على سبيل المثال:يزيل foo_bar.pyc وnotes.txt).
  • | paste -s -d ',' - تغيير القائمة من مفصولة بالسطر الجديد إلى مفصولة بفاصلة.

يجب أن أشرح الفرز أيضًا.

  • 2>&1 - ينضم إلى stderr وstdout.
  • | fgrep '%' - يزيل كافة خطوط الإخراج بدون أ % شخصية.
  • | sort -nr -k 4 - فرز الأسطر المتبقية بترتيب رقمي عكسي حسب العمود الرابع (وهو عمود نسبة التغطية).إذا كنت تريد الترتيب العادي بدلاً من الترتيب العكسي، فاستبدله -nr مع -n.

أمل أن هذا يساعد شخصاما!=)

إذا كنت تستخدم تغطية: الحمر 3.0 ، ثم التعليمات البرمجية في الدليل بيثون هو تجاهل افتراضيا، بما في ذلك المكتبة القياسية وجميع الحزم المثبتة.

وأود أن تفعل هذا:

nosetests --with-coverage --cover-package=foo,bar tests/*

وأنا أفضل هذا الحل للآخرين اقترح. انها بسيطة لكنها كنت صريحا حول أي حزم كنت ترغب في أن يكون تغطية ل. الجواب نادية ينطوي على الكثير كتابة أكثر زائدة عن الحاجة، والإجابة ستيوارت تستخدم سد والتي لا تزال تخلق مجموعة من خلال التذرع touch __init__.py، و --cover-package=. لا يعمل بالنسبة لي.

لأي شخص يحاول القيام بذلك مع setup.cfg، الأعمال التالية. كان لي بعض صعوبة في معرفة كيفية تحديد حزم متعددة.

[nosetests]
with-coverage=1
cover-html=1
cover-package=module1,module2
touch __init__.py; nosetests --with-coverage --cover-package=`pwd | sed 's@.*/@@g'`

ويمكنك تحسين إجابة مقبولة مثل ذلك --cover-package=foo,bar

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