سؤال

لذلك قمت بإنشاء الملف التالي (testlib.py) لتحميل جميع الدكتوراه تلقائيًا (في جميع أدلة مشروعي المتداخلة) إلى __tests__ قاموس الاختبارات

# ./testlib.py
import os, imp, re, inspect
from django.contrib.admin import site

def get_module_list(start):
    all_files = os.walk(start)
    file_list = [(i[0], (i[1], i[2])) for i in all_files]
    file_dict = dict(file_list)

    curr = start
    modules = []
    pathlist = []
    pathstack = [[start]]

    while pathstack is not None:

        current_level = pathstack[len(pathstack)-1]
        if len(current_level) == 0:
            pathstack.pop()

            if len(pathlist) == 0:
                break
            pathlist.pop()
            continue
        pathlist.append(current_level.pop())
        curr = os.sep.join(pathlist)

        local_files = []
        for f in file_dict[curr][1]:
            if f.endswith(".py") and os.path.basename(f) not in ('tests.py', 'models.py'):
                local_file = re.sub('\.py$', '', f)
                local_files.append(local_file)

        for f in local_files:
            # This is necessary because some of the imports are repopulating the registry, causing errors to be raised
            site._registry.clear()
            module = imp.load_module(f, *imp.find_module(f, [curr]))
            modules.append(module)

        pathstack.append([sub_dir for sub_dir in file_dict[curr][0] if sub_dir[0] != '.'])

    return modules

def get_doc_objs(module):
    ret_val = []
    for obj_name in dir(module):
        obj = getattr(module, obj_name)
        if callable(obj):
            ret_val.append(obj_name)
        if inspect.isclass(obj):
            ret_val.append(obj_name)

    return ret_val

def has_doctest(docstring):
    return ">>>" in docstring

def get_test_dict(package, locals):
    test_dict = {}
    for module in get_module_list(os.path.dirname(package.__file__)):
        for method in get_doc_objs(module):
            docstring = str(getattr(module, method).__doc__)
            if has_doctest(docstring):

                print "Found doctests(s) " + module.__name__ + '.' + method

                # import the method itself, so doctest can find it
                _temp = __import__(module.__name__, globals(), locals, [method])
                locals[method] = getattr(_temp, method)

                # Django looks in __test__ for doctests to run. Some extra information is
                # added to the dictionary key, because otherwise the info would be hidden.
                test_dict[method + "@" + module.__file__] = getattr(module, method)

    return test_dict

لإعطاء الائتمان عند استحقاق الائتمان ، جاء الكثير من هذا هنا

في ملف tests.py الخاص بي ، لدي الرمز التالي:

# ./project/tests.py
import testlib, project
__test__ = testlib.get_test_dict(project, locals())

كل هذا يعمل بشكل جيد لتحميل الدكتوراه من جميع ملفاتي والمدافع الفرعي. ال مشكلة هل هذا عندما أقوم باستيراد واستدعاء pdb.set_trace () في أى مكان, ، هذا كل ما أراه:

(Pdb) l
(Pdb) args
(Pdb) n
(Pdb) n
(Pdb) l
(Pdb) cont

يبدو أن Doctest تلتقط الإخراج وتوسطه نفسه ، ويستخدم الإخراج في تقييم الاختبارات. لذا ، عندما يكتمل تشغيل الاختبار ، أرى كل شيء ينبغي طبعت عندما كنت في PDB Shell ضمن تقرير فشل Doctest. يحدث هذا بغض النظر عما إذا كنت قد استدعت pdb.set_trace () داخل خط الدكتوراه أو داخل الوظيفة أو الطريقة التي يتم اختبارها.

من الواضح أن هذا جر كبير. الدكتوراه رائعة ، لكن بدون PDB تفاعلي ، لا يمكنني تصحيح أي من الإخفاقات التي يكتشفونها من أجل إصلاحها.

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

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

المحلول

تمكنت من الحصول على PDB من خلال التغيير والتعديل. أنا فقط وضعت الرمز التالي في أسفل ملف testlib.py الخاص بي:

import sys, pdb
class TestPdb(pdb.Pdb):
    def __init__(self, *args, **kwargs):
        self.__stdout_old = sys.stdout
        sys.stdout = sys.__stdout__
        pdb.Pdb.__init__(self, *args, **kwargs)

    def cmdloop(self, *args, **kwargs):
        sys.stdout = sys.__stdout__
        retval = pdb.Pdb.cmdloop(self, *args, **kwargs)
        sys.stdout = self.__stdout_old

def pdb_trace():
    debugger = TestPdb()
    debugger.set_trace(sys._getframe().f_back)

من أجل استخدام مصحح الأخطاء أنا فقط import testlib و اتصل testlib.pdb_trace() وأنا أسقطت في مصحح أخطاء يعمل بالكامل.

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