您的位置:

Pytest-s全面解析

一、pytest是什么

Pytest-s是一个Python的单元测试框架,基于unittest框架的一个替代方案。其代码量较小且易于学习使用。

它支持参数化测试、fixture和测试运行的自定义等功能。此外,Pytest-s还支持其他插件,如allure报告、mypy静态类型检查以及pytest-xdist并行执行等。

下面我们将结合实例来介绍Pytest-s的用法和技巧。

二、pytest-s是运维良心

Pytest-s适合于在Devops流程中使用,其轻量、投入成本低的特性与Devops实践完美契合。同时,Pytest-s 的parametrize功能使得测试用例可以在多个环境中运行,而无需对代码进行修改。这为代码移植和部署提供了便利。

例如,我们可以通过下面的代码展示Pytest-s的parametrize功能:

import pytest

@pytest.mark.parametrize("test_input, expected_output", [(1,2), (4,4)])
def test_simple(test_input, expected_output):
    assert test_input+1 == expected_output

上述代码中,我们在定义测试用例时用@pytest.mark.parametrize来指定参数输入以及期望的输出。每一组输入和输出的数据用元组的方式存储,而不是通过多个测试用例定义。

三、pytest实战

接下来,我们将通过实例介绍使用Pytest-s进行测试。

pytest实例化

我们来看看如何创建一个测试用例。

例如,我们要测试一个计算器的加法功能:

class TestCalc:
    def test_add(self):
        assert add(2,3) == 5

在上述代码中,我们定义了一个测试类TestCalc,其中包含一个test_add测试方法。我们通过assert来断言计算结果是否满足我们的预期结果。

pytest数据驱动

有时候我们需要多次测试同一个的函数,但是传入的参数不同。这时候就需要使用Pytest-s的数据驱动功能。

testdata = [
    (2,3,5), 
    (3,4,7), 
    (5,6,11),
]

@pytest.mark.parametrize("a,b,expected", testdata)
def test_add(a,b,expected):
    assert add(a,b) == expected

这里我们将测试用例数据定义为一个包含多个元组的列表,元组中存储的是测试用例的参数以及期望的结果。在测试用例定义时,我们使用@pytest.mark.parametrize来指定参数输入和期望的输出。

pytest是什么意思

通常情况下,Pytest-s的测试用例是一个def函数,需要在函数体中添加assert语句进行判断。assert语句使得我们可以清晰地表达每个测试的期望结果。

我们来看一个例子:

def test_hello():
    assert hello() == 'Hello World'

上述代码中,我们定义了一个test_hello测试函数,其中的assert语句表示我们期望函数hello()的返回结果是'Hello World'。如果测试通过,我们将获得一条最终结果为"1 passed"的测试成功信息。

pytest是python

Pytest-s是用Python实现的,因此它与Python的结合是无缝的。我们可以将Pytest-s的fixture与Python的with open函数结合起来使用。

@pytest.fixture
def tmp_file(request):
    file_ = open('tmp_file', 'w')
    file_.write(request.function.__name__)
    file_.close()
    yield file_.name
    os.unlink(file_.name)

def test_tmp_file(tmp_file):
    with open(tmp_file) as f:
        assert f.read() == 'test_tmp_file'

在上述代码中,我们定义了一个fixture名为"tmp_file",该fixture会创建一个名为"tmp_file"的临时文件,并在临时文件中写入测试函数的名称。在测试代码中,我们使用了Python的with open函数读取了临时文件的内容,并断言其是否与测试函数的名称相等。

pytest生成allure报告

Pytest-s支持多种报告,其中allure报告是Pytest-s最常用的报告。allure报告优美、丰富,提供了多个视图、图表以及细节信息的交互式展示。同时,allure报告也支持自我定制以及扩展。下面我们将为您提供allure报告的生成方法。

pytest test.py --alluredir=./allure_results
allure generate ./allure_results/ -o ./allure_report/ --clean

上述代码中,我们需要先通过pytest指定--alluredir参数生成测试结果数据,并将其放置在 ./allure_results目录下。随后,我们使用allure generate命令将 allue_results 目录下的数据生成静态html文件,并在 ./allure_report/路径下生成报告。

pytest生成报告

除了allure报告,Pytest-s也支持其他的报告类型。例如,使用pytest-html报告器可以生成HTML测试报告。

pip install pytest-html
pytest --html=report.html

在上述代码中,我们需要先安装pytest-html模块,然后使用pytest --html=report.html命令即可在当前目录下生成测试报告report.html。

pytest数据层选取

我们可以选择不同的数据层来存储测试数据,比如测试数据可以存储在脚本代码、配置文件、数据库或者外部API接口中。

下面我们展示如何在测试脚本中使用配置文件中的数据进行测试。通过configparser模块,我们可以轻松地读取和解析ini格式的配置文件中的数据。

import configparser

config = configparser.ConfigParser()
config.read('config.ini')

def test_config():
    assert config['test']['name'] == 'pytest-s'

在上述代码中,我们使用Python自带的configparser模块读取了名为"config.ini"的配置文件,并且使用断言来判断配置文件中的值是否等于期望值。

总结

本文针对Pytest-s的主要特性和使用方法进行了详细介绍。我们从测试用例的编写到数据驱动的实现,再到如何与Python结合以及报告生成等方面进行了讲解。同时,我们希望本文的实例和技巧能够帮助您在使用Pytest-s时更加熟练、高效地进行测试开发。