Python自动化测试框架pytest的详解安装与运行

  • Post category:Python

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分别用于为测试用例提供不同的输入和输出,并测试是否正确读写文件。