ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python 日志、调试与单元测试

2021-12-08 23:35:06  阅读:191  来源: 互联网

标签:Python self py 单元测试 st pdb key 日志 Pdb


使用 logging 模块打印日志

import logging
logging.basicConfig(level=logging.INFO)
"""
logging 共有四个级别:
logging.INFO
logging.WARNING
logging.DEBUG
logging.ERROR
"""

n = 2
m = 0
logging.info(f"n:{n}, m:{m}")
"""
INFO:root:n:2, m:0
"""

pdb 调试代码

单步调试

# pdb_demo.py
a = 2
b = 3
c = a + b
python -m pdb pdb_demo.py
> /root/note/pdb_demo.py(1)<module>()
-> a = 2
(Pdb) l # 查看代码
  1  -> a = 2
  2     b = 3
  3     c = a + b
[EOF]
(Pdb) n # 单步运行
> /root/note/pdb_demo.py(2)<module>()
-> b = 3
(Pdb) p a # 查看变量 a
2
(Pdb) p b # 查看变量 b,此时还未执行到变量b
*** NameError: name 'b' is not defined
(Pdb) n # 单步执行
> /root/note/pdb_demo.py(3)<module>()
-> c = a + b
(Pdb) p b
3
(Pdb) n
--Return--
> /root/note/pdb_demo.py(3)<module>()->None
-> c = a + b
(Pdb) p c
5
(Pdb) n
--Return--
> <string>(1)<module>()->None
(Pdb) q # 退出

打断点调试

# pdb_demo.py
import pdb
a = 2
b = 3
pdb.set_trace()
c = a + b
python pdb_demo.py
> /root/note/pdb_demo.py(5)<module>()
-> c = a + b
(Pdb) p a
2
(Pdb) p b
3
(Pdb) p c
*** NameError: name 'c' is not defined
(Pdb) n
--Return--
> /root/note/pdb_demo.py(5)<module>()->None
-> c = a + b
(Pdb) p c
5
(Pdb) n

单元测试

我们开发的项目会不断迭代,每次迭代既要保证新的功能可以用,还要保证原有功能依然没问题。
通常我们会编写相应的单元测试,这样在每次迭代后,如果新的代码可以通过所有测试用例,那么新的代码就没问题。

假如编写了一个继承自 dict,但可以用 . 读取属性,可以用来存储数据的类 Storage

# demo_storage.py
class Storage(dict):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def __getattr__(self, key):
        try:
            return self[key]
        except KeyError:
            raise AttributeError(f"key:{key} not exists")

    def __setattr__(self, key, value):
        self[key] = value

单元测试可以这样写:

# test_storage.py
import unittest
from demo_storage import Storage


class TestStorage(unittest.TestCase):

    def test_init(self):
        """
        测试初始化函数
        """
        st = Storage(
            a = 1,
            b = "test"
        )
        self.assertEqual(st.a, 1) # 断言值相等
        self.assertEqual(st.b, "test")
        self.assertTrue(
            isinstance(st, dict)
        )
    
    def test_key(self):
        """
        测试字典方式取值
        """
        st = Storage()
        st["key"] = "value"
        self.assertEqual(st.key, "value")

    def test_attr(self):
        """
        测试点方式取值
        """
        st = Storage()
        st.key = "value"
        self.assertTrue("key" in st)
        self.assertEqual(st["key"], "value")

    def test_keyerror(self):
        st = Storage()
        with self.assertRaises(KeyError): # 断言抛出指定异常
            value = st["empty"]

    def test_attrerror(self):
        st = Storage()
        with self.assertRaises(AttributeError):
            value = st.empty

if __name__ == "__main__":
    unittest.main()

运行单元测试:

$ python test_storage.py 
.....
----------------------------------------------------------------------
Ran 5 tests in 0.000s

OK
$ python -m unittest test_storage.py 
.....
----------------------------------------------------------------------
Ran 5 tests in 0.000s

OK

有些业务需要连接数据库,这种情况可以编写 setUp()tearDown() 函数,分别表示测试开始和测试结束要运行的逻辑。

    ...
    def setUp(self):
        print("set_up")

    def tearDown(self):
        print("tear_down")
    ...

运行测试效果:

$ python -m unittest test_storage.py 
set_up
tear_down
.set_up
tear_down
.set_up
tear_down
.set_up
tear_down
.set_up
tear_down
.
----------------------------------------------------------------------
Ran 5 tests in 0.000s

OK

(本文完)

标签:Python,self,py,单元测试,st,pdb,key,日志,Pdb
来源: https://www.cnblogs.com/junsircoding/p/15664934.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有