小编use*_*653的帖子

assertRaises在python单元测试中没有捕获异常

有人可以告诉我为什么下面的单元测试在test_bad中的ValueError上失败了,而不是用assertRaises捕获它并成功吗?我想我正在使用正确的过程和语法,但ValueError没有被捕获.

我在Linux机器上使用Python 2.7.5.

这是代码......

import unittest

class IsOne(object):
    def __init__(self):
        pass
    def is_one(self, i):
        if (i != 1):
            raise ValueError

class IsOne_test(unittest.TestCase):

    def setUp(self):
        self.isone = IsOne()

    def test_good(self):
        self.isone.is_one(1)
        self.assertTrue(True)

    def test_bad(self):
        self.assertRaises(ValueError, self.isone.is_one(2))

if __name__ == "__main__":
    unittest.main()
Run Code Online (Sandbox Code Playgroud)

这是单元测试的输出:

======================================================================
ERROR: test_bad (__main__.IsOne_test)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test/raises.py", line 20, in test_bad
    self.assertRaises(ValueError, self.isone.is_one(2))
  File "test/raises.py", line 8, in is_one
    raise ValueError
ValueError

----------------------------------------------------------------------
Ran 2 tests in 0.008s

FAILED (errors=1)
Run Code Online (Sandbox Code Playgroud)

python unit-testing assertraises

20
推荐指数
1
解决办法
2万
查看次数

使用python getattr/setattr作为当前函数

是否可以使用getattr/ setattr来访问类函数中的变量?

以下示例.说我有一个A级,具有两个方法,func1以及func2这两者的定义一个变量count是不同类型的.有没有办法getattr在func2中使用 来访问局部变量count

实际上,我有很多变量func2(也有不同的定义func1),我想循环使用,我希望通过使用getattr变量名循环来缩短我的代码.

class A(object):

   def __init__(self):
      pass

   def func1(self):
        count = {"A": 1, "B":2}

   def func2(self):
        count = [1, 2]
        mean = [10, 20]
        for attr in ("count", "mean"):
           xattr = getattr(self, attr)   ! What do I put in here in place of "self"?
           xattr.append(99)
Run Code Online (Sandbox Code Playgroud)

python

5
推荐指数
2
解决办法
5010
查看次数

结合 Python 跟踪信息和日志记录

我正在尝试编写一个高度模块化的 Python 日志系统(使用日志模块),并在日志消息中包含来自跟踪模块的信息。

例如,我希望能够编写如下一行代码:

my_logger.log_message(MyLogFilter, "this is a message")
Run Code Online (Sandbox Code Playgroud)

并让它包括对“log_message”调用位置的跟踪,而不是实际的记录器调用本身。

除了跟踪信息来自logging.debug()调用而不是调用之外,我几乎可以使用以下代码my_logger.log_message()

class MyLogFilter(logging.Filter):

    def __init__(self):
        self.extra = {"error_code": 999}
        self.level = "debug"

    def filter(self, record):
        for key in self.extra.keys():
           setattr(record, key, self.extra[key])

class myLogger(object):

    def __init__(self):
        fid = logging.FileHandler("test.log")
        formatter = logging.Formatter('%(pathname)s:%(lineno)i, %(error_code)%I, %(message)s' 
        fid.setFormatter(formatter)

        self.my_logger = logging.getLogger(name="test")
        self.my_logger.setLevel(logging.DEBUG)
        self.my_logger.addHandler(fid)

    def log_message(self, lfilter, message):
        xfilter = lfilter()
        self.my_logger.addFilter(xfilter)
        log_funct = getattr(self.logger, xfilter.level)
        log_funct(message)

if __name__ == "__main__":

    logger = myLogger()
    logger.log_message(MyLogFilter, "debugging")

Run Code Online (Sandbox Code Playgroud)

为了进行简单的logging.debug调用,要经历很多麻烦,但实际上,我将MyLogFilter …

python trace error-logging

5
推荐指数
1
解决办法
629
查看次数