1.测试与调试
- 测试
- 防御性编程
- 函数规范
- 模块化编程
- 检查输入、输出
- 调试
2.测试
- 关键
对所有可能的输入空间进行分区,构建测试套件(数据),至少每个分区有一组
测试数据 。
- 例如黑盒测试sqrt(x,eps):
case x eps 边界 完全平方 小于1 根为无理数
- 例如白盒测试
-
经验准则
- for循环
- 未进入循环
- 循环一次
- 循环多于一次
- while循环
- 类似for循环
- 对应所有跳出循环的测试用例
- 递归函数
- 没有进入递归
- 一次或多次递归
- for循环
-
测试流程
- 单元测试
- 构建并测试
- 集成测试
- 整个程序是否按预期工作
- 回归测试
- 调整代码后,对之前通过的测试点再次测试
- 单元测试
-
# -*- coding: utf-8 -*- """ 带bug的程序,debug_1.py """ def isPal(x): '''假设 x 是列表 如果 x 是回文,则返回True,否则返回 False''' temp = x temp.reverse if temp == x: return True else: return False def silly(n): '''假设 n 是正整数,接受用户的 n 个输入 如果所有输入组成一个列表,则返回 Yes,否则返回 No''' for i in range(n): result = [] elem = input('Enter element: ') result.append(elem) if isPal(result): print('Yes') else: print('No')
-
常见错误
- 函数传参错误顺序
- 拼写错误
- 变量初始化
- 浮点数相等
- id(a)==id(b) & a = b & a is b
- 内置函数使用方法(是否有()、是否有参数、是否是方法
3.异常
-
异常类型
BaseException # 所有异常的基类 +-- SystemExit # 解释器请求退出 +-- KeyboardInterrupt # 用户中断执行(通常是输入^C) +-- GeneratorExit # 生成器(generator)发生异常来通知退出 +-- Exception # 常规异常的基类 +-- StopIteration # 迭代器没有更多的值 +-- StopAsyncIteration # 必须通过异步迭代器对象的__anext__()方法引发以停止迭代 +-- ArithmeticError # 各种算术错误引发的内置异常的基类 | +-- FloatingPointError # 浮点计算错误 | +-- OverflowError # 数值运算结果太大无法表示 | +-- ZeroDivisionError # 除(或取模)零 (所有数据类型) +-- AssertionError # 当assert语句失败时引发 +-- AttributeError # 属性引用或赋值失败 +-- BufferError # 无法执行与缓冲区相关的操作时引发 +-- EOFError # 当input()函数在没有读取任何数据的情况下达到文件结束条件(EOF)时引发 +-- ImportError # 导入模块/对象失败 | +-- ModuleNotFoundError # 无法找到模块或在在sys.modules中找到None +-- LookupError # 映射或序列上使用的键或索引无效时引发的异常的基类 | +-- IndexError # 序列中没有此索引(index) | +-- KeyError # 映射中没有这个键 +-- MemoryError # 内存溢出错误(对于Python 解释器不是致命的) +-- NameError # 未声明/初始化对象 (没有属性) | +-- UnboundLocalError # 访问未初始化的本地变量 +-- OSError # 操作系统错误,EnvironmentError,IOError,WindowsError,socket.error,select.error和mmap.error已合并到OSError中,构造函数可能返回子类 | +-- BlockingIOError # 操作将阻塞对象(e.g. socket)设置为非阻塞操作 | +-- ChildProcessError # 在子进程上的操作失败 | +-- ConnectionError # 与连接相关的异常的基类 | | +-- BrokenPipeError # 另一端关闭时尝试写入管道或试图在已关闭写入的套接字上写入 | | +-- ConnectionAbortedError # 连接尝试被对等方中止 | | +-- ConnectionRefusedError # 连接尝试被对等方拒绝 | | +-- ConnectionResetError # 连接由对等方重置 | +-- FileExistsError # 创建已存在的文件或目录 | +-- FileNotFoundError # 请求不存在的文件或目录 | +-- InterruptedError # 系统调用被输入信号中断 | +-- IsADirectoryError # 在目录上请求文件操作(例如 os.remove()) | +-- NotADirectoryError # 在不是目录的事物上请求目录操作(例如 os.listdir()) | +-- PermissionError # 尝试在没有足够访问权限的情况下运行操作 | +-- ProcessLookupError # 给定进程不存在 | +-- TimeoutError # 系统函数在系统级别超时 +-- ReferenceError # weakref.proxy()函数创建的弱引用试图访问已经垃圾回收了的对象 +-- RuntimeError # 在检测到不属于任何其他类别的错误时触发 | +-- NotImplementedError # 在用户定义的基类中,抽象方法要求派生类重写该方法或者正在开发的类指示仍然需要添加实际实现 | +-- RecursionError # 解释器检测到超出最大递归深度 +-- SyntaxError # Python 语法错误 | +-- IndentationError # 缩进错误 | +-- TabError # Tab和空格混用 +-- SystemError # 解释器发现内部错误 +-- TypeError # 操作或函数应用于不适当类型的对象 +-- ValueError # 操作或函数接收到具有正确类型但值不合适的参数 | +-- UnicodeError # 发生与Unicode相关的编码或解码错误 | +-- UnicodeDecodeError # Unicode解码错误 | +-- UnicodeEncodeError # Unicode编码错误 | +-- UnicodeTranslateError # Unicode转码错误 +-- Warning # 警告的基类 +-- DeprecationWarning # 有关已弃用功能的警告的基类 +-- PendingDeprecationWarning # 有关不推荐使用功能的警告的基类 +-- RuntimeWarning # 有关可疑的运行时行为的警告的基类 +-- SyntaxWarning # 关于可疑语法警告的基类 +-- UserWarning # 用户代码生成警告的基类 +-- FutureWarning # 有关已弃用功能的警告的基类 +-- ImportWarning # 关于模块导入时可能出错的警告的基类 +-- UnicodeWarning # 与Unicode相关的警告的基类 +-- BytesWarning # 与bytes和bytearray相关的警告的基类 +-- ResourceWarning # 与资源使用相关的警告的基类。被默认警告过滤器忽略。
-
异常捕获
关键字 关键字说明 try/except 捕获异常并处理 pass 忽略异常 as 定义异常实例(except MyError as e) else 如果try中的语句没有引发异常,则执行else中的语句 finally 无论是否出现异常,都执行的代码 raise 抛出/引发异常 while True: try: a=int(input(a:)) b=int(input(b:)) ans=a/b break except Exception as e: print('出现异常:',str(e)) else: