简单整理了一下pytest框架,此框架扩展性较高,pytest是一款以python为开发语言的测试框架,具有以下优点:
文档丰富,简单,易上手,pytest具有很多第三方插件,输出结果简明,多样化,能定向输出html等数据文档。
安装 pip3 install pytest
查看是否安装成功pytest --version
在python中我们定义框架时,不仅仅将所有的配置文件都放在一个文件夹下面,项目在之后慢慢的成熟起来,这样的文件就会很难去管理,在学完Django之后发现其成熟的框架,定义每一个路径下必须存储什么样的文件,这样在后期的管理会很方便,所以我们的框架也要为后期考虑。一般情况成熟的框架包含以下路径:
定义好了我自己的框架如下:
在框架下调用其他路径的模块就需要用到绝对路径和引用这个功能,在当下框架下
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
1、一个简单的示例
import __init
import tool
import pytest
def func(x):
return x ** 2
def test_func():
assert func(2) == 4
pytest.main()
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
执行结果:
3、pyetst.ini配置文件内容
pytest的配置文件通常放在测试目录下,名称为pytest.ini,命令行运行时会使用该配置文件中的配置.
[pytest]
命令行参数
addopts = -s
搜索文件名
python_files = test*.py
搜索的类名
python_classes = Test*
搜索的函数名
python_functions = test_*
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"])
结果
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("断言成功")```