python的pytest框架

1、介绍

pytest是一个非常成熟的全功能的Python测试框架,主要有以下几个特点:

  • 简单灵活,容易上手
  • 支持参数化
  • 能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests)
  • pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等
  • 测试用例的skip和xfail处理
  • 可以很好的和jenkins集成
  • report框架----allure 也支持了pytest

2、安装

# 安装pytest
pip install pytest
# Pytest有个用于生成html测试结果报告的插件:pytest-html,可直接使用pip命令安装

pip install pytest-html

# 在执行用例时,需要加上参数:--html,如
pytest -m pytestto --disable-pytest-warnings --html=report.html

# 指定报告的存放路径,需使用如下格式,比如,指定到一个report的文件夹里,这里是当前运行文件下创建
pytest --html=./report/report.html 

3、 运行

# 例子1
import pytest

# content of test_sample.py
def func(x):
    return x + 1
def test_answer():
    assert func(3) == 5

命令行切换到文件所在目录,执行测试

# 例子2
# 当需要编写多个测试样例的时候,我们可以将其放到一个测试类当中,如
class TestClass:  
    def test_one(self):  
        x = "this"  
        assert 'h' in x  
  
    def test_two(self):  
        x = "hello"  
        assert hasattr(x, 'check') 

从测试结果中可以看到,该测试共执行了两个测试样例,一个失败一个成功。同样,我们也看到失败样例的详细信息,和执行过程中的中间结果。-q即-quiet,作用是减少冗长,具体就是不再展示pytest的版本信息。
 

3、如何编写测试用例

通过上面2个实例,我们发现编写pytest测试样例非常简单,只需要按照下面的规则:

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

4、运行模型

Pytest的多种运行模式,让测试和调试变得更加得心应手,下面介绍5种常用的模式。在介绍之前需要提醒一句,运行pytest时会找当前目录及其子目录中的所有test_*.py 或 *_test.py格式的文件以及以test开头的方法或者class,不然就会提示找不到可以运行的case了。

py.test --version               查看版本
py.test --fixtures, --funcargs  查看可用的 fixtures
pytest --markers                查看可用的 markers
py.test -h, --help              命令行和配置文件帮助

# 失败后停止
py.test -x           首次失败后停止执行
py.test --maxfail=2  两次失败之后停止执行

# 调试输出
py.test -l, --showlocals  在 traceback 中显示本地变量
py.test -q, --quiet       静默模式输出
py.test -v, --verbose     输出更详细的信息
py.test -s                捕获输出, 例如显示 print 函数的输出
py.test -r char           显示指定测试类型的额外摘要信息
py.test --tb=style        错误信息输出格式
    - long    默认的traceback信息格式化形式
    - native  标准库格式化形式
    - short   更短的格式
    - line    每个错误一行

# 运行指定 marker 的测试
pytest -m MARKEXPR

# 运行匹配的测试
py.test -k stringexpr

# 失败时调用 PDB
py.test --pdb

 补充:

# 1、 运行所有
if __name__ == '__main__':
    pytest.main()

# 2、指定模块
if __name__ == '__main__':
    pytest.main(['-vs','test_login.py'])

# 3、 指定目录
if __name__ == '__main__':
    pytest.main(['-vs','./testcase'])




# 如果需要输出print内容
if __name__ == '__main__':
    pytest.main(['-s'])

# 组合参数,上面v与s的说明有介绍
if __name__ == '__main__':
    pytest.main(['-vs'])

# 多线程,下图是开启2个线程,需要安装库 pytest-xdist

if __name__ == '__main__':
    pytest.main(['-vs','-n=2'])
## 命令行执行方式为: pytest -vs  -n 2

# 失败重试,注意是--安装库pytest-returnfailures
if __name__ == '__main__':
    pytest.main(['-vs','--reruns=2'])
## 命令行执行方式为: pytest -vs  --retuns 2


a)运行后生成测试报告(htmlReport)

# 先安装html报告
pytest --html=report.html

b)运行指定的case

当我们写了较多的cases时,如果每次都要全部运行一遍,无疑是很浪费时间的,通过指定case来运行就很方便了。

# 例子代码
class TestClassOne(object):
    def test_one(self):
        x = "this"
        assert 't'in x

    def test_two(self):
        x = "hello"
        assert hasattr(x, 'check')


class TestClassTwo(object):
    def test_one(self):
        x = "iphone"
        assert 'p'in x

    def test_two(self):
        x = "apple"
        assert hasattr(x, 'check')

# 运行模式:


# 模式1:直接运行test_se.py文件中的所有cases:
pytest test_se.py

# 模式2:运行test_se.py文件中的TestClassOne这个class下的两个cases:
pytest test_se.py::TestClassOne

# 模式3:运行test_se.py文件中的TestClassTwo这个class下的test_one:
pytest test_se.py::TestClassTwo::test_one
# 注意:定义class时,需要以T开头,不然pytest是不会去运行该class的。

c)多进程运行cases

当cases量很多时,运行时间也会变的很长,如果想缩短脚本运行的时长,就可以用多进程来运行。

安装pytest-xdist:

pip install -U pytest-xdist

# 运行模式:
pytest test_se.py -n NUM
# 其中NUM填写并发的进程数。

d)重试运行cases

在做接口测试时,有事会遇到503或短时的网络波动,导致case运行失败,而这并非是我们期望的结果,此时可以就可以通过重试运行cases的方式来解决。

# 安装pytest-rerunfailures:
pip install -U pytest-rerunfailures

# 运行模式
pytest test_se.py --reruns NUM
# NUM填写重试的次数。

e)显示print内容

 在运行测试脚本时,为了调试或打印一些内容,我们会在代码中加一些print内容,但是在运行pytest时,这些内容不会显示出来。如果带上-s,就可以显示了。

# 运行模式:
pytest test_se.py -s


# 另外,pytest的多种运行模式是可以叠加执行的,比如说,你想同时运行4个进程,又想打印出print的内容。可以用:
pytest test_se.py -s -n 4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值