第六十二篇 测试框架pytest用法(跨目录导入模块)

一、简介

简单整理了一下pytest框架,此框架扩展性较高,pytest是一款以python为开发语言的测试框架,具有以下优点:
文档丰富,简单,易上手,pytest具有很多第三方插件,输出结果简明,多样化,能定向输出html等数据文档。

二、安装以及测试环境配置

安装 pip3 install pytest 查看是否安装成功pytest --version

在python中我们定义框架时,不仅仅将所有的配置文件都放在一个文件夹下面,项目在之后慢慢的成熟起来,这样的文件就会很难去管理,在学完Django之后发现其成熟的框架,定义每一个路径下必须存储什么样的文件,这样在后期的管理会很方便,所以我们的框架也要为后期考虑。一般情况成熟的框架包含以下路径:

  • 存放配置文件
  • 存放脚本和工具
  • 存放正式的调用函数
  • 存放log和日志
  • 服务器和其他相关脚本

定义好了我自己的框架如下:
第六十二篇 测试框架pytest用法(跨目录导入模块)_第1张图片
在框架下调用其他路径的模块就需要用到绝对路径和引用这个功能,在当下框架下
script:执行的正式脚本文件
__init.py文件为正式文件做导入模块的操作,不需要每个文件逐一导入
如果test_run.py脚本需要调用server路径下的模块,我们可以使用以下方法,将模块都导入__init.py文件中

sys.path 为我们导入模块的路径,我们只需要将需要导入模块的路径加入到sys.path列表中,我们就可以导入

import sys
import os

CURRENT_DIR=os.path.dirname(os.path.abspath(__file__)) #表示当前路径
BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #表示上一级目录
sys.path.insert(0,BASE_DIR+"/lib/server")  #也可以用os.path.join(BASE_DIR,'/lib/server')
import tool

print("BASE_DIR",BASE_DIR)
print("sys_path",sys.path)

这样引用就可以使用其他路径的模块
test_run.py

import __init  #想要使用tool模块,必须先导入__init模块
import tool

三、使用规则(必须遵从)

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

四、调用方法和生成日志

1、一个简单的示例

import __init
import tool
import pytest


def func(x):
    return x ** 2

def test_func():
    assert func(2) == 4

pytest.main()

第六十二篇 测试框架pytest用法(跨目录导入模块)_第2张图片
2、在python文件内调用

pytest.main()

3、在文件外部调用
调用当前文件下的所有test_或_test结尾的文件并执行,以指定python3版本调用

python3 -m pytest

指定具体的文件

python3 -m pytest test_run.py

4、创建日志
参数 -v 只显示执行的函数名

python3 -m pytest --resultlog=path

5、创建xml格式报告

python3 -m pytest --junitxml=path

6.创建html报告
安装

pip install pytest-html

执行

pytest --html=用户路径/report.html

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

pip install -U pytest-xdist

运行

pytest test_se.py -n NUM

五、编写测试脚本

1、执行函数的测试
如上的例子,直接在assert中调用函数并传入参数
2、执行类中的测试

import __init
import tool
import pytest

class Test_ABC():

    # 函数级开始
    def setup(self):
        print("------->setup_method")

    # 函数级结束
    def teardown(self):
        print("------->teardown_method")

    def test_a(self):
        print("------->test_a")
        assert 1

    def test_b(self):
        print("------->test_b")


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

python3 -m pytest -s -v 输出详细信息-s
执行结果:
第六十二篇 测试框架pytest用法(跨目录导入模块)_第3张图片
3、pyetst.ini配置文件内容
pytest的配置文件通常放在测试目录下,名称为pytest.ini,命令行运行时会使用该配置文件中的配置.

[pytest]

  命令行参数

 addopts = -s

 搜索文件名

 python_files = test*.py

  搜索的类名

 python_classes = Test*

搜索的函数名

 python_functions = test_*

六.fixture用法

1. fixture可以当做参数传入
定义fixture跟定义普通函数差不多,唯一区别就是在函数上加个装饰器@pytest.fixture(),fixture命名不要以test开头,跟用例区分开。fixture是有返回值得,没有返回值默认为None。用例调用fixture的返回值,直接就是把fixture的函数名称当做变量名称。

@pytest.fixture()
def user():
    print("获取用户名")
    a = "yoyo"
    assert a == "yoyo123"  # fixture失败就是error
    return a


def test_1(user):
    assert user == "yoyo"


if __name__ == "__main__":
    pytest.main(["-s", "test_run.py"])

结果
第六十二篇 测试框架pytest用法(跨目录导入模块)_第4张图片
2.使用多个fixture
如果用例需要用到多个fixture的返回数据,fixture也可以返回一个元祖,list或字典,然后从里面取出对应数据。

import pytest
@pytest.fixture()
def test_01():
    a = 5
    b = 6
    return (a, b)
 
def test_02(test_01):
    a = test_01[0]
    b = test_01[1]
    assert a < b
    print("断言成功")

3.fixture的作用范围(scope)

ixture里面有个scope参数可以控制fixture的作用范围:session>module>class>function
-function:每一个函数或方法都会调用
-class:每一个类调用一次,一个类中可以有多个方法
-module:每一个.py文件调用一次,该文件内又有多个function和class
-session:是多个文件调用一次,可以跨.py文件调用,每个.py文件就是module

import pytest
@pytest.fixture(scope="class")
def test_01():
    a = 5
    b = 6
    return (a, b)
 
 
class TestNum:
    def test_02(self,test_01):
        a = test_01[0]
        b = test_01[1]
        assert a < b
        print("断言成功")```

你可能感兴趣的:(测试框架)