【问题标题】:How do I suppress App Engine logging while running unit tests?如何在运行单元测试时禁止 App Engine 日志记录?
【发布时间】:2011-05-21 08:47:36
【问题描述】:

我在我的 GAE 应用程序中使用 gaetestbed,它运行良好。但是,当您的测试不正确时 nose 打印的有用语句正在被 App Engine 的日志记录所清除:

root: Level 9: Evaling filter expression "datastore_types.Key.from_path(u'User', 85, _app=u'tipfy') == datastore_types.Key.from_path(u'User', 87, _app=u'tipfy')"
root: Level 9: Evaling filter expression "datastore_types.Key.from_path(u'User', 87, _app=u'tipfy') == datastore_types.Key.from_path(u'User', 87, _app=u'tipfy')"
root: Level 9: Evaling filter expression "datastore_types.Key.from_path(u'User', 86, _app=u'tipfy') == datastore_types.Key.from_path(u'User', 87, _app=u'tipfy')"
root: Level 9: Evaling filter expression "datastore_types.Key.from_path(u'User', 87, _app=u'tipfy') == datastore_types.Key.from_path(u'User', 87, _app=u'tipfy')"
--------------------- >> end captured logging << ---------------------

----------------------------------------------------------------------
Ran 28 tests in 3.605s

有没有办法抑制这种情况,所以我只能得到干净的something != something else 错误消息?

【问题讨论】:

    标签: google-app-engine nosetests suppress suppressmessage


    【解决方案1】:

    不确定这是否适用于 gaetestbed,但使用 django-nose 我可以将以下内容添加到我的 settings.py 中:

    NOSE_ARGS = ['--logging-clear-handlers', '--logging-filter=-root']
    

    另一种解决方法是对输出进行反向 grep:

    ./manage.py test 2>&1 | egrep -v "^(root|Level)"
    

    【讨论】:

    • 建议的鼻子参数可以完成这项工作(至少在提出问题 4 年后它可以完成 :)),并且比修补鼻子 src 代码要干净得多。先试试这个。
    【解决方案2】:

    这是一个愚蠢的方法,

    在你的鼻子/插件/中找到 capture.py 和 logcapture.py

    在两个文件中找到函数addCaptureToErr,然后修改它。 (不知道哪个合适,请自行测试)

    原始代码应如下所示:

    def addCaptureToErr(self, ev, output):
        return '\n'.join([str(ev) , ln('>> begin captured stdout <<'),
                          output, ln('>> end captured stdout <<')])
    

    改成

    def addCaptureToErr(self, ev, output):
        check_errmsgs(output)
        return '\n'.join([str(ev) , ln('>> begin captured stdout <<'),
                          output, ln('>> end captured stdout <<')])
    
    def check_errmsgs(self,errmsgs):
        for i in range(len(errmsgs)-1,-1,-1):
            item = errmsgs[i].split(":") 
            if(item[2].find("Evaling filter expression")):
                #find msgs you want to ignore
                del errmsgs[i]
    

    它应该可以工作。

    【讨论】:

      【解决方案3】:

      我没有尝试过 Bigbear 的建议,但我确实找到了解决该问题的快速解决方法:将错误输出通过管道传输到文件中。

      python run_nosetests.py 2> failures.tmp
      gedit failures.tmp &
      

      这使您可以在文件顶部看到清晰的错误打印输出,并在其下方看到 App Engine 日志记录的最小化输出。

      【讨论】:

        猜你喜欢
        • 2016-11-16
        • 2011-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        • 2018-11-24
        相关资源
        最近更新 更多