在 pytest
中,可以使用多种方式进行断言,以验证测试用例的预期结果。以下是一些常见的断言方法:
使用 Python 的内置 assert
语句进行断言。
def test_example():
assert 1 == 1
使用 pytest
提供的 pytest
对象进行更详细的断言。
def test_equality():
assert 1 == 1
assert 1 != 2
检查一个对象是否包含另一个对象。
def test_inclusion():
assert 'hello' in 'hello world'
assert 'goodbye' not in 'hello world'
检查表达式的真值。
def test_truthiness():
assert True
assert not False
使用 pytest.raises
作为上下文管理器来断言代码块是否抛出异常。
def test_exception():
with pytest.raises(ZeroDivisionError):
1 / 0
使用 pytest.warns
来断言代码块是否发出特定的警告。
import warnings
def test_warning():
with pytest.warns(UserWarning):
warnings.warn("This is a warning", UserWarning)
对于浮点数,可以使用 pytest.approx
来断言两个数值近似相等。
def test_approx():
assert 2.2 == pytest.approx(2.3)
assert 2.0 == pytest.approx(2.0)
检查集合是否相等。
def test_set_equality():
assert set([1, 2, 3]) == set([3, 2, 1])
检查字典是否相等。
def test_dict_equality():
assert {'a': 1, 'b': 2} == {'b': 2, 'a': 1}
使用 pytest
提供的 pytest_assertrepr_compare
和 pytest.register_assert_rewrite
进行更复杂的断言。
def test_callback():
assert some_custom_condition(value)
对于更复杂的数据结构,可以使用 pytest
提供的 pytest
对象的内置方法,如 pytest.raises
、pytest.warns
等。
使用 pytest
的 re
模块进行正则表达式匹配。
import re
def test_regex_match():
assert re.search(r"foo", "foobar")
验证列表或集合的长度是否符合预期。
def test_list_length():
assert len([1, 2, 3]) == 3
使用 pytest.mark.parametrize
进行参数化测试,并在每个参数组合中应用断言。
@pytest.mark.parametrize("a,b,expected", [(1, 2, 3), (2, 3, 5)])
def test_addition(a, b, expected):
assert a + b == expected
使用 pytest
的 mock
对象来断言某个对象的方法是否被调用。
from unittest.mock import Mock
def test_mock_call():
mock_obj = Mock()
mock_obj.some_method()
mock_obj.some_method.assert_called_once()
检查对象的属性值。
def test_attribute():
class MyClass:
def __init__(self):
self.my_attr = 42
obj = MyClass()
assert obj.my_attr == 42
验证文件内容是否符合预期。
def test_file_content():
with open("test_file.txt", "r") as f:
content = f.read()
assert "expected content" in content
验证异常消息是否符合预期。
def test_exception_message():
try:
1 / 0
except ZeroDivisionError as e:
assert str(e) == "division by zero"
使用 pytest.approx
并指定精度。
def test_float_precision():
assert 1.1 == pytest.approx(1.10001, abs=1e-5)
检查迭代器是否产生预期的元素。
def test_iterator():
assert list(iter([1, 2, 3])) == [1, 2, 3]
验证对象是否是特定类型或是否实现了特定的接口。
def test_type():
assert isinstance(1, int)