اختبار الوحدة المستمر باستخدام Pydev (Python وEclipse)

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

  •  06-07-2019
  •  | 
  •  

سؤال

هل هناك طريقة لدمج اختبارات وحدة الخلفية مع بيئة Pydev Eclipse؟

تعمل اختبارات الوحدة الخاصة بي بشكل جيد، ولكنني أرغب في دمجها للتشغيل في الخلفية بناءً على تغييرات الملف المصدر (على سبيل المثال.مع الأنف) ولدمج النتيجة مرة أخرى في Eclipse (أفكر في علامة X حمراء كبيرة عندما تفشل الاختبارات مع عرض وحدة التحكم وسجل التتبع).

لا، لا يتم احتساب موجه الأوامر الذي يعمل على الجانب.

لقد حصلت على تكامل Eclipse هذا عند تطوير عناصر RoR.

شكرًا،

تل.

يحرر: تعرف على بيديف الجديد (1.6.4) http://pydev.org/manual_adv_pyunit.html

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

المحلول

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

والإنشاء ليلا الحالي قد أدرجت هذه الميزة.

نصائح أخرى

لدى Pydev بعض التكامل مع اختبار الوحدة، ولكن هذا فقط كتكوين تشغيل... لذا...

هذه ليست طريقة أنيقة للغاية، ولكن إذا كنت:

  1. تمكين المشروع->الإنشاء تلقائيًا
  2. في خصائص مشروعك، أضف منشئًا جديدًا من النوع Program
  3. قم بتكوينه لتشغيل اختباراتك وحدد "أثناء الإنشاءات التلقائية"

ثم على الأقل سوف تحصل على شيء يقوم بإخراج نتائج الاختبار إلى وحدة التحكم عند حفظ الموارد.

لقد أدركت للتو أن PyDev يتمتع بدعم قوي للبرمجة النصية.لسوء الحظ ليس لدي الوقت للقيام بكل ذلك من أجلك (ولكن إذا أكملت هذا، يرجى نشره هنا :)

إذا قمت بإنشاء ملف اسمه pyedit_nose.py يبدو هكذا في مجلد فارغ:

assert cmd is not None
assert editor is not None

if cmd == 'onSave':
    from java.lang import Runtime
    from java.io import BufferedReader
    from java.io import InputStreamReader

    from org.eclipse.core.resources import ResourcesPlugin
    from org.eclipse.core.resources import IMarker
    from org.eclipse.core.resources import IResource

    proc = Runtime.getRuntime().exec('ls -al')
    extra_message = BufferedReader(InputStreamReader(proc.inputStream)).readLine()

    r = ResourcesPlugin.getWorkspace().getRoot()
    for marker in r.findMarkers(IMarker.PROBLEM, False, IResource.DEPTH_INFINITE):
        if marker.getAttribute(IMarker.MESSAGE).startsWith("Some test failed!"):
            marker.delete()

    for rr in r.getProjects():
        marker = rr.createMarker(IMarker.PROBLEM)
        marker.setAttribute(IMarker.MESSAGE, "Some test failed! " + extra_message)
        marker.setAttribute(IMarker.PRIORITY, IMarker.PRIORITY_HIGH)
        marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR)

وقم بإعداد Preferences->PyDev->Scripting Pydev للإشارة إلى هذا الدليل، وستحصل على علامة خطأ على جميع المشاريع في مساحة العمل الخاصة بك في كل مرة يتم فيها حفظ الملف.

من خلال تنفيذ برنامج نصي يُرجع نتائج الاختبار بتنسيق يسهل تحليله بدلاً من ذلك ls وبتحليل المخرجات، يجب أن تكون قادرًا على وضع علاماتك في الأماكن الصحيحة.

انظر هذا لبعض نقاط البداية:

  • برمجة جايثون في بيديف
  • آيماركر هو ما يمثل علامة.
  • IResource هو ما تعلق عليه علاماتك.يمكن أن تكون مساحات عمل أو مشاريع أو ملفات أو أدلة وما إلى ذلك. resource.createMarker(IMarker.PROBLEM) يخلق علامة المشكلة.
  • IProject هو نوع من IResource الذي يمثل المشروع.استخدم ال members() طريقة الحصول على المحتويات

وأنا تشغيل الاختبار باليد أول مرة (<م> تشغيل> تشغيل و> بيثون وحدة اختبار ). بعد ذلك، وأنا استخدم Ctrl+Shift+F9 أن يكون حفظ الملفات والاختبارات المنفذة، بدلا من الادخار مع Ctrl+S وتتوقع بعض السحر أن يحدث.

وتركيبة المفاتيح Ctrl+Shift+F9 سيعاد التكوين الماضي البعيد.

<القوي> تنويه : لأنا جديدة على الكسوف وبيديف، لذلك قد يكون مما يدل على شيء سخيف / واضح / خطأ

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

import os
import os.path
import sys
import stat
import time
import subprocess
from fnmatch import fnmatch


def match_patterns(pathname, patterns):
    """Returns True if the pathname matches any of the given patterns."""
    for pattern in patterns:
        if fnmatch(pathname, pattern):
            return True
    return False


def filter_paths(pathnames, patterns=["*"], ignore_patterns=[]):
    """Filters from a set of paths based on acceptable patterns and
    ignorable patterns."""
    result = []
    if patterns is None:
        patterns = []
    if ignore_patterns is None:
        ignore_patterns = []
    for path in pathnames:
        if match_patterns(path, patterns) and not match_patterns(path, ignore_patterns):
            result.append(path)
    return result


def absolute_walker(path, recursive):
    if recursive:
        walk = os.walk
    else:
        def walk(path):
            return os.walk(path).next()
    for root, directories, filenames in walk(path):
        yield root
        for directory in directories:
            yield os.path.abspath(os.path.join(root, directory))
        for filename in filenames:
            yield os.path.abspath(os.path.join(root, filename))


def glob_recursive(path, patterns=["*"], ignore_patterns=[]):
    full_paths = []
    for root, directories, filenames in os.walk(path):
        for filename in filenames:
            full_path = os.path.abspath(os.path.join(root, filename))
            full_paths.append(full_path)
    filepaths = filter_paths(full_paths, patterns, ignore_patterns)
    return filepaths


def check_sum(path='.', patterns=["*"], ignore_patterns=[]):
    sum = 0
    for f in glob_recursive(path, patterns, ignore_patterns):
        stats = os.stat(f)
        sum += stats[stat.ST_SIZE] + stats[stat.ST_MTIME]
    return sum


if __name__ == "__main__":
    if len(sys.argv) > 1:
        path = sys.argv[1]
    else:
        path = '.'

    if len(sys.argv) > 2:
        command = sys.argv[2]
    else:
        command = "make -C docs html; bin/python tests/run_tests.py"

    previous_checksum = 0
    while True:
        calculated_checksum = check_sum(path, patterns=['*.py', '*.rst', '*.rst.inc'])
        if calculated_checksum != previous_checksum:
            previous_checksum = calculated_checksum
            subprocess.Popen(command, shell=True)
            time.sleep(2)

وآمل أن يساعد هذا.

=)

فضولي (متوفر على pypi):

<اقتباس فقرة>   

وتشغيل أداة اكتشاف اختبار الأنف وتنفيذ كلما ملف مصدر   يتم تغيير.

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