Python自动化测试框架pytest的详解安装与运行
简介
pytest是一个基于Python的自动化测试框架,它具有简单易用、扩展性强、支持参数化、支持多种fixture等特点。本教程将为大家介绍pytest的安装和运行过程,以及如何编写测试用例和使用pytest命令行工具进行测试。
安装
在安装pytest之前,需要先安装Python和pip。安装完成之后,可以使用以下命令来安装pytest:
pip install pytest
运行测试
运行测试非常简单,只需在终端中进入测试代码所在的文件夹,然后输入以下命令:
pytest
pytest会自动查找以“test_”开头或以“_test.py”结尾的文件,并执行其中的测试用例。在测试完成之后,pytest会给出测试结果的统计信息,例如测试用例数量、成功和失败的数量以及测试用时等。
编写测试用例
Test函数
一个pytest测试用例是一个普通的Python函数,可以在其中使用Python的所有语法和库。在pytest中,测试函数通常以“test_”开头。下面是一个简单的测试用例示例:
def test_addition():
assert 1+1 == 2
参数化
pytest支持使用@pytest.mark.parametrize装饰器为测试用例提供参数。下面是一个使用参数化的测试用例示例:
import pytest
@pytest.mark.parametrize("a,b,expected", [
(1, 2, 3),
(3, 4, 7),
(5, 6, 11)
])
def test_addition(a, b, expected):
assert a + b == expected
在这个测试用例中,使用pytest.mark.parametrize装饰器给测试用例提供了三组不同的参数,通过分别包含三个数字来定义。
Fixture
Fixture是一个pytest的高级功能,它允许测试用例在运行之前和之后执行一些额外的操作。例如,可以使用Fixture创建测试用例需要使用的资源,例如文件和数据库连接等。下面是一个使用Fixture的测试用例示例:
import pytest
@pytest.fixture
def resource():
return "Hello World"
def test_resource(resource):
assert resource == "Hello World"
在这个测试用例中,使用pytest.fixture装饰器创建了一个名为resource的Fixture。在测试用例中指定resource作为参数,pytest将自动调用Fixture并将其返回值传递给测试用例。在这个例子中,Fixture返回了“Hello World”字符串,测试用例使用断言来检查返回值是否符合预期。
pytest命令行选项
pytest具有大量的命令行选项和自定义配置选项。以下是一些最常用的:
-v
:详细输出测试结果,包括运行的测试用例和每个测试用例的结果。-x
:当遇到测试用例失败时停止执行。-s
:允许测试代码输出到控制台。--maxfail=2
:最多允许两个测试用例失败。--pdb
:当测试用例失败时进入Python的调试器。--collect-only
:只收集测试用例,而不运行它们。--junit-xml=results.xml
:生成JUnit格式的测试结果报告(用于Jenkins等CI工具的集成)
示例1
下面是一个简单的pytest测试用例示例,它用于测试一个名为addition的函数:
def addition(a, b):
return a + b
def test_addition():
assert addition(1, 2) == 3
assert addition(0, 0) == 0
assert addition(-1, 1) == 0
在这个测试用例中,测试用例使用断言来检查addition函数是否按预期进行操作。
示例2
下面是一个更复杂的pytest测试用例示例,它使用Fixture和参数化来测试用于读取和写入文件的readfile和writefile函数:
import os
import pytest
@pytest.fixture
def input_file():
filename = "input.txt"
with open(filename, "w") as f:
f.write("Hello World\n")
yield filename
os.remove(filename)
@pytest.fixture
def output_file():
filename = "output.txt"
yield filename
os.remove(filename)
def readfile(filename):
with open(filename) as f:
return f.read()
def writefile(filename, text):
with open(filename, "w") as f:
f.write(text)
@pytest.mark.parametrize("text", [
"Test 1",
"Test 2",
"Test 3"
])
def test_writefile_and_readfile(input_file, output_file, text):
writefile(output_file, text)
assert readfile(output_file) == text
在这个测试用例中,Fixture用于创建测试用例所需的输入和输出文件。在测试用例中,参数化和Fixture分别用于为测试用例提供不同的输入和输出,并测试是否正确读写文件。