廖雪峰python学习笔记【14】错误、调试和测试

一、含义:

1. 错误:python内置了一套异常处理机制来进行程序运行错误时的处理。

2. 调试:python的pdb允许单步调试。

3. 测试:编写测试程序。

二、错误处理

1. 错误码机制:错误码需要逐级上报,直到某个函数能够处理该错误。

2. try...except...finally...

    2.1 finally...语句块可以不写。

    2.2 将可能出现错误的语句块放在try中。

    2.3 except...语句块可以有多个,处理多种不同的错误。

    2.3 python的错误也是类,所有的错误类型都继承自BaseException。

        2.3.1 常见错误类型和继承关系:参考: https://docs.python.org/3/library/exceptions.html#exception-hierarch

3. 调用栈:如果发生错误,没有主动去捕获。 错误就好一直往上抛,直至被python解释器捕获,打印出调用栈

4. 记录错误:通过内置的logging模块可以记录错误栈。import logging

5. 抛出错误:

    5.1 错误是class,捕获到一个错误,就是捕获到该class的一个实例。

    5.2 除了python内置的错误类型,可以通过raise抛出自定义错误。

    5.3 应该在文档中写清楚可能会抛出哪些错误,以及错误产生的原因。

    5.4 在except语句块中同样可以调用raise,让顶层调用者去处理该错误

三、调试

1. print(): 坏处是调试完成后需要删除。

2. 断言:

    2.1 示例:assert n != 0, 'n is zero'

    2.2 assert表达式的值应该为 True,否则程序会运行错误。

    2.3 assert表达式为False时,会抛出AssertionError异常。

    2.4 启动python解释器时,使用-O(大写字母O)参数可以关掉assert,所有assert语句当做pass。

3. logging:

    3.1 logging不会先assert一样抛出错误,通过配置,可以将错误信息写入到文件中。

import logging # 导入logging模块logging.basicConfig(level = logging.INFO) # 配置日志级别。logging的日志级别分为 debug, info, warning, error等# 怎么配置可以将日志输出到文件中??可以借鉴loggging的实现,组织我司代码的日志记录。

4. pdb

    4.1 python解释器以' -m pdb '为参数,可以启动pdb调试器。

    4.2 不使用-m pdb启动调试器时,可以在源码中导入pdb: importpdb。然后在可能出现错误的位置,调用pdb.set_trace(),程序运行到此处就会自动进入pdb的调试环境。

    4.3 建议使用IDE环境:PyCharm调试python源码。但是听廖大神说,logging是终极武器,慢慢体会。

四、单元测试

1 TDD(Test-Driven-Development)测试驱动开发。

2 单元测试小结:

  2.1 未来重构代码信息的保证。

  2.2 测试用例需要覆盖常用的输入组合、边界和异常。

  2.3 单元测试代码务必简单,保证测试代码本身没有问题。

3 示例:

  3.1 编写单元测试,需要导入unittest模块:import unittest

  3.2 定义的测试类,需要继承unittest.TestCase: class testXxxx(unittest.TestCase)

  3.3 测试方法需要以test开头,否则该测试方法不会被执行。

4 运行单元测试:

  4.1 可以在测试文件中:

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

  4.2 可以通过python解释器参数执行:python -m unittest 测试文件名。

5 在测试类中定义setUp和tearDown方法后,每个测试方法的执行前后都会自动调用setUp和tearDown。可以用来为测试方法进行资源的申请和释放。

五、文档测试:

1. 定义或函数时,可以将类或函数的测试代码写在注释中,通过多行注释的形式:''' This is comment '''。

2. 导入doctest模块后,可以用通过doctest.testmod()函数运行注释中的测试代码。测试代码执行错误时提示相应错误信息,否则无输出信息。

    if __name__ == '__main__': 
        import doctest 
        doctest.testmod()



猜你喜欢

转载自blog.csdn.net/liufuchun111/article/details/80598822