精华内容
下载资源
问答
  • pytest测试框架

    千次阅读 2021-02-24 14:29:05
    要想pytest在不同函数或者包中发现测试用例,需要按照下述规则来定义文件名、类名或者函数名: 文件名以test_开头的py文件 ; 以test_开头的函数 ; 以Test开头的类; 三、示例 # 文件名为 test_firstcase.py

    pytest

    一、安装

    pip install pytest

    安装完成之后查看版本
    pytest --verson

    【注】如果因为pip不是最新的安装失败,可以移步ModuleNotFoundError: No module named ‘pip‘

    二、使用规则

    要想pytest在不同函数或者包中发现测试用例,需要按照下述规则来定义文件名、类名或者函数名:

    1. 文件名以test_开头的py文件 ;
    2. 以test_开头的函数 ;
    3. 以Test开头的类;

    Pytest会在test_*.py 或者 *_test.py 文件中,寻找class外边的test_开头的函数,或者Test开头的class里面的test_开头的方法,将这些函数和方法作为测试用例来管理;

    三、示例

    # 文件名为 test_firstcase.py
    def func(x):
        return x+1
        
    def test_one()assert func(1) == 2
    

    上述即为一个简单的例子,终端执行 pytest test_firstcase.py ,出现如下图所示即测试通过
    测试成功示例
    来一个测试失败的示例:

    def func(x):
        return x+1
        
    def test_one()assert func(1) == 4
    

    很显然,1+1 ≠ 4,测试失败,运行结果如下:
    测试失败示例

    四、pytest各种参数的使用

    使用pytest --help可以看到pytest常用的参数,依次举例试一下前面常用的几个
    pytest参数

    1、 -k EXPRESSION

    即:只运行与给定字符串表达式匹配的测试用例

    #文件名为 testcase.py
    class TestClass(object):
    
        def test_one(self):
            assert 3 == 5
    
        def test_two(self):
            assert 'h' in 'hello'
    

    执行pytest -k "test_one and not test_two" testcase.py,即只执行test-one而不执行test-two,运行结果如下:
    运行结果
    如图显示,1failed,1 deselected,一个运行失败,一个没有被选择执行

    2、 -m MARKEXPR

    即:只运行有相应标识的测试用例,使用这个参数,测试用例要使用@pytest.mark.marker修饰

    #文件名为 testcase.py
    import pytest
    class TestClass(object):
    
        def test_one(self):
            assert 1 == 1
    
        def test_two(self):
            assert 'h' in 'hello'
    
        @pytest.mark.slow
        def test_three(self):
            assert 3 == 3
    
        def test_four(self):
            assert 3 < 5
    
        @pytest.mark.faster
        def test_five(self):
            assert 'a' == 'a'
    

    如上面代码所示,总共定义了五个测试用例,标记了两个,执行pytest -m "slow and faster" testcase.py,则会执行被标记的用例,执行结果如下:
    缺失ini文件
    出现上图情况,百度之后发现是缺少pytest.ini文件,在文件里添加

    [pytest]
    markers = slow
    faster
    

    运行后重新执行pytest -m slow testcase.py,结果如下:

    选择slow标记的测试用例

    3、–maxfail=num

    即:当错误个数达到num时,停止测试,示例:

     from operator import add
    import pytest
    
    class TestClass(object):
    
        def test_one(self):
            assert 1 == 2
    
        def test_two(self):
            assert 'h' in 'ello'
    
        @pytest.mark.slow
        def test_three(self):
            assert 3 == 4
    
        def test_four(self):
            assert 3 < 5
    
        # @pytest.mark.faster
        def test_five(self):
            assert add(1, 2) == 3
    

    执行pytest --maxfail=2 testcase.py
    失败描述
    如上图可以看出,当失败用例等于2时,停止执行后面的测试用例;

    同理:

    pytest -x  #遇到失败直接停止,不详细举例
    

    4、-v

    即:输出更加详细的用例执行信息,包括用例所在的文件名、类名和函数名等
    执行 pytest -v testcase.py,结果如下:
    详细结果

    5、-s

    即:会显示在代码中的print内容

    from operator import add
    import pytest
    
    class TestClass(object):
    
        def test_one(self):
    
            # assert 1 == 2
            print('just a test')
    
        def test_two(self):
    
            assert 'h' in 'hello'
    
        @pytest.mark.slow
        def test_three(self):
    
            assert 3 == 4
    
        def test_four(self):
    
            assert 3 < 5
    
        # @pytest.mark.faster
        def test_five(self):
    
            assert add(1, 2) == 3
    

    执行 pytest -s testcase.py,运行结果为
    运行结果

    6、–collect-only

    即:查看pytest 收集到哪些测试用例:
    执行 pytest --collect-only 可以看到,总共收集到6个测试用例,且在不同的.py文件中
    在这里插入图片描述

    7、fixtures 之 tmpdir

    pytest内置fixtures 之 tmpdir 的作用是: 在本地生成临时文件夹,并返回文件对象

    代码示例:

    # 内置 fixtures 之 tmpdir 的作用是:在本地生成临时文件夹,并返回文件对象
    # 文件名为 test_tmdir.py
    def test_needsfiles(tmpdir):
        print(tmpdir)
        assert 0
    

    执行 pytest test_tmdir.py 结果显示如下:
    图示
    如图显示的路径,可以在C盘找到创建的文件夹
    图示

    8、-r

    即可以用来在测试结束后展示一份“测试概要信息,常用的**-r**后追加的参数有:

    f - failed
    E - error
    s - skipped
    x - xfailed
    X - xpassed
    p - passed
    P - passed with output
    a - all except pP

    代码示例:

    # test_example.py
    
    import pytest
    
    @pytest.fixture
    def error_fixture():
        assert 0
    
    def test_ok():
        print('ok')
    
    def test_fail():
        assert 0
    
    def test_error(error_fixture):
        pass
    
    def test_skip():
        pytest.skip("skipping this test")
    
    def test_xfail():
        pytest.xfail("xfail this test")
    
    @pytest.mark.xfail(reason = 'always xfail')
    def test_xpass():
        pass
    

    执行pytest test_example.py -ra,结果如下,可以看到 a 表示"除了passes的所有信息;

    图示

    如果想看**“failed""skipped”**的测试结果,可以执行pytest test_example.py -rfs,结果如下:
    图示

    9、–durations

    即统计用例运行时间,使用方法是 –durations=N ,当 N=0 的时候显示全部用例的运行时间;–
    如果我们只需要筛选出运行时间最慢的3条用例,可以设置–durations=3
    代码示例:

    from operator import add
    from time import sleep
    
    import pytest
    
    class TestClass(object):
    
        def test_one(self):
            # assert 1 == 2
            sleep(3)
            print('11111111111111')
    
        def test_two(self):
            sleep(2)
            assert 'h' in 'hello'
    
        def test_three(self):
            sleep(1)
            print('33333333333')
            assert 3 == 4
    
        def test_four(self):
            assert 3 < 5
            
        def test_five(self):
            assert add(1, 2) == 3
    
    

    执行pytest test_case.py --durations=0 -vv,结果如下:
    图示
    可以看到,显示了每个测试用例持续的运行时间;
    运行pytest test_case.py --durations=2 -vv,我们看一下持续运行时间最长的两个用例,按照代码显示,应为test_one和test_two,运行结果如下:
    图示

    五、pytest 运行方式

    1、单独执行某个测试文件

    pytest testcase.py
    

    2、执行改目录下的所有测试用例

    pytest testcases
    

    3、单独执行某个测试用例

    # 以函数形式的用例
    pytest test_firstcase.py::test_one
    
    # 以类形式的用例
    pytest testcase.py::TestClass::test_one
    

    【注】Pytest之paramtrize参数化请移步paramtrize

    展开全文
  • pytest fixture为测试准备一个良好的测试环境,测试函数使用的每个 fixture通常有一个参数(以 fixture 命名),测试函数通过参数访问它们。本文将介绍pytest fixture的一些基本用法。 @pytest.fixture import pytest ...

    系列文章目录

    Pytest测试框架(一):pytest安装及用例执行
    Pytest测试框架(二):pytest 的setup/teardown方法
    Pytest测试框架(三):pytest fixture 用法
    Pytest测试框架(四):pytest 参数化用例
    Pytest测试框架(五):pytest + allure生成测试报告
    Pytest插件开发



    xUnit style 结构的 fixture用于初始化测试函数, pytest fixture是对传统的 xUnit 架构的setup/teardown功能的改进。pytest fixture为测试准备一个良好的测试环境,测试函数使用的每个 fixture通常有一个参数(以 fixture 命名),测试函数通过参数访问它们。本文将介绍pytest fixture的一些基本用法。

    @pytest.fixture

    import pytest
    
    @pytest.fixture()
    def login():
        print("登录")
        return 8
    
    class Test_Demo():
        def test_case1(self):
            print("\n开始执行测试用例1")
            assert 1 + 1 == 2
    
        def test_case2(self, login):
            print("\n开始执行测试用例2")
            print(login)
            assert 2 + login == 10
    
        def test_case3(self):
            print("\n开始执行测试用例3")
            assert 99 + 1 == 100
    
    if __name__ == '__main__':
        pytest.main()
    

    test_case2需要调用login方法(或者获取login的返回值),pytest 将会寻找并调用@pytest.fixture标记的login() 方法。

    结果:

    PASSED                           [ 33%]
    开始执行测试用例1
    登录
    PASSED                           [ 66%]
    开始执行测试用例2
    8
    PASSED                           [100%]
    开始执行测试用例3
    

    共享 fixture 函数:conftest.py

    在测试过程中,多个测试文件可能都要调用 fixture 函数,可以将其移动到 conftest.py 文件中。conftest.py 文件中的 fixture 函数不需要在测试函数中导入,可以被 pytest 自动识别,查找顺序从测试类开始,然后是测试模块,然后是 conftest.py 文件,最后是内置插件和第三方插件。

    conftest.py :

    import pytest
    @pytest.fixture()
    def login():
        print("登录")
        return 8
    

    测试用例:

    import pytest
    
    class Test_Demo():
        def test_case1(self):
            print("\n开始执行测试用例1")
            assert 1 + 1 == 2
    
        def test_case2(self, login):
            print("\n开始执行测试用例2")
            print(login)
            assert 2 + login == 10
    
        def test_case3(self):
            print("\n开始执行测试用例3")
            assert 99 + 1 == 100
    
    
    if __name__ == '__main__':
        pytest.main()
    

    结果:

    PASSED                           [ 33%]
    开始执行测试用例1
    登录
    PASSED                           [ 66%]
    开始执行测试用例2
    8
    PASSED                           [100%]
    开始执行测试用例3
    

    yield方法

    使用yield关键字可以实现setup/teardown的功能,在yield关键字之前的代码在case之前执行,yield之后的代码在case运行结束后执行

    import pytest
    
    @pytest.fixture()
    def login():
        print("登录")
        yield
        print("退出登录")
    
    class Test_Demo():
        def test_case1(self):
            print("\n开始执行测试用例1")
            assert 1 + 1 == 2
    
        def test_case2(self, login):
            print("\n开始执行测试用例2")
            assert 2 + 8 == 10
    
        def test_case3(self):
            print("\n开始执行测试用例3")
            assert 99 + 1 == 100
    
    
    if __name__ == '__main__':
        pytest.main()
    

    结果:

    PASSED                      [ 33%]
    开始执行测试用例1
    登录
    PASSED                      [ 66%]
    开始执行测试用例2
    退出登录
    PASSED                      [100%]
    开始执行测试用例3
    
    

    addfinalizer方法

    addfinalizer也可以实现环境的清理,实现与yield方法相同的效果,跟yield不同的是需要注册作为终结器使用的函数。

    import pytest
    
    @pytest.fixture()
    def login(request):
        print("登录")
        def demo_finalizer():
            print("退出登录")
        # 注册demo_finalizer为终结函数
        request.addfinalizer(demo_finalizer)
    
    class Test_Demo():
        def test_case1(self):
            print("\n开始执行测试用例1")
            assert 1 + 1 == 2
    
        def test_case2(self, login):
            print("\n开始执行测试用例2")
            assert 2 + 8 == 10
    
        def test_case3(self):
            print("\n开始执行测试用例3")
            assert 99 + 1 == 100
    
    
    if __name__ == '__main__':
        pytest.main()
    

    结果:

    PASSED               [ 33%]
    开始执行测试用例1
    登录
    PASSED               [ 66%]
    开始执行测试用例2
    退出登录
    PASSED               [100%]
    开始执行测试用例3
    

    fixture 作用范围:Scope

    fixture 作用范围可以为module、class、session和function,默认作用域为function。

    • function:每一个函数或方法都会调用
    • class:每一个类调用一次
    • module:每一个.py文件调用一次
    • session:是多个文件调用一次

    scope=“function”

    import pytest
    
    @pytest.fixture(scope="function")
    def login():
        print("登录...")
    
    class Test_Demo():
        def test_case1(self, login):
            print("\n开始执行测试用例1")
            assert 1 + 1 == 2
    
        def test_case2(self, login):
            print("\n开始执行测试用例2")
            assert 2 + 8 == 10
    
        def test_case3(self, login):
            print("\n开始执行测试用例3")
            assert 99 + 1 == 100
    
    if __name__ == '__main__':
        pytest.main()
    

    结果:

    登录...
    PASSED                      [ 33%]
    开始执行测试用例1
    登录...
    PASSED                      [ 66%]
    开始执行测试用例2
    登录...
    PASSED                      [100%]
    开始执行测试用例3
    

    scope=“class”

    一个class里面多个用例都调用了此fixture,那么只在class里所有用例开始前执行一次

    import pytest
    
    @pytest.fixture(scope="class")
    def login():
        print("登录...")
    
    

    结果:

    登录...
    PASSED                      [ 33%]
    开始执行测试用例1
    PASSED                      [ 66%]
    开始执行测试用例2
    PASSED                      [100%]
    开始执行测试用例3
    

    fixture自动应用

    autouse参数

    autouse设置为True时,自动调用fixture功能。由于默认作用域为function,不指定scope则每个方法都会调用fixture方法。

    import pytest
    
    @pytest.fixture(autouse=True)
    def login():
        print("登录...")
    
    class Test_Demo():
        def test_case1(self):
            print("\n开始执行测试用例1")
            assert 1 + 1 == 2
    
        def test_case2(self):
            print("\n开始执行测试用例2")
            assert 2 + 8 == 10
    
        def test_case3(self):
            print("\n开始执行测试用例3")
            assert 99 + 1 == 100
    
    
    if __name__ == '__main__':
        pytest.main()
    

    结果:

    登录...
    PASSED                    [ 33%]
    开始执行测试用例1
    登录...
    PASSED                    [ 66%]
    开始执行测试用例2
    登录...
    PASSED                    [100%]
    开始执行测试用例3
    

    @pytest.mark.usefixtures()

    在测试方法上加@pytest.mark.usefixtures()

    import pytest
    
    @pytest.fixture()
    def login():
        print("登录...")
    
    @pytest.mark.usefixtures("login")
    class Test_Demo():
        def test_case1(self):
            print("\n开始执行测试用例1")
            assert 1 + 1 == 2
    
        def test_case2(self):
            print("\n开始执行测试用例2")
            assert 2 + 8 == 10
    
        def test_case3(self):
            print("\n开始执行测试用例3")
            assert 99 + 1 == 100
    
    
    if __name__ == '__main__':
        pytest.main()
    

    结果:

    登录...
    PASSED                [ 33%]
    开始执行测试用例1
    登录...
    PASSED                [ 66%]
    开始执行测试用例2
    登录...
    PASSED                [100%]
    开始执行测试用例3
    

    fixture函数参数化

    如果多条用例都需要调用相同参数,可以将fixture函数参数化。fixture 函数将执行每个参数值,fixture通过固定参数request传递。

    import pytest
    
    @pytest.fixture(scope="module", params=[
        [1, 1, 2],
        [2, 8, 10],
        [99, 1, 100]
    ])
    def data(request):
        yield request.param
    
    class Test_Demo():
        def test_case1(self):
            print("\n开始执行测试用例1")
            assert 2 + 8 == 10
    
        def test_case2(self, data):
            print("\n开始执行测试用例2")
            assert data[0] + data[1] == data[2]
    
        def test_case3(self):
            print("\n开始执行测试用例3")
            assert 99 + 1 == 100
    
    
    if __name__ == '__main__':
        pytest.main()
    

    结果:

    PASSED                     [ 20%]
    开始执行测试用例1
    PASSED              [ 40%]
    开始执行测试用例2
    PASSED              [ 60%]
    开始执行测试用例2
    PASSED              [ 80%]
    开始执行测试用例2
    PASSED                     [100%]
    开始执行测试用例3
    
    --THE END--

    文章标题:Pytest测试框架(三):pytest fixture 用法
    本文作者:hiyo
    本文链接:https://blog.csdn.net/u010698107/article/details/111416069
    欢迎关注公众号:「测试开发小记」及时接收最新技术文章!

    展开全文
  • pytest测试框架详解一、pytest介绍二、用例默认编写规则三、用例分类3.1、标记步骤3.1.1、注册标签名3.1.2、给用例打标记3.1.3、运行标记用例3.2、标记总结四、用例前置和后置4.1 通过setup和teardown4.2 通过...

    一、pytest介绍

    pytest是一个非常成熟的全功能的Python测试框架,主要特点有以下几点:
    1、简单灵活,容易上手,文档丰富;
    2、支持参数化,可以细粒度地控制要测试的测试用例;
    3、能够支持简单的单元测试和复杂的功能测试,还可以用来做;selenium/appnium等自动化测试、接口自动化测试pytest+requests;
    4、pytest具有很多第三方插件,并且可以自定义扩展;

    二、用例默认编写规则

    • 测试文件默认以test_开头(以_test结尾也可以);
    • 测试类默认以Test开头,并且不能带有 init 方法;
    • 测试函数默认以test_开头;
    • 断言使用基本的assert即可;

    三、用例分类

    • 通过自带的装饰器@pytest.mark来标记测试用例;
    • 执行的时候带上参数"-m"即可只运行标记的类和方法;

    3.1、标记步骤

    3.1.1、注册标签名

    通过 pytest.ini 配置文件注册,在文件当中的添加如下
    [pytest]
    markers=
                    标记:标记说明
                    …

    在这里插入图片描述

    3.1.2、给用例打标记

    注意:pytestmark是固定的

    • 可以标记文件,文件下的所有用例都会打上标记
      在文件下全局变量处打上标记pytestmark = [pytest.mark.标签1,pytest.mark.标签2]
      在这里插入图片描述

    • 可以标记测试类,类型的所有用例都会打上标记
      1、可以在类前使用装饰器@pytest.mark.xxx;
      2、也可以在类下使用pytestmark = [pytest.mark.标签1];

    • 可以直接标记测试用例
      在用例前使用装饰器@pytest.mark.xxx给用例打上标记
      在这里插入图片描述

    3.1.3、运行标记用例

    调用 pytest.main()函数带上命令参数["-m 标签名"]即可,支持and与or关系运算;

    • 运行单个标记如pytest.main(["-m 标签1"]);
    • 运行多个标记如pytest.main(["-m 标签1 and 标签2"])或者pytest.main(["-m 标签1 or 标签2"]);

    3.2、标记总结

    • 一条用例可以有多个标记;
    • 可以同时运行符合多个条件的标签,-m “标签1 and 标签2”;
    • 取消警告信息,需要结合pytest.ini文件来使用;
    • 可以使用pytest.mark来标记类、模块、方法;
    • 可以以装饰器的方式标记,也可以使用关键变量pytestmark标记;

    四、用例前置和后置

    Pytest处理前置后置有两种方式可以处理:
    1、第一种是通过setup和teardown这样的方法去处理;
    2、第二种是通过fixture来实现的;

    4.1 通过setup和teardown

    1、模块级(setup_module/teardown_module),开始于模块始末,作用于全局(总用各执行一次);
    用法:函数放在类外面才能生效;
    2、函数级(setup_function/teardown_function),仅对函数用例生效(即不在类中,每个函数执行一次);
    用法:函数放在类外面才能生效;
    3、类级(setup_class/teardown_class),只在类中前后运行一次;
    用法:函数放在类里面才能生效;
    4、方法级(setup_method/teardown_method),开始于方法始末(在类中,每个方法执行一次);
    用法:函数放在类里面才能生效;
    5、类里面的(setup/teardown),运行在调用方法的前后(每个方法执行一次);
    用法:函数放在类里面才能生效;

    类级、方法级、类里面的前后置处理顺序:
    A、setup_class是在所有用例执行前运行的,teardown_class是在所有用例执行完成后运行的。
    B、setup_method是在每一条用例执行前,且在setup执行前运行的,teardown_method是在每一条用例执行完成后,且在teardown执行完成后运行的。
    C、setup是在每条用例执行前运行,teardown是在每条用例执行完成后运行。
    所以,他们的顺序是:
    setup_class-
    setup_method-setup-用例1-teardown-teardown_method-
    setup_method-setup-用例2-teardown-teardown_method-
    setup_method-setup-用例n-teardown-teardown_method-
    ……
    teardown_class
    

    4.2 通过fixture

    pytest.fixture():作用于模块内的所有用例,但需要传递装饰函数为参数,可置于class内或class外;
    1、fixture 可以作为一个函数的参数被调用
    在这里插入图片描述
    2、fixture可以在一个类、或者一个模块、或者整个session中被共享,加上范围scope参数即可,如@pytest.fixture(scope=‘module’)

    • 会话级别: session,整个测试执行会话全部用例开始前执行/全部用例执行完后执行(是多个文件调用一次)
    • 模块级别: module,只对模块级别生效,全部用例开始前执行/全部用例执行完后执行(每个.py文件调用一次)
    • 类级别: class,只对类级别生效,整个测试类全部用例开始前执行/全部用例执行完后执行(每一个类调用一次)
    • 函数级别: function,只对函数级别生效,每个用例开始前和结束后执行一次(每一个函数或方法都会调用)

    3、fixture也可以单独存放
    有的时候为了方便配置和访问,共享 fixture 函数,也可以将这样的fixture放到conftest.py文件中单独存放;conftest.py 文件中的 fixture 函数不需要在测试函数中导入,可以被 pytest 自动识别,查找顺序从测试类开始,然后是测试模块,然后是 conftest.py 文件,最后是内置插件和第三方插件。
    4、同一个模块里出现多个范围的装饰
    当出现多个范围装饰则优先实例化范围优先级高的,也就是优先级从大到小:session–>module–>class–>function;
    6、yield方法实现setup/teardown的功能
    在yield关键字之前的代码在case之前执行,yield之后的代码在case运行结束后执行

    @pytest.fixture()
    def login():
        print(\"登录\")
        yield
        print(\"退出登录\")
    

    7、addfinalizer方法实现setup/teardown的功能
    addfinalizer也可以实现环境的清理,实现与yield方法相同的效果,跟yield不同的是需要注册作为终结器使用的函数

    例如:
    @pytest.fixture()
    def login(request):
        print(\"登录\")
        def demo_finalizer():
            print(\"退出登录\")
        # 注册demo_finalizer为终结函数
        request.addfinalizer(demo_finalizer)
    

    注意request是固定的,不能随便写的

    8、fixture中的参数 autouse
    默认是False, autouse设置为True时,自动调用fixture功能。由于默认作用域为function,不指定scope则每个方法都会调用fixture方法。

    9、fixture函数参数化
    如果多条用例都需要调用相同参数,可以将fixture函数参数化。fixture 函数将执行每个参数值,fixture通过固定参数request传递。

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    import pytest
    
    @pytest.fixture(scope="module", params=['测试1','测试2','测试3'])
    def data(request):
        yield request.param
    
    class Test_Demo():
        def test_case1(self, data):
            print('测试用例01')
            print(data)
    
    if __name__ == "__main__":
        pytest.main(["-sv", "test.py"])
    
    运行结果如下:
    test.py::Test_Demo::test_case1[\\u6d4b\\u8bd51] 测试用例01
    测试1
    PASSED
    test.py::Test_Demo::test_case1[\\u6d4b\\u8bd52] 测试用例01
    测试2
    PASSED
    test.py::Test_Demo::test_case1[\\u6d4b\\u8bd53] 测试用例01
    测试3
    PASSED
    

    10、pytest.mark.usefixtures的使用
    @pytest.mark.usefixtures的使用,usefixtures达到的效果和setup和teardown一样

    11、 当case里需要传入多个 fixture 或者 yield 怎么办呢? 先后执行的顺序是什么?
    (“before”表示执行在case前,“yield”表示执行在case后)

    • def test_1(before, yield) 与 def test_1(yield,before)
      结论:不管你顺序如何,依旧会先执行case前的before,case结束后执行yield
    • def test_2(before1, before2, yield)
      结论:这样有多个before,会依次按传参顺序先后执行。
    • def test_3(before, yield1, yield2)
      结论:这样有多个yield的,会依次从后往前执行,这里先执行yield2,再执行yield1。

    五、pytest命令参数

    在这里插入图片描述

    • pytest test/: 执行test目录下所有文件
    • pytest.main([’-s’,’-v’]): 写在代码中执行测试用例,默认执行当前目录及子目录下的所有文件,可以指定执行文件
    • py.test -x : 首次失败后停止执行
    • py.test --maxfail=2 : 两次失败之后停止执行
    • py.test -k answer1 -v: 运行所有名字中含有的answer1的方法,-k 用来匹配名字中包含表达式的方法, -v 增加显示详细信息
    • py.test -m : 运行通过marked的用例,-m 标记的名字
    • @pytest.mark.xfail: Xfail标记的测试将会执行,但是不会被记入失败或成功中,如果失败了,也不会有任何追踪的信息
    • @pytest.mark.skip: Skip 则意味着直接跳过,不会执行

    六、生成HTML报告

    • 首先安装插件:pip install pytest-html
    • 运行命令:py.test -v -s --html=reportName.html
    • 你将会在文件目录下生成reportName.html,用浏览器打开
    • 上面生成的报告,css是独立的,分享报告的时候样式会丢失,为了更好的分享发邮件展示报告,可以把css样式合并到html里
      pytest --html=report.html --self-contained-html
    • 在python中执行命令
      pytest.main(['--html=./report.html', 'test_testing_topic.py'])

    七、运行测试用例方式

    1.、Pytest Marker 机制
    可以在每一个测试用例加一个marker,比如pytest运行的时就只运行带有该marker的测试用例,比如下面的pytest.main(["-m test"]);

    2、选择运行特定的某个测试用例
    你可以按照某个测试用例的的模块,类或函数来选择你要运行的case,比如下面的方式就适合一开始在调试单个测试用例的时候;
    pytest -v test_pytest_markers.py::TestClass::test_method

    3、选择运行特定的某个类
    pytest -v test_pytest_markers.py::TestClass

    4、用-k进行关键字匹配来运行测试用例名字子串
    pytest -v -k http test_pytest_markers.py

    5、重跑失败的用例,使用pytest-rerunfailures
    python3 -m pytest -reruns 重跑次数

    6、多进程运行
    安装pytest-xdist:pip install -U pytest-xdist
    如何使用:使用参数"-n"
    py.test test_pyexample.py -n NUM
    其中NUM填写并发的进程数。

    八、断言

    pytest里面的断言实际上就是python里面assert的断言方法,常用以下几种:

    • assert xx 判断xx为真
    • assert not xx 判断xx不为真
    • assert a in b 判断b包含a
    • assert a == b 判断a等于b
    • assert a != b 判断a不等于b

    九、数据驱动

    pytest数据驱动,就是参数化,使用@pytest.mark.parametrize
    在测试用例的前面加上:

    • @pytest.mark.parametrize(“参数名”,列表数据)
      参数名:用来接收每一项数据,并作为测试用例的参数。
      列表数据:一组测试数据。
    • @pytest.mark.parametrize(“参数1,参数2”,[(数据1,数据2),(数据1,数据2)])

    十、常用的第三方库

    • pytest-sugar
      测试进度可视化
      用法:不需要配置操作

    • pytest-parallel
      pytest-parallel在Windows下只支持多线程,不支持多进程,在Linux和mac下即支持多进程又支持多线程

    参数值配置:
    --workers=n           多进程运行需要加此参数,n是进程数。默认为1  【注:在windows系统中只能为1】
    --tests-per-worker=n  多线程运行需要加此参数,n是线程数。
    如果两个参数都配置了,就是进程并行,每个进程最多n个线程,总线程数:进程数*线程数
    pytest-parallel的workers参数在windows系统下永远是1,在linux和mac下可以取不同值。
    
    • pytest-xdist
      多进程并行与分布式执行,只支持多进程不支持多线程;
      用法:使用参数"-n",如py.test test_pyexample.py -n NUM
      注意:使用的前提是用例之间都是独立的,没有先后顺序,随机都能执行,可重复运行不影响其他用例

    • pytest-rerunfailures
      支持用例失败重试功能
      运行时指定:pytest -v -s 文件名.py -reruns 5 --reruns-delay 1 每次等1秒 重试5次
      测试方法上指定:@pytest.mark.flaky(reruns=5,reruns-delay=1) 每次等1秒 重试5次

    • pytest-picked
      插件可以实现只运行未提交到git仓库的代码

      --picked=[{only,first}]           Run the tests related to the changed files either on their own, or first
      --mode=PICKED_MODE                Options: unstaged, branch
      
    使用示例:
    pytest --picked              所有测试都将从已修改但尚未提交的文件和文件夹中运行
    pytest --picked=first        首先运行修改后的测试文件中的测试,然后运行所有未修改的测试
    pytest --picked --mode=branch      运行分支上已经被暂存但尚未提交的代码
    pytest --picked --mode=unstaged  # default    会默认执行所有的 Untracked 文件和 not staged 文件
    
    • pytest-ordering
      指定用例的执行顺序
      装饰器用法:@pytest.mark.run(order=xx)

    • pytest-cov
      在做单元测试时,代码覆盖率常常被拿来作为衡量测试好坏的指标,甚至,用代码覆盖率来考核测试任务完成情况;
      运行用例的时候加上 --cov 参数
      生成html的报告,pytest --cov --cov-report=html
      指定被测代码,可以通过--cov=模块 来运行

    • pytest-instafail
      可以在运行用例的时候,实时查看用例报错内容
      用法: --instafail 方便实时查看报错内容,结合--tb=line参数,看起来更直观

    • pytest-tldr
      pytest-tldr 将默认输出限制为失败测试的回溯信息,并忽略了一些令人讨厌的颜色编码。添加 -v 标志会为喜欢它的人返回更详细的输出;

    • pytest-django
      pytest-django 引入了使用 pytest fixture 测试 Django 项目的能力,而省略了导入 unittest 和复制/粘贴其他样板测试代码的需要,并且比标准的 Django 测试套件运行得更快;

    • pytest-html
      pytest用于生成测试结果的HTML报告
      用法:pytest --html=report.html --self-contained-html

    • allure-pytest
      生成Allure报告,Allure框架是一个灵活的轻量级多语言测试报告工具,它不仅以web的方式展示了简介的测试结果,而且允许参与开发过程的每个人从日常执行的测试中最大限度的提取有用信息;

    用法:pytest.main(['-s', '-q', '--alluredir', './report/xml'])
    -q 的意思是减少报告多余
    --alluredir 的意思是生成allure报告的数据的目标目录,即测试目录运行后的结果,是生成xml的数据集合
    生成Allure报告,在cmd下运行==> allure generate --clean ./report/xml/ -o ./results/html/
    

    Allure学习参考:https://www.cnblogs.com/linuxchao/p/linuxchao-pytest-allure.html

    • pytest-assume
      前面的断言失败了后继续执行
      用法:pytest.assume(xxx == xxx)

    • pytest-timeout
      设置执行用例的超时时间
      用法:pytest --timeout=2

    • pytest-repeat
      重复执行,当执行一个测试用例时偶发性BUG时,我们可以使用 pytest-repeat 进行重复测试直到失败。
      用法:pytest -v -s --count=2 test_open.py 重复执行2次

    • pytest-dependency
      使用该插件可以标记一个test作为其他test的依赖,当依赖项执行失败时,那些依赖它的test将会被跳过;
      用法:用 @pytest.mark.dependency()对所依赖的方法进行标记,使用@pytest.mark.dependency(depends=[“test_name”])引用依赖

    import pytest
    
    @pytest.mark.dependency()
    def test_01(test):
        assert False
    
    @pytest.mark.dependency(depends=["test_01"])
    def test_02(test):
        print("执行测试2")
    
    运行结果:test_01是test_02的依赖,故而test_01失败后,test_02被跳过
    
    展开全文
  • 对自动化测试来说,Pytest和Unittest一样,是另一个Python语言的单元测试框架,与Unittest相比它的测试用例更加容易编写、运行方式更加灵活、报错信息更加清晰、断言写法更简洁并且它可以运行有unittest和nose编写的...
  • pytest测试框架基本使用

    千次阅读 2020-03-22 22:25:34
    这里写自定义目录标题pytest测试框架 执行方式以函数的方式简单执行函数或方法名的命名规范DOS命令执行类的方式执行断言方法assert几种断言方法assert ==断言assert in 包含断言assert is 断言前后的值相等pytest ...

    pytest测试框架 执行方式

    以函数的方式简单执行

    先了解一下Pytest的执行的方式

    test_pytest.py

    import pytest
    def test_001():
        print("test_01")
    
    
    def test_002():
        print("test_02")
    
    if __name__ == '__main__':
        #main方法第一个参数-v打印详细信息, 第二个执行的模块名称
        pytest.main(['-v',"test_pytest.py"])
    

    看一下输出结果 上面划红线的是执行了多少个测试用例 中间的是执行的测试模块 下面的是有几个是通过的以及时间

    在这里插入图片描述

    函数或方法名的命名规范

    函数名或类的方法名须以test为开头否则无法执行 现在演示一下

    import pytest
    def test_001():
        print("test_01")
    
    def test_002():
        print("test_02")
    
    def add_test():
        print("add_test")
    if __name__ == '__main__':
        pytest.main(['-v',"test_pytest.py"])
    

    看一下到底能否运行

    可以看到还是两个方法 add_test并没有运行

    在这里插入图片描述

    DOS命令执行

    切换到当前项目的路径下 输入pytest -v test_pytest.py 执行

    在这里插入图片描述

    断言方法

    pytest 断言使用python的原生断言方法 assert

    assert几种断言方法

    1、 == 内容和类型必须同时满足相等

    2 、in 实际结果包含预期结果

    3、 is 断言前后两个值 相等

    assert ==断言

    断言 x + y相加后 实际结果是否等于预期结果

    def add(x,y):
       return x + x
    
    def test_add():
        assert add(1,1) == 2
    
    

    执行后 在控制台上的显示

    在这里插入图片描述

    如果把预期结果故意改错 看看 控制台会显示什么

    这个错误 很明显了
    在这里插入图片描述

    assert in 包含断言

    断言str1字符串中是否包含GO

    str1 = "python GO  PHP   JAVA "
    def test_in():
        assert "GO" in str1
    

    assert is 断言前后的值相等

    判断两个字符串是否相等

    str1 = "admin"
    str2 ="admin"
    def test_is():
        assert str2 is str1
    

    用== 也是一样的

    str1 = "admin"
    str2 ="admin"
    def test_is():
        assert str2 == str1
    

    pytest 常用命令详解

    1、-v输出详细的信息

    2、-s 输出测试函数或测试方法print内容

    3、-k 按分类执行测试点

    4、-m 进行分组执行

    5、-x 执行失败立刻停止

    6、–maxfail执行失败的最大次数

    7、–tb=line 错误信息在一行展示

    pytest -v输出详细的信息

    这个命令前面已经展示后很多次了 所以这里把-v去掉看看执行后 会显示什么 做个对比

    上面的是去掉-v后 下面是加上-v 参数执行 有-v的可以显示具体那个函数方法执行成功或失败
    在这里插入图片描述

    pytest -s输出测试函数或测试方法print内容

    输入print语句内容 比如说要打印查看一下 用户的id

    def test_id():
        userid =1234
        print(userid)
    

    在这里插入图片描述

    pytest -k 按分类执行测试点

    如果有十个测试用例 现在有需求只需要执行5个用例 那么可以用装饰器给用例分成两个分类 分别执行

    @python.mark 是固定写法 后面的是自己起的名字 现在分了两个类 run和stop

    import pytest
    @pytest.mark.run
    def test_001():
        print("test_01")
    @pytest.mark.run
    def test_002():
        print("test_02")
    @pytest.mark.run
    def test_03():
        print("add_test")
    
    def add(x,y):
       return x + x
    @pytest.mark.stop
    def test_add():
        assert add(1,1) == 2
    @pytest.mark.stop
    def test_id():
        userid =1234
        print(userid)
    

    现在只执行run分类的方法或函数

    pytest -v -k “run” test_pytest.py 执行
    在这里插入图片描述
    执行多个测试分类

    在这里插入图片描述

    -m 进行分组执行

    -m 和-k 执行起来 区别就是 分类不需要带引号 其他都差不多

    在这里插入图片描述

    -x 执行失败立刻停止

    不加-x 与加上-x的前后对比 没有-x 执行失败后 后面的会继续执行 带上-x后 执行失败后 后面的不会继续执行
    在这里插入图片描述

    –maxfail执行失败的最大次数

    如果设定最大失败的次数是2 那么如果两个用例执行失败 后面的会停止执行 如果是2次以下会继续执行
    在这里插入图片描述

    –tb=line 错误信息在一行展示

    没有这个命令的话 如果有大量的用例执行错误 那么 查看报错信息就很费劲了

    在这里插入图片描述

    pytest API测试实战

    以登录接口为例

    import pytest
    import requests
    
    def test_login():
        r = requests.post(
            url="http://127.0.0.1:5000/login/",
            data={
                "phone":1232432241,
                "password":123456
                  },
             headers =
             {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"
            }
        )
        print(r.text)
        assert r.json()['data']['id'] == 28239 and r.json()['msg'] == "登录成功"
    
    if __name__ == '__main__':
        pytest.main(["-v","test_pytest.py"])
    
    展开全文
  • Pytest测试框架

    2020-11-25 18:21:52
    python的第三方库,与标准库unittest测试框架类似,但是比unittest框架使用起来更改简介,灵活,效率更高 当前比较流行的测试框架 Robot Framework Pytest UnitTest/PyUnit pytest 和unittest unittest: python的...
  • pytest 测试框架支持Allure 报告生成。 pytest也可以生成junit格式的xml报告和HTML报告,命令如下: pytest test_demo.py --junitxml=report.xml pytest test_demo.py --html=report.html #需要安装插件:pip ...
  • 测试用例的预期结果是用例不可缺少的一部分,那么断言就是自动化测试不可缺少的一步,一个没有断言的用例,自动化测试的就没有意义了。那什么是断言呢? 简单来讲就是实际结果和期望结果去对比,符合预期那就测试...
  • 主要介绍了简单了解pytest测试框架setup和tearDown,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 二.Pytest执行测试用例 1.使用pytest执行用例需要准守的规则: 1、.py测试文件必须以_test开头(或者以_test结尾) 2、测试类必须以Test开头,并且不能有init方法 3、测试方法必须以test_开头 4、断言必须使用assert...
  • PyTest支持xUnit style 结构, setup() 和 teardown() 方法用于初始化和清理测试环境,可以保证测试用例的独立性。pytest的setup/teardown方法包括:模块级别(setup_module/teardown_module)、函数级别(setup_...
  • Pytest 测试框架——数据驱动

    千次阅读 2021-01-26 18:03:10
    今天和大家分享的是 Pytest 测试框架的数据驱动,Pytest 测试框架的数据驱动是由 pytest 自带的pytest.mark.parametrize()来实现的。 pytest.mark.parametrize 实现数据驱动 pytest.mark.parametrize 是 pytest ...
  • pytest测试框架的优点

    千次阅读 2020-03-13 11:06:08
    pytest是一个非常成熟的全功能的Python测试框架,主要有以下几个特点: 1.简单灵活,容易上手 2.支持参数化 3.能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试...
  • Pytest框架实战项目实例帮助...如何使用pytest-html插件生成测试报告6.PO设计模式思想是什么样的7.selenium 部分API的使用和如何进行简单的二次封装9.pytest框架如何参数化测试用例10.如何发送测试报告邮件11.如何使...
  • 一、环境部署 前三个是必须要装的,其它可以按需要选择安装: 库/插件/工具 安装方法 用途 ... 安装pytest库 ... pip install pytest 4 ...
  • 一、@pytest.parametrize()基本用法 @pytest.parametrize(args_name,args_value) Args_name: 参数名 Args_value: 参数值(列表、元组、字典列表、字典元组),有多少值用例就会执行多少次。 用法一: import pytest ...
  • pytest 自动化测试框架
  • pytest是一个非常成熟的全功能的Python测试框架,主要特点有以下几点: 1、简单灵活,容易上手,文档丰富; 2、支持参数化,可以细粒度地控制要测试的测试用例; 3、能够支持简单的单元测试和复杂的功能测试,还...
  • 如何在pycharm 里面使用pytest运行用例(默认为unittest) 遇见 pytest: error: unrecognized arguments: xxx parametrize 参数化时使用ids时控制台中文不能正常显示,显示为unicode编码样式(不是乱码) pytest-html...
  • python pytest测试框架(一)

    万次阅读 多人点赞 2019-07-03 23:00:12
    二、第一个测试例子 三、pytest参数 1、-KEXPRESSION 3、--maxfail=num 4、-m MARKEXPR 5、-v, --verbose 6、-q, --quiet 7、--junit-xml=path 8、--result-log=path 四、pytest 用例规则 五、pytest运行...
  • 一、 unittest 测试框架 1 导入包 from selenium import webdriver from selenium.webdriver.support.select import Select from time import sleep import unittest 2 创建类 2.1 全局变量  ...
  • Python pytest测试框架基本用法(一)

    千次阅读 2020-04-06 21:43:55
    pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高。 安装 pip install pytest 我这里已经安装成功了 二、框架使用流程 创建如下的源码文件test...
  • Pytest测试框架学习(干货)

    千次阅读 2021-02-02 17:04:34
    pytest是一个非常成熟的全功能的Python测试框架,主要有以下几个特点: 1.简单灵活,容易上手 2.支持参数化 3.能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试...
  • Pytest 框架提供了一个pytest-dependency 插件帮我们做了这件事情,我们只需要简单的使用即可。 pytest-dependency 详解 (建议掌握程度:☆☆☆☆) 安装 在命令行窗口输入: pip install pytest-dependency 查看...
  • python pytest测试框架(二)

    千次阅读 2019-07-04 12:15:22
    三、pytest 生成测试报告 1、文本格式的报告 2、生成JUnitXml格式报告 3、将测试报告发送到pastebin服务器 4、生成Html格式报告 一、pytest 命令行传参 命令行参数是根据命令行选项将不同的值传递给测试函数,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,145
精华内容 4,058
关键字:

pytest测试框架