简介
对于想要创建健壮且可靠软件的 Python 开发者来说,单元测试是一项至关重要的技能。本全面指南将探讨 Python 中单元测试的基础知识,为开发者提供实用策略,以验证代码功能、检测潜在错误并维护高质量的软件应用程序。
对于想要创建健壮且可靠软件的 Python 开发者来说,单元测试是一项至关重要的技能。本全面指南将探讨 Python 中单元测试的基础知识,为开发者提供实用策略,以验证代码功能、检测潜在错误并维护高质量的软件应用程序。
单元测试是一种软件测试方法,其中软件的各个单元或组件被单独测试。一个单元通常是应用程序中最小的可测试部分,例如函数、方法或类。主要目标是验证软件的每个单元是否按设计运行。
单元测试有几个关键好处:
每个测试都应该独立于其他测试。这意味着:
| 原则 | 描述 |
|---|---|
| 快速(Fast) | 测试应该快速运行 |
| 独立(Independent) | 测试不应相互依赖 |
| 可重复(Repeatable) | 测试每次都应产生相同的结果 |
| 自我验证(Self-validating) | 测试应自动检测通过或失败 |
| 及时(Timely) | 理想情况下在生产代码之前或与之同时编写 |
def add_numbers(a, b):
return a + b
def test_add_numbers():
## 安排
num1 = 5
num2 = 3
expected_result = 8
## 执行
actual_result = add_numbers(num1, num2)
## 断言
assert actual_result == expected_result, f"预期为 {expected_result},但得到了 {actual_result}"
在学习单元测试时,LabEx 提供交互式环境,帮助你通过实践来理解这些概念。
import unittest
class TestMathOperations(unittest.TestCase):
def test_addition(self):
self.assertEqual(1 + 1, 2)
def test_subtraction(self):
self.assertEqual(5 - 3, 2)
if __name__ == '__main__':
unittest.main()
def test_string_length():
assert len("hello") == 5
def test_list_operations():
my_list = [1, 2, 3]
my_list.append(4)
assert my_list == [1, 2, 3, 4]
| 框架 | 优点 | 缺点 | 最适合的场景 |
|---|---|---|---|
| unittest | 内置,面向对象风格 | 冗长,灵活性较差 | 标准库项目 |
| pytest | 语法简单,功能强大 | 需要安装 | 复杂测试场景 |
| nose2 | 易于使用 | 开发活跃度较低 | 中小型项目 |
## 安装 pytest
sudo apt update
pip3 install pytest
## 安装 nose2
pip3 install nose2
import pytest
@pytest.mark.parametrize("input,expected", [
(2, 4),
(3, 9),
(4, 16)
])
def test_square(input, expected):
assert input ** 2 == expected
from unittest.mock import patch
def test_external_api_call():
with patch('requests.get') as mock_get:
mock_get.return_value.status_code = 200
## 测试 API 交互
在学习 Python 测试框架时,LabEx 提供交互式环境,帮助你通过实践来理解这些概念。
def calculate_area(length, width):
return length * width
def test_calculate_area():
assert calculate_area(4, 5) == 20
assert calculate_area(0, 10) == 0
assert calculate_area(-2, 3) == -6
def reverse_string(text):
return text[::-1]
def test_reverse_string():
assert reverse_string("hello") == "olleh"
assert reverse_string("") == ""
assert reverse_string("12345") == "54321"
def divide_numbers(a, b):
if b == 0:
raise ValueError("Cannot divide by zero")
return a / b
def test_divide_numbers():
assert divide_numbers(10, 2) == 5
import pytest
with pytest.raises(ValueError):
divide_numbers(10, 0)
def filter_even_numbers(numbers):
return [num for num in numbers if num % 2 == 0]
def test_filter_even_numbers():
assert filter_even_numbers([1, 2, 3, 4, 5, 6]) == [2, 4, 6]
assert filter_even_numbers([]) == []
assert filter_even_numbers([1, 3, 5]) == []
class Calculator:
def add(self, a, b):
return a + b
def subtract(self, a, b):
return a - b
def test_calculator():
calc = Calculator()
assert calc.add(3, 4) == 7
assert calc.subtract(10, 5) == 5
import pytest
@pytest.mark.parametrize("input_list,expected", [
([1, 2, 3], 6),
([], 0),
([-1, 1, 0], 0)
])
def test_sum_list(input_list, expected):
assert sum(input_list) == expected
| 策略 | 描述 | 示例 |
|---|---|---|
| 边界测试 | 测试边界情况 | 用最小值/最大值进行测试 |
| 等价类划分 | 将输入划分为有效/无效组 | 测试代表性值 |
| 错误猜测 | 预测潜在错误 | 测试错误处理 |
LabEx 提供交互式环境,帮助你练习编写全面且有效的单元测试。
通过掌握 Python 中的单元测试技术,开发者可以显著提高代码的可靠性和可维护性。理解测试框架、编写有效的测试用例以及实施系统的测试方法,是生产出符合专业标准并将潜在运行时错误降至最低的高质量 Python 软件的必备技能。