Pytest测试框架基础

2017 篇文章 51 订阅
1237 篇文章 21 订阅

1、Pytest框架简介

1.1 Pytest简介

Pytest是一款功能强大的Python测试框架,专为简化测试编写过程和满足复杂测试需求而设计。自2004年首次发布以来,Pytest已经成为Python社区中最受欢迎的测试工具之一。通过简洁的语法、自动化的测试发现机制和丰富的插件系统,它提供了极大的灵活性和扩展性,帮助开发者有效地编写和执行测试用例。

1.2 Pytest特点

  • 简单灵活易上手:Pytest通过简单的函数或类即可编写测试,无需复杂的设置或继承特定的测试类。

  • 强大的断言机制:内置丰富的断言方法,提供详细的失败信息,帮助开发者快速定位问题。

  • 自动发现测试:自动发现符合规定的测试文件和测试函数,无需显式注册测试。

  • 丰富的插件系统:支持广泛的第三方插件,如pytest-selenium、pytest-html、allure等,增强测试功能。

  • 参数化和控制测试:支持参数化测试,允许以数据驱动方式运行多个测试用例。同时,可以控制测试用例的执行顺序和选择特定测试用例运行。

1.3 python安装pytest

# 安装pytest
pip install -U pytest
# 查看版本
pytest --version

2、Pytest使用方法

2.1 Pytest用例设计规则

用Pytest写用例时,一定要按照以下规则写,否则不符合规则的测试用例不会执行:

  • 文件名以 test_*.py 文件和*_test.py

  • 以test_开头的函数

  • 以Test开头的类,不能包含 __init__ 方法

  • 以test_开头的类里面的方法

  • 所有的包package必须要有__init__.py 文件

2.2 Pytest用例执行规则

# 执行某个目录下所有的用例
pytest
# 执行某一个py文件下用例
pytest 脚本名称.py
# 执行xx.py模块里面的某个函数
pytest xx.py::test_func
# 执行xx.py模块里面的某个类里面的方法,加-v打印的信息更详细
pytest xx.py::TestClass::test_method
pytest -v xx.py::TestClass::test_method

# 执行pytest时,以下是各参数作用:

# 简单打印,只打印测试用例的执行结果:-q
pytest -q xx.py
# 详细打印:-s
pytest -s xx.py
# 遇到错误时停止测试:-x
pytest xx.py -x
# 当用例错误个数达到指定数量时,停止测试:—maxfail=num
pytest xx.py --maxfail=1
# 匹配用例名称:-k(执行测试用例名称包含cs的所有用例)
pytest -s -k "cs" xx.py
# 根据用例名称排除某些用例:-k
pytest -s -k "not cs" xx.py
# 同时匹配不同的用例名称:-k
pytest -s -k "cs or cs1" xx.py

2.3 setup、teardown方法

pytest的setup和teardown是用于测试用例初始化和清理的重要工具,提供了多个级别的测试环境管理,包括模块级别、函数级别、类级别和方法级别。

  • 模块级别

setup_module:在模块中的第一个测试用例开始前执行,用于进行一些全局初始化操作,例如打开数据库连接或启动浏览器。

teardown_module:在模块中的最后一个测试用例结束后运行,用于进行全局清理操作,例如关闭数据库连接或浏览器。

  • 函数级别

setup_function:在每个测试函数前后运行,只对函数用例生效,不在类中定义的方法中使用。

teardown_function:在每个测试函数用例结束后执行,用于清理特定于该测试函数的资源。

  • 类级别

setup_class:位于类中,在测试类中的第一个测试方法运行前执行,用于初始化共享资源,如创建测试数据或配置对象。

teardown_class:位于类中,在测试类中的最后一个测试方法结束后执行,用于销毁在 setup_class 中创建的资源。

  • 方法级别

setup_method:位于类中,在每个测试方法开始前执行,可以用于为每个测试方法准备独立的环境或数据。

teardown_method:位于类中,在每个测试方法结束后执行,确保清理工作彻底进行,避免测试方法之间的资源冲突。

setup:与 setup_method 相似,但使用更为灵活,可在类或函数中定义。

teardown:与 teardown_method 相似,用于每个测试方法结束后的清理工作。

2.4 assert断言

pytest断言是Python测试框架pytest中的一种功能,用于验证代码的正确性。它提供了一组内置的断言方法,可以用来检查代码的行为是否符合预期。

以下是一些常用的pytest断言方法:

  • assert: 最基本的断言方法,用于检查一个条件是否为真。如果条件为假,则测试失败。

assert condition, "Error message"
  • assertEqual(a, b): 检查两个值是否相等。如果不相等,测试失败。

assert a == b, "Values are not equal"
  • assertNotEqual(a, b): 检查两个值是否不相等。如果相等,测试失败。

assert a != b, "Values are equal"
  • assertTrue(x): 检查一个条件是否为真。如果条件为假,测试失败。

assert x, "Condition is not true"
  • assertFalse(x): 检查一个条件是否为假。如果条件为真,测试失败。

assert not x, "Condition is true"
  • assertIs(a, b): 检查两个对象是否是同一个对象(内存地址相同)。如果不是,测试失败。

assert a is b, "Objects are not the same"
  • assertIsNot(a, b): 检查两个对象是否不是同一个对象。如果是,测试失败。

assert a is not b, "Objects are the same"
  • assertIn(item, container): 检查一个元素是否在容器中(如列表、元组、字典等)。如果不在,测试失败。

assert item in container, "Item is not in container"
  • assertNotIn(item, container): 检查一个元素是否不在容器中。如果在,测试失败。

assert item not in container, "Item is in container"

2.5 fixture的使用

pytest的fixture是一种特殊的函数,它可以为测试提供一种固定的环境或数据。fixture可以用于设置测试前的准备工作,如创建数据库连接、打开文件等,也可以用于在测试后进行清理工作,如关闭数据库连接、删除临时文件等。

前面讲了setup、teardown可以实现在执行用例前或结束后加入一些操作,但这种都是针对整个脚本全局生效的。如果有以下场景:用例1需要先登录,用例2不需要登录,用例3需要先登录。很显然无法用setup和teardown来实现了。fixture可以让我们自定义测试用例的前置条件。

使用@pytest.fixture装饰器来定义一个fixture。@pytest.fixture的参数主要包括scope、params、autouse、ids和name。这些参数允许用户自定义fixture的行为,以适应不同的测试需求。下面是这些参数的详细解析:

'''
1、scope:控制fixture的作用范围。取值可为function、class、module、session,默认值为function:
----function:每个测试函数都会执行一次 fixture。
----class:每个测试类(包含多个测试函数)执行前执行一次 fixture。
----module:每个测试模块(包含多个测试类或测试函数)执行前执行一次 fixture。
----session:整个测试会话(包含多个测试模块)开始前执行一次 fixture
2、params:用于fixture的参数化,支持列表、元组、字典列表和字典元组等形式。通过params参数化,可以为测试提供多组数据,增强测试覆盖率。例如,@pytest.fixture(params=[1, 2, 3])将生成三组测试数据。
3、autouse:设置为True时,该fixture会自动应用于所有测试函数,而无需显式传入。这在需要全局应用某些设置时非常有用。
4、ids:用于为参数化后的fixture指定一个易读的名称,有助于在测试结果中识别不同的参数组合。
5、name:给fixture指定一个别名,适用于在测试函数中使用时的识别
'''

@pytest.fixture(scope="function", params=None, autouse=False, ids=None, name=None)
def test():
    print("fixture初始化的参数列表")

2.6 @pytest.mark使用

pytest.mark是pytest框架中用于对测试用例进行标记(或称为装饰)的一个功能,它允许你以灵活的方式组织和选择性地执行测试用例。pytest.mark提供了一系列内置的标记(如@pytest.mark.skip、@pytest.mark.xfail等),同时也允许自定义标记。

内置标记

# 跳过测试用例,可选地提供一个原因字符串。
@pytest.mark.skip(reason=None):

# 预期失败的测试用例,可以基于条件来标记。
@pytest.mark.xfail(condition=None, reason=None, raises=None, run=True, strict=False):

# 参数化测试用例,允许你使用不同的参数多次运行同一个测试函数。
@pytest.mark.parametrize(*args, **kwargs):

# 直接在测试用例上声明需要使用的fixtures,而不是将它们作为参数传递。
@pytest.mark.usefixtures(*fixturenames):

自定义标记

import pytest
  
# 定义自定义标记
slow = pytest.mark.slow
  
# 使用自定义标记
@slow
def test_function():  
    pass

2.7 @pytest.mark.parametrize使用

@pytest.mark.parametrize是pytest框架中一个非常有用的装饰器,它允许使用不同的参数多次运行同一个测试函数。这对于测试具有多个输入值的情况特别有用,因为它可以减少重复代码,并使你的测试更加清晰和可维护。

基本用法:@pytest.mark.parametrize装饰器接受一个或多个参数,每个参数都是一个包含两个元素的元组(或其他可迭代对象),其中第一个元素是参数名(一个字符串),第二个元素是一个参数值的列表或元组。然后,它会为参数值的每个组合生成一个新的测试用例。

注:@pytest.mark.parametrize支持多种数据类型,还有多种高级使用方法,下面是最常见的一种基础使用案例:

import pytest
  
# 使用 @pytest.mark.parametrize 装饰器
@pytest.mark.parametrize("test_input,expected", [
    (1, 2),
    (2, 3),
    (3, 4),
])
def test_increment(test_input, expected):  
    assert test_increment_function(test_input) == expected  

以上只是pytest的一小部分内容,pytest还有丰富的扩展插件和高级的用法还需要去挖掘学习,后面在python接口自动化中将继续介绍pytest框架。

行动吧,在路上总比一直观望的要好,未来的你肯定会感 谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入群: 759968159,里面有各种测试开发资料和技术可以一起交流哦。

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

在这里插入图片描述

 ​​​​软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

  • 11
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值