• 自动化测试项目学习笔记(四):Pytest介绍和使用


    相关文章

    学习说明

    这里主要是了解pytest的使用。

    Pytest介绍

    Pytest是一个非常成熟的全功能的Python测试框架,主要由一下几点:

    • 简单容易上手,文档很丰富
    • 支持参数化,可以细粒度地控制要测试的测试用例
    • 能够支持简单的单元测试和复杂的功能测试,还可以用来做selemium、appmium等自动化测试、接口自动化测试(pytest+request)
    • 有很多丰富的第三方插件,并且可以自定义扩展,比如pytest-selemium、pytest-html、pytest-rerunfailures、pytest-xdist(多CPU分发)
    • 可以初始化和清除,setupmodule和teardowmmodule。

    编写规则

    • 测试文件以test开头(以test结尾也可以)
    • 测试函数以test开头
    • 测试类以Test开头,不能有init方法
    • 断言使用assert即可

    Console参数介绍

    • -v:用于显示每个测试函数的执行结果
    • -q:只显示整体测试结果
    • -s:用于显示测试函数中print()函数输出
    • -x:–exitfirst,在第一个错误或测试失败时立即退出
    • -h:帮助

    执行测试

    • 配置PyCharm执行
      • Tools->Python integrated tools->Default test runner
    • main方法
      • pytest.main([“-s”, “-v”, “test_01.py”])
    • 命令行
      • pytest -s -v test_01.py

    执行指定的函数

    有三种方法

    • 显式指定函数名,通过::标记
      •    pytest.main(["-s", "-v", "test_03.py::test1"])
        
        • 1
    • 使用模糊匹配,通过-k选择标识
      •    pytest.main(["-s", "-v", "-k", "add","test_03.py"])
        
        • 1
      •    或者直接命令行 pytest -k func1 test.py
        
        • 1
    • 使用pytest.mark,在函数上进行标记(必须要写配置文件)
      •    pytest.main(["-s", "-v", "-m", "undo","test_03.py"])
        
        • 1
      •    或者直接命令行 pytest -m undo test_03.py
        
        • 1
    import pytest
    
    @pytest.mark.undo
    def test_add1():
        print("test1")
    
    @pytest.mark.do
    def test_sub2():
        print("test2")
    
    if __name__ == '__main__':
        # pytest.main(["-s", "-v", "test_03.py::test1"])
        # pytest.main(["-s", "-v", "-k", "add","test_03.py"])
        pytest.main(["-s", "-v", "-m", "undo","test_03.py"])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    下面是pytest.ini的配置文件

    [pytest]
    markers=
            do: do
            undo: undo
    
    • 1
    • 2
    • 3
    • 4

    参数化处理

    在pytest中,也可以使用参数化测试,即每组参数都独立执行一次测试。使用的工具就是pytest.mark.parametrize(argnames, argvalues)。包括列表元组字典来进行传参。

    import pytest
    
    # 列表
    data = ['123', '456']
    
    @pytest.mark.parametrize("pwd", data)
    def test1(pwd):
        print("pwd")
    
    # 元组
    data2 = [(1,2,3), (4,5,6)]
    @pytest.mark.parametrize("a, b, c", data2)
    def test2(a, b, c):
        print(a, b, c)
    
    # 字典
    dicts = [
        {
          "user": 123,
          "pwd": 456
        },{
            "user": 789,
            "pwd": 101112
        }
    ]
    
    data4 = [
        pytest.param(1,2,3, id="(a+b):pass"), # id的值可以自定义,只要方便理解每个用例是干什么的即可
        pytest.param(4,5,9, id="(a+b):pass")
    
    ]
    @pytest.mark.parametrize("dic", dicts)
    def test3(dic):
        print(dic)
    
    def add(a,b):
        return a+b
    
    class TestParametrize(object):
    
        @pytest.mark.parametrize("a, b, expect", data4)
        def test_patam(self, a, b, expect):
            assert add(a, b) == expect
    if __name__ == '__main__':
        pytest.main(["-s", "-v", "test_04.py"])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    使用fixture实现用例之间的调用

    **目的:**是前后置的方法,可以实现部分以及全部用例的前后置。

    如果要实现后置,则需要加上yield-(yield是生成器,可以生成一个可以迭代的数组,然后循环,所以是可以返回的)yield和return都可以返回,return后面没有代码,而yield后面可以有代码。

    @pytest.fixture(),包含五个参数

    • scope:表示的是被这个装饰器它的作用域是什么,可以作用域函数、类、模块和包
    • params:可选的参数化,列表、元组、字典列表、字典元组。
    • autouse:自动执行,默认是False
    • ids:当使用params参数化时,给每一个值设置一个变量名
    • name: 表示被装饰器所标记的方法取别名-取了别名原来的名就不能用了
      fixture与fixture间可相互调用
      fixture可以有返回值,如果没有return,默认会是None
    import pytest
    
    @pytest.fixture()
    def init():
        print("init")
        return 1
    
    def test1(init):
        print("test1")
    
    def test2(init):
        print("test2")
    
    if __name__ == '__main__':
        pytest.main(['-s','-v',"test_05.py"])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    C++【内存管理】
    初级算法_字符串 --- 实现 strStr()
    java-php-python-ssm研究生入学考试备考辅助系统计算机毕业设计
    基于YOLO检测算法(单检测器网络+多视频输入)设计与实现
    P3051 [USACO12MAR]Haybale Restacking G
    * 论文笔记 【OffDQ: An Offline Deep Learning Framework for QoS Prediction】
    Edexcel ALevel数学P2考题解析
    Python的基础语法(九)(持续更新)
    VGG16 实现图像分类的 pytorch 实现、步骤精讲
    天堂2服务器安装教程
  • 原文地址:https://blog.csdn.net/m0_51004308/article/details/127463090