一、pytest 安装
安装:pip install pytest
查看版本:pytest --version
二、简单测试
1、创建testcase.py,编写一个测试用例
def test(a):
assert a == 1 #使用assert 判断测试用例是否成功
2、运行
仅运行一个文件:pytest test.py
运行目录下所有测试用例:pytest testcase/
运行单个测试用例:pytest test_login.py::test_1(函数形式测试用例)
pytest tets_login.py::TestClass::test_1
运行并生成allure result:pytest -s --alluredir=./allure-results
allure报告转化可是html:allure generate -c -o allure-report /allure-results
三、pytest参数
1、pytest -k
执行某个关键字的用例
用例要匹配给出的表达式;使用python的语法,匹配的范围是文件名、类名、函数名为变量,用and来区分
pytest -k "test and TestClass and not test_a" # 表示测试TestClass 不包含test_a
2、--maxfail=num
当失败测试用例到达指定数字时,退出测试
3、-m MARKEXPR
只能运行有相应标识的测试用例,使用这个参数,测试用例要使用@pytest.mark.makername修饰
运行多个maker标记时
pytest -m "maker1 or maker2" 运行maker1 或maker2 标识的用例
pytest -m "maker1 and maker2" 运行maker1 和 maker2 标识的用例
pytest -m "maker1 and not maker2"运行maker1 和不包含 maker2 标识的用例
4、-v --verbose
详细结果
5、-q --quiet
简化结果显示,简化控制台输出,使用 .. 表示pass结果
6、-s
输出调试信息,比如print
7、-v
输出更加详细的测试执行信息
8、--junit-xml=path
输出xml文件格式
9、--result-log=path
测试结果输出到本地
四、pytest 使用规则
pytest可以在不同的函数、包中发现用例,发现的规则如下
- 文件名以test_开头的py文件
- 以test_开头的函数
- 以Test开头的类
- 以test_开头的方法(与2类似)
- 要注意的是所有的包必须要有init.py文件(在使用各种编辑器时会自动生成
五、setup和teardown
主要分为:模块级、类级、功能级、函数级
- 函数级别setup()/teardown():运行于测试方法的始末,即:运行一次测试函数会运行一次setup和teardown
- 类级别:运行于测试类的始末,即:在一个测试内只运行一次setup_class和teardown_class,不关心测试类内有多少个测试函数。
六、fixture
1、fixture主要功能及使用
- 传入测试中的数据集
- 配置测试前系统的初始状态,
- 为批量测试提供数据源
使用@pytest.fixture()装饰器声明fixture,pytest首先会检车到fixture函数,并在测试函数之前执行fixture,fixture完成一些测试之前的工作,也可以返回数据给其他测试函数
2、通过conftest.py 共享fixture
如果fixture只针对test_one.py这个文件,仅需把fixture放到该文件即可
如果testcase文件夹中多个文件都需要共享fixture,就需要在该文件夹下建立conftest.py,conftest.py的作用域是同级文件或文件夹,及同级文件夹里面的文件
3、fixture 作用范围
fixture里面有个scope参数可以控制fixture的作用范围:session>module>class>function,使用方式pytest.fixture(scope='function')
-function:每一个函数或方法都会调用
-class:每一个类调用一次,一个类中可以有多个方法
-module:每一个.py文件调用一次,该文件内又有多个function和class
-session:是多个文件调用一次,可以跨.py文件调用,每个.py文件就是module
4、yield 方法
使用yield关键字可以实现setup/teardown的功能,在yield关键字之前的代码在case之前执行,yield之后的代码在case运行结束后执行
@pytest.fixture()
def login():
print("登录")
yield
print("退出登录"
5、addfinalizer 方法
addfinalizer也可以实现环境的清理,实现与yield方法相同的效果,跟yield不同的是需要注册作为终结器使用的函数。
import pytest
@pytest.fixture()
def login(request):
print("登录")
def demo_finalizer():
print("退出登录")
# 注册demo_finalizer为终结函数
request.addfinalizer(demo_finalizer)
6、fixtur 自动应用
@pytest.fixture(autouse=True)
autouse设置为True时,自动调用fixture功能。由于默认作用域为function,不指定scope则每个方法都会调用fixture方法。
@pytest.mark.usefixtures()
7、fixture 参数化
如果多条用例都需要调用相同参数,可以将fixture函数参数化。fixture 函数将执行每个参数值,fixture通过固定参数request传递
import pytest
@pytest.fixture(scope="module", params=[
[1, 1, 2],
[2, 8, 10],
[99, 1, 100]
])
def data(request):
yield request.param
class Test_Demo():
def test_case1(self):
print("\n开始执行测试用例1")
assert 2 + 8 == 10
def test_case2(self, data):
print("\n开始执行测试用例2")
assert data[0] + data[1] == data[2]
def test_case3(self):
print("\n开始执行测试用例3")
assert 99 + 1 == 100
if __name__ == '__main__':
pytest.main()