UNITTEST: PYTHON开发者内置的安全网

Python 内置的 unittest 模块为初学者提供了一个可访问的测试驱动开发切入点,同时为经验丰富的程序员提供了一个确保代码质量的框架。

译自:unittest: Python's Built-In Safety Net for Developers

作者:Jessica Wachtel

对于大多数开发者来说,测试通常不是编码中最受欢迎的部分,但它却是 100% 必要的。我编程训练营的一位导师曾经把测试比作"编码的蔬菜",这确实很贴切。通过在开发过程中捕获错误,全面的测试可以增强对软件质量和稳定性的信心,而这正是你想要捕获它们的时机。它可以降低生产环境中不当软件行为的风险,从而提高应用程序性能、增强安全性并最大限度地减少停机时间。

经过良好测试的代码也能使你的工程师同事受益,因为它可靠、可维护且更易于重构。测试就像一个安全网,确保在进行更改后,现有功能仍然可以正常工作。此外,自动化测试可以加快迭代速度、加强协作,并提供关于代码预期行为的清晰文档。

在选择测试框架时,有很多选择。本教程将重点介绍使用 Python 内置包unittest进行的简单测试。本教程主要面向没有单元测试经验的编码新手。unittest对于喜欢内置方法的开发者来说是一个极好的选择。Python 的unittest模块擅长处理基本的单元测试,这些测试可以验证单个函数或方法在隔离状态下的正确性。这也是构建你自己的测试并熟悉它们工作原理的一个很好的起点。

Pythonunittest入门

unittest.TestCase是 Python 的unittest模块中的一个类,它为编写和运行测试提供了框架。它是创建测试的基础类,测试是 Python 中的单个单元。 当你创建一个继承自unittest.TestCase的类时,你可以定义方法来测试代码中的特定功能。这些测试方法应该以test开头(例如,test_addition)。在每个方法中,你使用各种断言方法来检查实际结果是否与预期结果匹配。

断言是一个检查条件是否为真的语句。如果为假,它会引发错误或异常。unittest.TestCase提供以下断言:

  • assertEqual(a, b)如果a == b则通过
  • assertNotEqual(a, b)如果a != b则通过
  • assertTrue(x)如果xTrue则通过
  • assertFalse(x)如果xFalse则通过
  • assertIsNone(x)如果xNone则通过
  • assertRaises(Exception, func, *args)如果func(*args)引发异常则通过

构建你的第一个测试

这非常简单。在导入unittest之后,我们需要做的就是构建函数,然后创建并运行测试。

定义函数:

python 复制代码
def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

使用unittest.TestCase类创建测试:

ruby 复制代码
import unittest

class Operations(unittest.TestCase):
    def test_add(self):
        self.assertEqual(add(2, 3), 5)  # Test if 2 + 3 = 5
        self.assertEqual(add(-1, 1), 0) # Test with negative numbers

    def test_subtract(self):
        self.assertEqual(subtract(5, 3), 2)
        self.assertEqual(subtract(0, 4), -4)

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

请注意,如果你使用的是 Jupyter notebook,你需要替换以下代码......

ini 复制代码
if __name__ == "__main__":
    unittest.main()

用这段代码......

scss 复制代码
unittest.TextTestRunner().run(unittest.TestLoader().loadTestsFromTestCase(Operations))

在你的代码底部。

运行此测试将产生一条成功消息。

但是,只需进行一些小的调整就会导致测试失败:

ruby 复制代码
class Operations(unittest.TestCase):
    def test_add(self):
        # This test will pass
        self.assertEqual(add(2, 3), 5)  # Test if 2 + 3 = 5
        self.assertEqual(add(-1, 1), 0) # Test with negative numbers

    def test_subtract(self):
        # This test will fail
        self.assertEqual(subtract(5, 3), 3)  # Incorrect expected value (should be 2)
        self.assertEqual(subtract(0, 4), -4)

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

setup() 和 teardown()

setup()teardown()这些方法确保每个测试都是隔离的,并在一个干净的环境中运行,其中包含它所需的一切。

  • setup()是一个在每个单元测试之前运行的方法,用于设置任何必要的状态或资源。这可以用于在每个测试方法运行之前准备特定的环境或资源(例如,数据库连接或测试文件)。
  • teardown()清理测试之间的这些连接和资源,以确保每个测试都是独立的。
ruby 复制代码
class TestExample(unittest.TestCase):
    def setUp(self):
        self.x = 10
        self.y = 5

    def test_add(self):
        self.assertEqual(add(self.x, self.y), 15)

    def tearDown(self):
        print("Cleaning up after test")

对象 Mock

unittest.mock允许你用模拟对象替换依赖项(例如,API 请求)。以下是如何模拟 API 请求:

python 复制代码
from unittest.mock import patch
import requests

def get_data():
    response = requests.get("https://api.example.com/data")
    return response.json()

class TestAPI(unittest.TestCase):
    @patch("requests.get")
    def test_get_data(self, mock_get):
        mock_get.return_value.json.return_value = {"message": "success"}
        self.assertEqual(get_data(), {"message": "success"})

结论

Python 的unittest模块提供了比上面列出的更复杂的测试需求的工具,但这些是入门的基础知识。unittest非常适合初学者和经验丰富的工程师,使其成为希望寻找内置、可靠的解决方案来保护其代码质量的开发者的绝佳选择。

本文在云云众生yylives.cc/)首发,欢迎大家访问。

相关推荐
Psycho_MrZhang5 分钟前
Pytorch 反向传播
人工智能·pytorch·python
这里有鱼汤39 分钟前
别怪 Python 慢,是你 import 的姿势不对!我亲测提速 3~5 倍
后端·python
hyhrosewind41 分钟前
Python数据容器:数据容器的分类、数据容器特点总结、各数据容器遍历的特点、数据容器通用操作(统计,转换,排序)
python·数据容器的分类·各数据容器的特点·各数据容器的遍历·数据容器的通用操作·统计,转换,排序
灏瀚星空42 分钟前
从基础到实战的量化交易全流程学习:1.3 数学与统计学基础——线性代数与矩阵运算 | 矩阵基础
笔记·python·学习·线性代数·数学建模·金融·矩阵
Amctwd1 小时前
【LLM】解析RAG增强检索技术:原理、实现与应用
python
乐享极致1 小时前
Python 数据可视化进阶:精准插入图表到指定 Excel 工作表
python·信息可视化·excel
火云牌神1 小时前
本地大模型编程实战(28)查询图数据库NEO4J(1)
python·llm·neo4j·langgraph
databook1 小时前
『Plotly实战指南』--交互功能进阶篇
python·数据分析·数据可视化
小白—人工智能1 小时前
数据可视化 —— 饼图
python·信息可视化·数据可视化
学不完了是吧2 小时前
Python循环与遍历详解:从入门到进阶
python