Pytest_基础知识

作者:Gakki

01 Pytest 用例规则

Pytest 可以在不同的函数、包中发现用例,发现的规则如下:

  • 文件名以 test_ 开头的 py 文件
  • 以 test_ 开头的函数
  • 以 Test 开头的类
  • 以 test_ 开头的方法
  • 注:所有的包必须要有 init.py 文件

02 Pytest 运行方式

  1. 单独执行某一个 py 文件里所有的用例:
    pytest test_login.py

  2. 执行目录下所有的用例:
    pytest testcase/

  3. 单独执行某个用例

以函数形式的用例
pytest test_login.py::test_login
 
以类形式的用例
pytest test_login.py::TestClass::test_login

03 setup 和 teardown 函数

  1. setup和teardown主要分为:模块级,类级,功能级,函数级。
  2. 存在于测试类内部

函数级别:运行于测试方法的始末,即:运行一次测试函数会运行一次 setupteardown
类级别:运行于测试类的始末,即:在一个测试内只运行一次 setup_classteardown_class ,不关心测试类内有多少个测试函数。

04 装饰器之 Fixture

Fixture 装饰器的用途:

  1. 做测试前后的初始化设置,如测试数据准备,链接数据库,打开浏览器等这些操作都可以使用Fixture来实现。
  2. 测试用例的前置条件可以使用Fixture实现,比直接使用Pytest框架的setup()和teardown()函数更加灵活。
  3. Fixture是Pytest用于将测试前后进行预备,清理工作的代码分离出核心测试逻辑的一种机制。
  4. Fixture可以实现Unittest不能实现的功能,比如:Unittest中的测试用例和测试用例之间是无法传递参数和数据的,但是Fixture却可以解决这个问题。

Fixture 参数说明:
fixture(scope="function", params=None, autouse=False, ids=None, name=None):

入参说明:

  • scope:表示被 @pytest.fixture() 装饰器所标识方法的作用域。作用域有四个级别,函数 function(默认) ,类 class ,模块 module ,包 package/session 。说明:function 作用域包含函数和方法。
  • params:一个可选的参数列表,用于做 Fixture 的参数化。可将数据提供给其他的 Fixture ,或者所有测试使用它 。
  • autouse:autouse=Ture 则开启自动使用 Fixture 功能,也是调用 Fixture 函数一种方法。Fixture 装饰器会自动执行作用域范围内的所有用例的前后置。autouse 默认值为 Flase 。
  • ids:一个字符串 id 的列表,即当使用params参数化时,给每一个值设置一个变量名。如果没有提供 ID , params 将自动生成 ID 。
  • name:表示给被 @pytest.fixture() 装饰器修饰的方法取一个别名,调用时可以使用别名调用。默认为装饰器所装饰的函数名称。
    注:Fixture装饰器既可以实现部分用例的前后置,也可以是现实全部用例的前后置。
import pytest
# 1.py
@pytest.fixture(scope='module', autouse=True)
def test1():
    print('\n开始执行module')
@pytest.fixture(scope='class', autouse=True)
def test2():
    print('\n开始执行class')
@pytest.fixture(scope='function', autouse=True)
def test3():
    print('\n开始执行function')
def test_a():
    print('---用例a执行---')
def test_d():
    print('---用例d执行---')
class TestCase:
    def test_b(self):
        print('---用例b执行---')
    def test_c(self):
        print('---用例c执行---')
if __name__ == '__main__':
    pytest.main(['-s', '1.py'])

输出结果:

collected 4 items

1.py 
开始执行module

开始执行class

开始执行function
---用例a执行---
.
开始执行class

开始执行function
---用例d执行---
.
开始执行class

开始执行function
---用例b执行---
.
开始执行function
---用例c执行---
.

============================== 4 passed in 0.04s ==============================

05 跳过(Skip)及预期失败(xFail)

根据特定条件,不执行标识的测试函数。

  • 方法:
    skipif(condition, reason=None)
  • 参数:
    • condition:跳过的条件,必传参数
    • reason:标注原因,必传参数
  • 使用方法:
    @pytest.mark.skipif(condition, reason="xxx")

跳过执行测试函数

  • pytest.mark.skip(reason=" ") 可传入一个非必须参数reason表示原因

自定义@pytest.mark.skip()标签

  • skip_test = pytest.mark.skip() 或 myskip = pytest.mark.skipif(condition=...)
  • 装饰时用该变量代替标签即可:@skip_test

标记为预期失败函数

  • 方法:
    xfail(condition=None, reason=None, raises=None, run=True, strict=False)
  • 常用参数:
    • condition:预期失败的条件,必传参数
    • reason:失败的原因,必传参数
  • 使用方法:
    • @pytest.mark.xfail(condition, reason="xx")

使用xfail标记指示你希望测试失败。运行用例的时候,在失败时不会报告回溯。相反,终端报告会将其列在“预期失败”(XFAIL)或“意外传递”(XPASS)部分中。

06 装饰器之 mark

函数数据参数化,方便测试函数对测试数据的获取。

  • 方法:
    • parametrize(argnames, argvalues, indirect=False, ids=None, scope=None)
  • 常用参数:
    • argnames:参数名
    • argvalues:参数对应值,类型必须为list
      当参数为一个时格式:[value]
      当参数个数大于一个时,格式为:[(param_value1,param_value2.....), (param_value1,param_value2.....)]
  • 使用方法:
    • @pytest.mark.parametrize(argnames,argvalues),参数值为N个,测试方法就会运行N次

07 pytest 参数

  • -K EXPRESSION:执行某个关键字的用例,用例要匹配给出的表达式;使用python的语法,匹配的范围是文件名、类名、函数名为变量,用and来区分。
  • --maxfail=num:当错误个数到达给定数时,退出测试,这里就不列举实例了,结果与-x类似。
  • -m MARKEXPR:只能运行有相应标识的测试用例,使用这个参数,测试用例要使用@pytest.mark.marker修饰。
  • -v:详细结果
  • -q:极简结果显示,简化控制台的输出
  • -s:输入我们用例中的调式信息,比如print的打印信息等
  • -V:可以输出用例更加详细的执行信息,比如用例所在的文件及用例名称等
  • --junit-xml=path:输出xml文件格式,在与jenkins做集成时使用
  • --result-log=path:将最后的结果保存到本地文件中

你可能感兴趣的:(Pytest_基础知识)