自动化测试项目学习笔记(四):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"])
      
  • 使用模糊匹配,通过-k选择标识
    •    pytest.main(["-s", "-v", "-k", "add","test_03.py"])
      
    •    或者直接命令行 pytest -k func1 test.py
      
  • 使用pytest.mark,在函数上进行标记(必须要写配置文件)
    •    pytest.main(["-s", "-v", "-m", "undo","test_03.py"])
      
    •    或者直接命令行 pytest -m undo test_03.py
      
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"])

下面是pytest.ini的配置文件

[pytest]
markers=
        do: do
        undo: undo

参数化处理

在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"])

使用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"])
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZZY_dl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值