首页 > 编程语言 >探索 Python 的测试与调试技巧

探索 Python 的测试与调试技巧

时间:2024-10-16 17:18:14浏览次数:8  
标签:logging 技巧 Python unittest add pytest 测试 调试

测试和调试是开发软件时至关重要的步骤,它们可以确保代码的正确性、稳定性和性能。Python 提供了强大的工具来简化测试和调试流程。在本篇博客中,我们将讨论 Python 中的单元测试、pytest 测试框架、调试与日志记录,以及性能优化与剖析工具的使用。

10.1 单元测试与 unittest

单元测试是指对软件中的最小功能模块进行测试,确保每个单元(通常是函数或方法)都能按照预期工作。Python 标准库提供了 unittest 模块,用于编写和执行单元测试。

示例:

import unittest

# 被测试的函数
def add(a, b):
    return a + b

# 创建测试用例类,继承自 unittest.TestCase
class TestMathOperations(unittest.TestCase):

    # 编写测试方法
    def test_add(self):
        self.assertEqual(add(2, 3), 5)
        self.assertEqual(add(-1, 1), 0)

# 运行测试
if __name__ == '__main__':
    unittest.main()

在 unittest 中,测试类继承自 unittest.TestCase,测试方法以 test_ 开头。常用的断言方法有 assertEqual()assertTrue() 和 assertRaises(),这些断言用于验证函数输出是否符合预期。

10.2 使用 pytest 进行测试

pytest 是一个强大的第三方测试框架,简化了测试编写与执行流程,支持自动发现测试、参数化测试等特性。

安装 pytest

pip install pytest

编写测试:

pytest 不需要继承任何基类,测试函数命名规则为以 test_ 开头。

# 被测试的函数
def add(a, b):
    return a + b

# 编写测试函数
def test_add():
    assert add(2, 3) == 5
    assert add(-1, 1) == 0

运行测试:

pytest

pytest 还支持测试失败时的详细输出、自动发现测试文件、参数化测试等高级功能。它比 unittest 更加简洁,并且能与其他工具如 pytest-cov 一起使用来生成代码覆盖率报告。

参数化测试:

import pytest

# 参数化测试
@pytest.mark.parametrize("a,b,result", [(2, 3, 5), (-1, 1, 0)])
def test_add(a, b, result):
    assert add(a, b) == result

10.3 调试与日志记录

调试是解决代码中问题的关键步骤,Python 提供了多种调试方法,包括使用 print() 输出变量值、使用 pdb 调试器等。

使用 pdb 调试器

pdb 是 Python 内置的调试器,提供了逐步执行代码、设置断点、查看变量等功能。

import pdb

def divide(a, b):
    pdb.set_trace()  # 设置断点
    return a / b

result = divide(10, 2)

运行时程序会暂停在断点处,你可以通过命令 n (next) 执行下一行,使用 p (print) 查看变量的值。

日志记录

日志记录是跟踪应用程序状态、记录重要事件的常用方法。logging 模块提供了灵活的日志记录功能,可以将日志输出到控制台或文件中。

import logging

# 配置日志
logging.basicConfig(level=logging.INFO)

# 记录信息
logging.info("This is an info message")
logging.warning("This is a warning message")
logging.error("This is an error message")

通过 logging 模块,您可以记录程序的执行过程,有助于发现并定位错误,尤其在生产环境下,日志记录是排查问题的重要手段。

10.4 性能优化与剖析工具

性能优化是提高程序执行效率的过程,Python 提供了多种工具来分析和剖析程序的性能瓶颈。

使用 timeit 进行性能测试

timeit 模块用于测量小段代码的执行时间,适合用于分析某个函数或算法的性能。

import timeit

# 计算代码块的执行时间
execution_time = timeit.timeit('"-".join(str(n) for n in range(100))', number=10000)
print(f'Execution time: {execution_time}')

使用 cProfile 进行代码剖析

cProfile 是 Python 内置的性能剖析工具,它可以显示程序中的各个函数调用及其耗时。

python -m cProfile my_script.py

通过剖析,您可以轻松定位到程序中的性能瓶颈,进而进行优化。

使用 memory_profiler 进行内存剖析

内存优化与剖析工具有助于识别程序中的内存消耗和泄漏问题,memory_profiler 是常用的内存分析工具。

安装 memory_profiler

pip install memory-profiler

示例:

from memory_profiler import profile

@profile
def my_func():
    a = [1] * (10**6)
    b = [2] * (2 * 10**7)
    del b
    return a

my_func()

运行该程序时,memory_profiler 会显示内存使用情况,帮助你找到内存占用过高的代码块。


总结

测试与调试是确保代码质量和稳定性的关键步骤。通过 unittest 和 pytest,可以轻松编写和执行测试;使用调试器和日志记录工具,能快速找到并解决问题;而性能优化与剖析工具则帮助识别并解决代码的性能瓶颈。合理运用这些工具,将极大提升开发效率与程序的稳定性。


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

标签:logging,技巧,Python,unittest,add,pytest,测试,调试
From: https://blog.csdn.net/qq_45728381/article/details/142987230

相关文章

  • 探索 Python Web 开发:从框架到爬虫
    Python是Web开发中广泛使用的编程语言,因其简单、灵活和强大的生态系统,适合构建各种类型的Web应用和API。在本篇博客中,我们将讨论Web开发的几个重要主题,包括Flask和Django框架、API开发、HTTP请求处理以及网页爬虫的基础。9.1Flask框架基础Flask是一个轻量级......
  • Python学习的自我理解和想法(10)
    学的是b站的课程(千锋教育),跟老师写程序,不是自创的代码!今天是学Python的第10天,学的内容是函数。开学了,时间不多,写得不多,见谅。目录1.函数入门2.函数使用说明1.定义函数2.函数组成3.函数命名4.函数参数5.函数易忘点6.函数的调用3.函数调用时的注意事项4.函数的参数(1......
  • Python入门:A+B问题
    1.A+B问题I前言本篇作为课程第一篇,主要是对Python基础语法进行扫盲,本节课会学习到下面知识:输入本道题目的工作任务很简单,只是计算两个数的和,但是在计算之前,我们首先要明确的一个问题就是如何把这两个数据输入到计算机中,并由程序读取呢?输入当然是使用键盘之类的输入设备完......
  • python-基础-常见字符串格式化方法总结
    1.f-string方法案例:点击查看代码#计算圆的面积importmathdefcalculate_circle_area(radius):"""计算圆的面积"""returnmath.pi*(radius**2)radius=5#圆的半径area=calculate_circle_area(radius)print(f"圆的面积为:{area:.2f}"......
  • python中的函数和方法的区别是什么
    python中的函数和方法的区别:1、函数要手动传self,方法不用传self。2、如果是一个函数,要用类名去调用,如果是一个方法,要用对象去调用。举例说明:class Foo(object):    def __init__(self):        self.name="haiyan"    def func(self):     ......
  • python如何将list排序
    python提供了对list排序的两种方法1、使用list内建函数sort排序list.sort(key=None,reverse=False)eg:In [57]: l=[27,47,3,42,19,9]In [58]: l.sort()In [59]: lOut[59]: [3, 9, 19, 27, 42, 47]上面这种是直接对l列表里面的元素排序,sort()函数还提供......
  • python中怎么遍历字典
    遍历字典:keys() 、values()、items()1、xxx.keys():返回字典的所有的key,返回一个序列,序列中保存有字典的所有的键。效果图:代码:# keys() 该方法会返回字典的所有的key#   该方法会返回一个序列,序列中保存有字典的所有的键d = {'name':'孙悟空','age':1......
  • 外网爆火!仅需Python基础,即可从0构建LLM大语言模型(附PDF)
    在当今人工智能技术飞速发展的时代,大型语言模型(LLM)作为聊天机器人、文本生成和理解等应用的核心,已经成为研究和商业领域关注的焦点。但对于大多数开发者来说,它们的工作原理仍然是一个黑箱,更不用说如何从头开始构建一个这样的模型了。而《从头开始构建大型语言模型》这本书,......
  • python+flask框架的 基于Java的外卖系统设计与实现 前台mp48(开题+程序+论文) 计算机
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着互联网技术的飞速发展,外卖服务已成为人们日常生活中不可或缺的一部分。关于外卖系统的研究,现有研究主要以技术实现和用户体验优化为主......
  • python+flask框架的 基于Java的外卖系统设计与实现前台mp48(开题+程序+论文) 计算机毕
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着互联网的快速发展和人们生活节奏的加快,外卖服务已成为现代都市生活中不可或缺的一部分。关于外卖系统的研究,现有研究主要以技术实现和......