前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pytest框架介绍

pytest框架介绍

作者头像
赵云龙龙
发布2021-04-23 11:14:23
1K0
发布2021-04-23 11:14:23
举报
文章被收录于专栏:python爱好部落python爱好部落

前面介绍了unittest这个自动化框架,但是这个古老的框架,还有很多不足。 于是乎,后浪出现了,今天要讲的就是pytest框架。 pytest介绍 pytest是一个非常成熟的全功能的Python测试框架,主要特点有以下几点: 1、简单灵活,容易上手,文档丰富; 2、支持参数化,可以细粒度地控制要测试的测试用例; 3、能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests); 4、pytest具有很多第三方插件,并且可以自定义扩展 如pytest-selenium(集成selenium)、 pytest-html(完美html测试报告生成)、 pytest-rerunfailures(失败case重复执行)、 pytest-xdist(多CPU分发)、 pytest--ordering(控制测试运行的顺序) 5、测试用例的skip和xfail处理; 6、可以很好的和CI工具结合,例如jenkins

编写规则:

测试文件以test_开头(以test结尾也可以) 测试类以Test开头,并且不能带有 init 方法 测试函数以test开头 断言使用基本的assert即可 快速示例 test_pyexample.py

代码语言:javascript
复制
import pytest
 
class TestClass:
    def test_one(self):
      x = "this"
      assert 'h' in x
 
    def test_two(self):
      x = "hello"
      assert hasattr(x, 'check')
 
    def test_three(self):
      a = "hello"
      b = "hello world"
      assert a in b

通过命令行运行:

1、cd 到代码所在的目录,执行命令:py.test test_pyexample.py

2、安装pytest-sugar插件可以看到进度条

Pycharm配置运行:

1.file->Setting->Tools->Python Integrated Tools->项目名称->Default test runner->选择py.test

代码语言:javascript
复制
import pytest
 
class TestClass:
    def test_one(self):
      x = "this"
      assert 'h' in x
 
    def test_two(self):
      x = "hello"
      assert hasattr(x, 'check')
 
    def test_three(self):
      a = "hello"
      b = "hello world"
      assert a in b
 
if __name__ == "__main__":
  pytest.main('-q test_class.py')

Console常用参数介绍: -v 用于显示每个测试函数的执行结果 -q 只显示整体测试结果 -s 用于显示测试函数中print()函数输出 -x, --exitfirst, exit instantly on first error or failed test -m 只运行带有装饰器配置的测试用例 -h 帮助

代码语言:javascript
复制
py.test # run all tests below current dir
py.test test_mod.py # run tests in module file test_mod.py
py.test somepath # run all tests below somepath like ./tests/
py.test -k stringexpr # only run tests with names that match the
# the "string expression", e.g. "MyClass and not method"
# will select TestMyClass.test_something
# but not TestMyClass.test_method_simple
py.test test_mod.py::test_func # only run tests that match the "node ID",
# e.g "test_mod.py::test_func" will be selected
# only run test_func in test_mod.py

pytest参数化 使用装饰器:@pytest.mark.parametrize()

单个参数:

代码语言:javascript
复制
import pytest
import random
@pytest.mark.parametrize('x',[(1),(2),(6)])
def test_add(x):
  print(x)
  assert x==random.randrange(1,7)

多个参数:

代码语言:javascript
复制
import pytest
@pytest.mark.parametrize('x,y',[
  (1+2,3),
  (2-0,1),
  (6*2,12),
  (10*2,3),
  ("test","test"),
])
def test_add(x,y):  #必须与上面保持一致,只能用x,y不能用其他字母
  assert x==y

控制测试运行顺序 安装pytest-ordering

pip install pytest-ordering 借助于装饰器@pytest.mark.run(order=1)控制测试运行的顺序

代码语言:javascript
复制
import pytest
import time
value=0
@pytest.mark.run(order=2) #后执行order=2
def test_add2():
  print("I am 2")
  time.sleep(2)
  assert value==10
@pytest.mark.run(order=1)  #先执行order=1
def test_add():
  print("I am add")
  global value
  value=10
  assert value==10

运行后生成测试报告(htmlReport) 安装pytest-html:

代码语言:javascript
复制
pip install -U pytest-html

如何使用:

代码语言:javascript
复制
py.test test_pyexample.py --html=report.html

更详细的测试报告

安装 pytest-cov:

代码语言:javascript
复制
pip install pytest-cov

如何使用

代码语言:javascript
复制
py.test --cov-report=html --cov=./ test_code_target_dir
Console参数介绍
--cov=[path], measure coverage for filesystem path (multi-allowed), 指定被测试对象,用于计算测试覆盖率
--cov-report=type, type of report to generate: term, term-missing, annotate, html, xml (multi-allowed), 测试报告的类型
--cov-config=path, config file for coverage, default: .coveragerc, coverage配置文件
--no-cov-on-fail, do not report coverage if test run fails, default: False,如果测试失败,不生成测试报告
--cov-fail-under=MIN, Fail if the total coverage is less than MIN. 如果测试覆盖率低于MIN,则认为失败

多进程运行

安装pytest-xdist:

代码语言:javascript
复制
pip install -U pytest-xdist

如何使用:

代码语言:javascript
复制
py.test test_pyexample.py -n NUM

其中NUM填写并发的进程数。

重新运行失败的用例 安装pytest- rerunfailures:

代码语言:javascript
复制
import random
def add(x,y):
  return x+y
def test_add():
  random_value=random.randint(2,7)
  print('random_value:'+str(random_value))
  assert add(1,3)==random_value

如何使用:

命令:pytest --reruns 重试次数   比如:pytest --reruns 3  表示:运行失败的用例可以重新运行3次 命令:pytest --reruns 重试次数 --reruns-delay 次数之间的延时设置(单位:秒)   比如:pytest --reruns 3 --reruns-delay 5 运行失败的用例可以重新运行3次,第一次和第二次的间隔时间为5秒钟 另外也可以通过装饰器的方式配置:

代码语言:javascript
复制
@pytest.mark.flaky(reruns=3, reruns_delay=5)
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-04-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python粉丝团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档