pytest框架详解

Pytest框架
1.简介

pytest是纯python编写的自动化测试框架,可以支持python语法编写测试用例,是一个非常成熟的全功能的Python测试框架。

主要有以下几个特点:

  • 简单灵活,容易上手;
  • 支持参数化;
  • 能够支持简单的单元测试和复杂的功能测试,还可以结合selenium、requests做自动化测试;
  • pytest具有很多第三方插件,并且可以自定义扩展。

安装:pip install pytest

官方文档:https://docs.pytest.org

2.创建第一个pytest用例
def func(x):
    return x + 1


def test_answer():
    assert func(3) == 5
pytest命名规范:
  • 测试模块:以 test_ 开头命名,如:test_login.py,或以 _test 结尾;

  • 测试类:必须以Test开头命名,且测试类中不能有 __init__ 方法;

  • 测试方法/测试函数:必须以test开头。

运行参数:
  • 无参数:读取路径下符合条件的所有类、函数、方法全部执行;
  • -v:打印详细运行日志;
  • -s:打印print输出;
  • -k: ​跳过运行某个或某些用例
    pytest -k ‘类名’
    pytest -k ‘方法名’
    pytest -k ‘类名 and not 方法名’ # 运行类里所有方法,不包含某个方法
  • -x:运行用例失败立即停止运行
  • –maxfail
    用例失败数达到某个设定的值停止运行
    pytest --maxfail=[num]
  • -m 运行所有@pytest.mark.[标记名] 标记的用例
3.pytest报告
3.1 安装测试报告需要的模块

pip install pytest-html

3.2 输出时指定参数

pytest xxx.py --html=report-html

4.pytest实现数据驱动
  • Pytest 测试框架的数据驱动是由 pytest 自带的pytest.mark.parametrize()来实现的。

  • @pytest.mark.parametrize() 装饰器接收两个参数:
    第一个参数以字符串的形式存在,它代表能被测试函数所能接受的参数,如果被测试函数有多个参数,则以逗号分隔;
    第二个参数用于保存测试数据。如果只有一组数据,以列表的形式存在,如果有多组数据,以列表嵌套元组的形式存在(例如: [1,1]或者[(1,1), (2,2)])。

  • 实战:

class Test01:
    @pytest.mark.parametrize('a,b,expect',[(1,1,1),(2,3,5)])
    def test_001(self,a,b,expect):
        print('测试a+b的结果')
        assert a+b==expect

    @pytest.mark.parametrize('c,d,expect', [(2, 4, 2), (9, 10, 1)])
    def test_002(self,c,d,expect):
        assert d-c==expect


if __name__ == '__main__':
    pytest.main([__file__, '-k','test_001'])
5.pytest fixtures
5.1 fixture用途
  • fixture主要用来做初始化环境以及测试结束后的数据清除。
  • pytest fixture与setup,teardown功能一样,但比之更加灵活,完全可以代替setup,teardown。
5.2 fixture参数详解
@pytest.fixture(scope='function',params=None,autouse=False,ids=None,name=None)
yield
"""
@pytest.fixture:装饰器,相当于setup,测试用例的前置。
scope: 有四个级别参数'function(默认)'、'class'、'module'、'session'。
params:一个可选的参数列表,列表中每个数据都可以作为用例的输入。也就说有多少数据,就会形成多少用例。可以通过request.param来获取该次调用的参数。
autouse:如果True,自动调用fixture功能。如果为False则需要调用fixture。
ids:每个字符串id的列表,每个字符串对应于params这样他们就是测试ID的一部分。如果没有提供ID它们将从params自动生成。
name:fixture的名称。这默认为装饰函数的名称。如果fixture在定义它的统一模块。
yield:这个关键字之后的代码相当于teardown,测试用例的后置。
"""

5.3 fixture的作用范围
fixture里面有个scope参数可以控制fixture的作用范围:session>module>class>function
-function:每一个函数或方法都会调用
-class:每一个类调用一次,一个类中可以有多个方法
-module:每一个.py文件调用一次,该文件内又有多个function和class
-session:是多个文件调用一次,可以跨.py文件调用,每个.py文件就是module
5.4 调用fixture的三种方法
5.4.1 函数或类里直接传fixture的函数名称
@pytest.fixture()
def test1():
    print('\n用例开始执行\n')
    yield
    print('\n用例执行结束\n')

def test_a(test1):
    assert 1==1
5.4.2 使用装饰器@pytest.mark.usefixtures()修饰需要运行的用例
@pytest.fixture()
def test1():
    print('\n用例开始执行\n')
    yield
    print('\n用例执行结束\n')

@pytest.mark.usefixtures('test1')
def test_a():
    assert 1==1
5.4.3 叠加usefixtures

如果一个方法或者一个class用例想要同时调用多个fixture,可以使用@pytest.mark.usefixtures()进行叠加。注意叠加顺序,先执行的放底层,后执行的放上层。

@pytest.fixture()
def test1():
    print('\n用例开始执行function1\n')

@pytest.fixture()
def test2():
    print('\n用例开始执行function2\n')

@pytest.mark.usefixtures('test1')
@pytest.mark.usefixtures('test2')
def test_a():
    assert 1==1

usefixtures与传fixture区别

fixture有返回值,那么usefixture就无法获取到返回值,这个是装饰器usefixture与用例直接传fixture参数的区别。

当fixture需要用到return出来的参数时,只能讲参数名称直接当参数传入,不需要用到return出来的参数时,两种方式都可以。

6.skip – 跳过测试
6.1 pytest.skip()

​ 用于函数内,跳过测试用例

@pytest.mark.parametrize('a,b,expect',[(1,1,1),(2,3,5)])
    def test_001(self,test1,a,b,expect):
        pytest.skip('跳过该测试用例')
        assert a+b==expect
6.2 @pytest.mark.skip(reason=“”)

​ 用于函数外,跳过测试用例

@pytest.mark.skip(reason="feature not implemented")@pytest.mark.parametrize('a,b,expect',[(1,1,1),(2,3,5)])
    def test_001(self,test1,a,b,expect):
        assert a+b==expect
6.3 @pytest.mark.skipif(condition=,reason=)

​ 用在函数外,条件condition为True时,跳过用例。

@pytest.mark.skipif(condition=True,reason="feature not implemented")
    @pytest.mark.parametrize('a,b,expect',[(1,1,1),(2,3,5)])
    def test_001(self,test1,a,b,expect):
        assert a+b==expect
7.rerunfailure–失败重跑

安装pytest-rerunfailure,在设置文件pytest.ini中添加命令

reruns = 重跑次数
addopts= --reruns =10
8.Mark装饰器之order–执行顺序
  • 控制用例执行顺序的方法;
  • 在需要调整用例执行顺序的函数(或方法)前增加,如@pytest.mark.run(order=x),x表示数字;
  • 执行顺序,由小到大、由正到负、未标记的在正数后、负数前执行,顺序为:1,2,3,无标记,-3,-2,-1;

你可能感兴趣的:(pytest)