Pytest测试框架(一):pytest安装及用例执行

PyTest是基于Python的开源测试框架,语法简单易用,有大量的插件功能非常多。自动检测测试用例,支持参数化,跳过特定用例,失败重试等功能。@H_301_1@

安装

pip install -U pytest  # 安装
pytest --version # 查看版本
pytest -h # 查看帮助信息

用例识别

  • pytest识别文件名为test_.py或者_test.py的测试文件
  • 测试文件中可以在Test*类中写测试用例(测试用例以test_*开头,并且测试类不能有__init__方法
  • 不在Test类中的test_用例也可以被识别到。

识别包含“add”的用例:@H_301_1@

pytest -k "add" --collect-only@H_301_1@

(base) D:\ProgramWorkspace\TestingDemo>pytest -k "add" --collect-only
============================================== test session starts ==============================================
platform win32 -- Python 3.7.6,pytest-5.3.5,py-1.8.1,pluggy-0.13.1
rootdir: D:\ProgramWorkspace\TestingDemo
plugins: hypothesis-5.5.4,arraydiff-0.3,astropy-header-0.1.2,doctestplus-0.5.0,openfiles-0.4.0,remotedata-0.3
.2
collected 20 items / 11 deselected / 9 selected                                                                  
<Package D:\ProgramWorkspace\TestingDemo\testing>
  <Module test_calc.py>
    <UnitTestCase TestCalc>
      <TestCaseFunction test_add_1>
      <TestCaseFunction test_add_2>
  <Module test_calc2.py>
    <Class TestCalc>
        <Function test_add[1-2-3]>
        <Function test_add[-1--2--3]>
        <Function test_add[0-1-1]>
        <Function test_add[0--1--1]>
        <Function test_add[0.1-0.2-0.3]>
        <Function test_add[999999-1000000-1999999]>
        <Function test_add_1>

打印文件下所有用例:@H_301_1@

pytest --collect-only@H_301_1@

(base) D:\ProgramWorkspace\TestingDemo>pytest --collect-only
============================================== test session starts ==============================================
platform win32 -- Python 3.7.6,remotedata-0.3
.2
collected 20 items                                                                                               
<Module test_pytest.py>
  <Function test_one>
  <Function test_two>
  <Function test_three>
<Module test_pytest2.py>
  <Class Test_Demo>
      <Function test_one>
      <Function test_two>
      <Function test_three>
<Package D:\ProgramWorkspace\TestingDemo\testing>
  <Module test_calc.py>
    <UnitTestCase TestCalc>
      <TestCaseFunction test_add_1>
      <TestCaseFunction test_add_2>
  <Module test_calc2.py>
    <Class TestCalc>
        <Function test_add[1-2-3]>
        <Function test_add[-1--2--3]>
        <Function test_add[0-1-1]>
        <Function test_add[0--1--1]>
        <Function test_add[0.1-0.2-0.3]>
        <Function test_add[999999-1000000-1999999]>
        <Function test_div[1-2-0.5]>
        <Function test_div[-1--2-0.5]>
        <Function test_div[0-1-0]>
        <Function test_div[1-0-0]>
        <Function test_div[0.1-0.2-0.5]>
        <Function test_add_1>

Pytest执行

一个简单的测试用例test_pytest.py:@H_301_1@

import pytest

def calc(a,b):
    return a + b

class TestDemo():
    def test_answer1(self):        
        assert calc(1,1) == 2

    def test_answer2(self):        
        assert calc(2,1) == 3
	
	@pytest.mark.answer3        
    def test_answer3(self):        
        assert calc(6,6) == 12

if __name__=='__main__':
    pytest.main()

用例执行

# 执行test_pytest.py所有用例(模块)
pytest test_pytest.py 

# 执行test_pytest.py里的TestDemo类
pytest test_pytest.py::TestDemo 

# 执行test_pytest.py里的TestDemo类的test_answer2方法
pytest test_pytest.py::TestDemo::test_answer2

打印日志信息

# 打印详细运行日志信息
pytest -v test_pytest.py 
pytest -s test_pytest.py

@H_301_1@@H_301_1@

跳过某个用例

# 跳过运行某个用例
pytest -v -k "类名 and not方法名" 文件名
pytest -v -k "TestDemo and not test_answer2" test_pytest.py

@H_301_1@@H_301_1@

运行某个标记的用例

# 将运行有这个标记的测试用例:@pytest.mark.[标记名]
pytest -m [标记名] 文件名
pytest -m answer3 test_pytest.py

@H_301_1@@H_301_1@

报错停止

# 一旦运行到报错用例就停止运行
pytest -x 文件名
pytest -x test_pytest.py

# 当报错达到num的时候就停止运行
pytest --maxfail=[num] 文件名
pytest --maxfail=[num] test_pytest.py

@H_301_1@@H_301_1@

@H_301_1@@H_301_1@

失败重新运行

安装 pytest-rerunfailures 插件:@H_301_1@

pip install pytest-rerunfailures

测试失败后重新运行n次,在重新运行间延迟n秒再运行:@H_301_1@

# 重新运行3次
pytest --reruns 3 -v -s test_pytest.py
# 重新运行5次,延迟1s
pytest --reruns 5 --reruns-delay 1 -v test_pytest.py

@H_301_1@@H_301_1@

多条断言

一个方法中有多条断言,通常第一条失败后下面就不执行了,pytest-assume插件可以解决断言失败后继续执行断言的问题。@H_301_1@

安装@H_301_1@

pip install pytest-assume

执行多条断言:@H_301_1@

# 写法1
pytest.assume(x == y)
pytest.assume(True)
pytest.assume(False)

# 写法2
with assume: assert calc(2,1) == 4 
with assume: assert calc(2,1) == 3 
with assume: assert calc(2,2) == 3

修改测试用例test_pytest.py:@H_301_1@

import pytest
from pytest import assume

def calc(a,1) == 2

    def test_answer2(self):
  		with assume: assert calc(2,1) == 4
		with assume: assert calc(2,1) == 3
		with assume: assert calc(2,2) == 3
	
	@pytest.mark.answer3        
    def test_answer3(self):        
        assert calc(6,6) == 12

if __name__=='__main__':
    pytest.main()

测试结果:@H_301_1@

@H_301_1@@H_301_1@

pytest.main()

除了在终端执行外,也可以通过pytest.main()来执行,pytest.main() 自动查找当前目录下以test_开头的文件或者以_test结尾的py文件。@H_301_1@

括号内可传入执行参数,通过[]进行分割,[]内的多个参数通过逗号分割,所有的参数和pytest命令行方式一样:@H_301_1@

pytest.main(['-v','test_pytest.py']) # 执行test_pytest.py用例

或者直接在测试文件最后写如下代码,执行py文件。@H_301_1@

if __name__=='__main__':  
    pytest.main()   
    # pytest.main(['-v','test_pytest.py'])

更多pytest执行方法可参考官方文档:https://docs.pytest.org/en/latest/contents.html#toc@H_301_1@

--THE END--

文章标题:Pytest测试框架(一):pytest安装及用例执行
本文作者:hiyo
本文链接https://hiyong.gitee.io/posts/install-pytest-and-run-test/
欢迎关注公众号:「测试开发小记」及时接收最新技术文章!@H_301_1@

相关文章

PyTest支持xUnit style 结构, setup() 和 teardown() 方法用于初始化和清理测试环境,可以保证测试用例...
在 Pytest测试框架(三):pytest fixture 用法 中介绍了pytest.fixture()可以参数化fixture函数,@pyt...
Allure 是一款轻量级、支持多语言的开源自动化测试报告生成框架,由Java语言开发,可以集成到 Jenkins。...
xUnit style 结构的 fixture用于初始化测试函数, pytest fixture是对传统的 xUnit 架构的setup/teardo...
PyTest是基于Python的开源测试框架,语法简单易用,有大量的插件,功能非常多。自动检测测试用例,支持...