Python的错误调试以及单元测试unittest

错误处理:

程序运行的过程中如果发生了错误,就可以事先约定返回一个错误代码,但是用错误码表示是否出错十分的不方便,所以高级语言通常都内置了一套try...except...finally的错误处理机制,Python也有这样的错误处理机制:

try:
    print('try...')
    r = 10 / 0
    print('result:', r)
except ZeroDivisionError as e:  # try运行过程中如果哪一行出错,就不会执行后续代码,直接跳转到这个代码块
    print('except:', e)
except ZeroDivisionError as e:  # 可以有多个except来捕获不同的错误
    print('ZeroDivisionError:', e)
else:  #当没有错误发生的时候,会执行else语句块
    print('no error!')
finally:  # 如果有finally语句块,就不管对错一定会执行这段代码
    print('finally...')
print('END')

Python的错误是class,所有的错误都继承自BaseException,所以每次捕获一个类型的错误,也会捕获这个类型错误的所有子类:
点击这里看错误类型和继承关系

记录错误使用logging模块:
既然我们能捕获错误,那么我们就可以把错误堆栈记录下来,事后分析错误原因,同时让程序继续执行下去,Python内置的logging模块就可以记录错误信息。

import logging

def foo(s):
    return 10 / int(s)

def bar(s):
    return foo(s) * 2

def main():
    try:
        bar('0')
    except Exception as e:  # 程序打印完错误会继续执行并正常退出
        logging.exception(e)

main()
print('END')

logging可以通过配置把错误记录到日志文件里面

抛出错误:
捕获错误就是捕获到一个错误class的一个实例,所以错误都是有意创建并抛出的,所以我们也可以使用自己编写的函数抛出错误:

class FooError(ValueError):
    pass

def foo(s):
    n = int(s)
    if n==0:
        raise FooError('invalid value: %s' % s)
    return 10 / n

foo('0')

这里注意尽量使用Python的内置错误类型


调试:

第一种方法:print
调试的最简单办法就是用print()打印出来看看,但是这样运行结果里面会包含很多垃圾信息

第二种方法:断言

def foo(s):
    n = int(s)
    assert n != 0, 'n is zero!'  # 这里断言的意思是n应该不等于0,否则就抛出AssertionError的错误,并打印后面的‘n is zero'
    return 10 / n

def main():
    foo('0')

这样输出结果还是会有很多的垃圾信息,在启动Python解释器的时候可以用-0来关闭assert:python -O err.py
这样关闭后,可以把所有的assert语句看成是pass

第三种方法:logging
logging不会输出错误,而且可以输出到文件:

import logging
logging.basicConfig(level=logging.INFO)
s = '0'
n = int(s)
logging.info('n = %d' % n)
print(10 / n)

logging不会抛出错误,可以输出到文件,还可以允许指定记录信息的级别,有debug, info, warning, error等几个级别,最后统一控制输出哪个级别的信息。

第四种方法:pdb 单步运行
让程序以单步运行的方式运行,可以设置断点,可以用IDE设置断点更为方便。



单元测试,unittest

单元测试用来对一个模块,函数或者类来进行正确性检验

打比方,有一个函数abs(),我们可以有一个测试用例:输入正数如1, 0.5之类的,期待返回值与输入值相同。

例子: mydict.py

class Dict(dict):

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

    def __getattr__(self, key):
        try:
            return self[key]
        except KeyError:
            raise AttributeError(r"'Dict' object has no attribute '%s'" % key)

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

然后我们编写单元测试:mydict_test.py

import unittest
from mydict import Dict
class TestDict(unittest.TestCase):  # 编写一个测试类,从unittest.TestCase继承
    def test_init(self):  # 以test开头的就是测试方法,不然就不是且不会被执行
        d = Dict(a=1, b='test')
        self.assertEqual(d.a, 1)
        self.assertEqual(d.b, 'test')
        self.assertTrue(isinstance(d, dict))

    def test_key(self):
        d = Dict()
        d['key'] = 'value'
        self.assertEqual(d.key, 'value')  # 这是最常用的断言,希望输出与我们预期值相等

    def test_attr(self):
        d = Dict()
        d.key = 'value'
        self.assertTrue('key' in d)
        self.assertEqual(d['key'], 'value')

    def test_keyerror(self):
        d = Dict()
        with self.assertRaises(KeyError):   # 另一种重要的断言就是期待抛出指定类型的error
            value = d['empty']  # 这里通过访问不存在的key时,断言会抛出KeyError

    def test_attrerror(self):
        d = Dict()
        with self.assertRaises(AttributeError):
            value = d.empty

这里最常用的断言就是assertEqual()
self.assertEqual(abs(-1), 1)

运行单元测试:
推荐使用在命令行通过参数-m unittest直接运行单元测试:
$ python -m unittest mydict_test

setUp & tearDown:
可以在单元测试中编写两个特殊的方法:setUp()tearDown 方法,这两个方法会在每调用一个测试方法的前后分别被执行,所以前者可以用来连接数据库,后者用来关闭数据库。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要想写一个自动化测试框架,Python是一个很好的选择。它有许多强大的库,可以让你很容易地编写和运行测试用例。如果你还不清楚如何使用Python来编写自动化测试框架,不妨参考一些教程,让你对如何使用Python来构建自动化测试框架有更深入的了解。 ### 回答2: 自动化测试框架是一种软件工具,可以帮助开发人员和测试人员快速、高效地执行测试任务。Python作为一种简洁、易于学习和高效的编程语言,可以用于编写自动化测试框架。 为了编写一个Python自动化测试框架,我们可以遵循以下步骤: 1. 导入必要的库和模块:在Python中,有许多第三方库和模块可用于测试自动化。比如,unittest库可以用于编写和运行测试用例,selenium库可以用于Web应用程序的自动化测试。我们还可以使用requests库来进行API的自动化测试,等等。 2. 设计测试用例:测试用例是自动化测试框架的核心组成部分。通过设计和编写清晰明确的测试用例,我们可以确保覆盖到应用程序的各个功能,并验证其是否按预期运行。每个测试用例应该具有输入、输出和预期结果。 3. 编写测试代码:使用Python编写测试代码来执行测试用例。可以使用unittest库来创建测试类和测试方法,并使用断言来验证预期结果是否与实际结果一致。例如,对于Web应用程序,可以使用selenium库模拟用户与浏览器的交互,输入数据并点击按钮,并使用断言来验证页面上的内容是否正确。 4. 运行测试:编写一个主函数或脚本来负责加载测试代码并执行测试用例。可以使用命令行界面或集成开发环境(IDE)来运行测试。 5. 生成测试报告:测试报告提供了执行测试结果的详细信息,包括通过的测试用例、失败的测试用例以及错误日志等。使用Pytest等测试框架提供的功能可以生成漂亮的HTML测试报告,以便团队成员或领导查看测试结果。 总之,通过使用Python编写自动化测试框架,我们可以方便地执行各种测试任务,并提高测试速度和质量。Python的简单语法、丰富的库以及强大的开发社区使得编写自动化测试框架变得更加容易。 ### 回答3: 自动化测试框架是使用编程语言来编写测试脚本,用于执行各种测试任务和验证系统功能的工具。Python语言特别适合编写自动化测试框架,因为它具有简单易学、开源丰富的生态系统以及强大的第三方库支持。 用Python编写自动化测试框架的步骤如下: 1. 首先,需要使用Python安装并配置测试框架依赖的相关软件和工具。例如,可以使用pip工具安装Python的测试库,如unittest、pytest、selenium等。 2. 编写测试用例。测试用例是自动化测试的核心,需要根据实际需求编写各种场景的测试脚本。可以使用unittest框架提供的测试用例类和断言方法,编写验证系统功能的测试用例。 3. 设计测试框架结构。为了提高测试效率和可维护性,需要设计合适的测试框架结构。可以按模块或功能划分测试用例,使用配置文件管理测试环境和参数,编写公共方法和工具函数提供给测试用例调用。 4. 编写测试脚本。将编写好的测试用例组织成测试脚本,可以使用命令行或集成开发环境(IDE)执行测试脚本。例如,使用pytest框架可以通过命令行执行测试脚本。 5. 执行测试并生成报告。执行测试脚本并收集测试结果,可以生成测试报告以便查看测试覆盖率、通过率等指标。可以使用第三方库如pytest-html生成漂亮的HTML测试报告。 6. 分析测试结果。根据测试结果,可以进一步分析问题和改进测试策略。如果有测试失败或异常,可以使用调试工具对代码进行跟踪和分析,找到问题的原因和解决方案。 总之,Python提供了强大的功能和丰富的库支持,使得编写自动化测试框架变得简单和高效。通过合理的设计和编码,可以提高测试效率和质量,减少人工测试工作量,更好地支持软件开发和维护过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值