Pytest
Pytest
Pytest是一种单元测试框架,Python第三方库,可以在框架内用Selenium或Requests编写自动化测试用例和执行测试用例,可拓展各类功能,包括日志、生成测试报告等等功能,是自动化框架必备的知识点,相比同类型库功能更多更灵活。
安装
pip install -U pytest
简单示例
#文件名test_1.py
from selenium import webdriver
import pytest
class Test_baidu_cese():
def test_one(self):
#第一个用例,打开百度,定位搜索框并输入123,等待一秒,退出
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.find_element('id','kw').send_keys('123')
time.sleep(1)
driver.quit()
def test_two(self):
#第二个用例,打开百度,定位搜索框并输入456,等待一秒,退出
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.find_element('id','kw').send_keys('456')
time.sleep(1)
driver.quit()
if __name__ == '__main__':
# 指定运行第二个用例,文件名::类名::方法名
pytest.main(["text_1.py::Test_baidu_cese::test_two"])
这样就可以指定用例运行
通过Pytest的特性,就能管理我们的用例,可以给用例分类,例如用例1是冒烟用例,用例2是某功能用例,通过main入口函数就能灵活选择特定分类运行
注意:Pytest有使用规则
- 文件名需要以 test_ 开头,以 _test 结尾也可以
- 类名需要以 Test_ 开头,并且不能带有 init 方法,注意这里Test首字母是大写
- 方法名需要以 test_ 开头
示例
#文件名test_file.py
class Test_class():
def test_def(self):
#用例内容
Pytest 默认只识别这些名称,可以通过修改配置文件来修改识别的名称
结构建议
假设项目中,不加入任何功能,只有Pytest
通常我们会将用例根据功能分开存放,不会把所有用例都放一起,否则用例多了不好维护
还需要一个main文件,作为运行文件,然后把所有测试文件都引入到main文件
项目
├─ test_Loggin.py => 登录功能
├─ test_Create.py => 以下四个分别对应不同功能
├─ test_Delete.py
├─ test_Update.py
├─ test_Retrieve.py
└─ main.py => 入口文件
前置后置
方法级别
在写某个功能的用例时,一般都有前置条件和后置条件,例如测试登录功能,首先需要先打开登录页面,在执行完用例后,会退出浏览器,打开某个页面和退出浏览器都是通用的前置后置条件,几乎每个测试是这样,这时可以用Pytest框架内的setup和teardown功能。
以之前的代码为例,修改完成后是这样
# 文件名test_1.py
from selenium import webdriver
import pytest
import time
class Test_baidu_cese():
# 前置条件,在类中添加setup方法,方法名字是固定的
def setup(self):
self.driver = webdriver.Chrome()
self.driver.get("https://www.baidu.com/")
def test_one(self):
# 第一个用例,打开百度,定位搜索框并输入123,等待一秒,退出
self.driver.find_element('id', 'kw').send_keys('123')
def test_two(self):
# 第二个用例,打开百度,定位搜索框并输入456,等待一秒,退出
self.driver.find_element('id', 'kw').send_keys('456')
# 后置条件,在类中添加teardown方法,方法名字是固定的
def teardown(self):
time.sleep(1)
self.driver.quit()
if __name__ == '__main__':
# 指定运行第二个用例,文件名::类名::方法名
pytest.main(["text_1.py::Test_baidu_cese::test_two"])
可以看到,在类中条件了两个方法,分别为 setup 和 teardown ,对应前置和后置
这样就实现了前置后置的使用,通常放一个功能里面用例的重复操作,减少代码的重复度
如果登录页面的域名路径修改了,按照这个方式来修改脚本,只需要修改一次代码
用最开始的案例去修改,有多少用例就要改多少次,非常麻烦
类级别
还有一个前置后置的方法,但是在一个类里面只执行一次
通常会放用例启动前的操作,例如数据库的启动
这里涉及到另外两个方法,分别为 setup_class 和 teardown_class,代码
# 文件名test_1.py
from selenium import webdriver
import pytest
import time
class Test_baidu_cese():
# 在类中只执行一次的前置条件
def setup_class(self):
pass
# 前置条件,在类中添加setup方法,方法名字是固定的
def setup(self):
self.driver = webdriver.Chrome()
self.driver.get("https://www.baidu.com/")
def test_one(self):
# 第一个用例,打开百度,定位搜索框并输入123,等待一秒,退出
self.driver.find_element('id', 'kw').send_keys('123')
def test_two(self):
# 第二个用例,打开百度,定位搜索框并输入456,等待一秒,退出
self.driver.find_element('id', 'kw').send_keys('456')
# 后置条件,在类中添加teardown方法,方法名字是固定的
def teardown(self):
time.sleep(1)
self.driver.quit()
# 在类中只执行一次的后置条件
def teardown_class(self):
pass
if __name__ == '__main__':
# 指定运行第二个用例,文件名::类名::方法名
pytest.main(["text_1.py::Test_baidu_cese::test_two"])
以上就是前置后置的功能实现方式,一般用于一个功能在开始测试前的操作
四个前置后置的运行是有先后顺序的,如下
- **setup_class()**类级
- setup() 函数级
- **teardown()**函数级
- **teardown_class()**类级
跳过测试函数
根据特定的条件,不执行标识的测试函数
方法:
skipif(condition, reason=None)
参数:
condition:跳过的条件,必传参数
reason:标注原因,必传参数
使用方法:
@pytest.mark.skipif(condition, reason="xxx")
例:
import pytest
class Test_ABC:
def setup_class(self):
print("------->setup_class")
def teardown_class(self):
print("------->teardown_class")
def test_a(self):
print("------->test_a")
assert 1
@pytest.mark.skipif(condition=2>1,reason = "跳过该函数") # 跳过测试函数test_b
def test_b(self):
print("------->test_b")
assert 0
执行结果:
test_abc.py
------->setup_class
------->test_a #只执行了函数test_a
.
------->teardown_class
s # 跳过函数
标记为预期失败函数
方法:
xfail(condition=None, reason=None)
常用参数:
condition:预期失败的条件,必传参数
reason:失败的原因,必传参数
使用方法:
@pytest.mark.xfail(condition, reason="xx")
示例:
import pytest
class Test_ABC:
def setup_class(self):
print("------->setup_class")
def teardown_class(self):
print("------->teardown_class")
def test_a(self):
print("------->test_a")
assert 1
@pytest.mark.xfail(2 > 1, reason="标注为预期失败") # 标记为预期失败函数test_b
def test_b(self):
print("------->test_b")
assert 0
执行结果:
test_abc.py
------->setup_class
------->test_a
.
------->test_b
------->teardown_class
x # 失败标记
参数化
固定模块
固定模块由 fixtures 翻译而来,可以译为夹具、固定装置、固定模块,以下用固定模块来讲解
使用固定模块也可以对测试用例进行前置和后置的处理,而且更加灵活,可以跨文件,跨功能、模块、类或者整个测试会话范围使用
简单示例
有一种情况,在某功能里有一个特殊的用例,他不需要前置后置,如果用 setup 和 teardown 方法,他就会跟其它用例一样,使用了前置后置,setup 和 teardown 显然不够灵活,这时可以用固定模块
from selenium import webdriver
import pytest
import time
# 通过装饰器注册一个固定模块供其它用例调用
@pytest.fixture
def page():
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
# yield在这里表示前置和后置的分界线
# yield上面是前置,下面是后置
yield driver
time.sleep(1)
driver.quit()
class Test_baidu_cese():
# 在参数内添加固定模块
def test_one(self,page):
page.find_element('id', 'kw').send_keys('123')
# 在参数内添加固定模块
def test_two(self,page):
page.find_element('id', 'kw').send_keys('456')
if __name__ == '__main__':
# 指定运行第二个用例,文件名::类名::方法名
pytest.main(["main.py"])
用这种方式就可以快速完成一个前置后置方法,而且可以指定哪个用例用这个固定模块
使用 @pytest.fixture 装饰器来将函数注册成固定模块
通过给用例传参或者使用 @pytest.mark.usefixtures("固定模块名称") 给用例添加固定模块,例如
import pytest
# 注册固定模块
@pytest.fixture()
def page():
print("固定模块开始")
yield "固定模块返回值"
print("固定模块结束")
# 第一种方式,直接作为参数传递
# 可以使用固定模块的返回参数
def test_one(page):
print(page)
print("用例1")
# 通过装饰器来使用固定模块
# 不建议使用这种方法,因为不能传参
@pytest.mark.usefixtures("page")
def test_two():
print("用例2")
结果
固定模块开始
固定模块返回值
用例1
固定模块结束
固定模块开始
用例2
固定模块结束
参数详解
@pytest.fixture(scope="function", autouse=False, name=None, params=None, ids=None)
def 固定模块():
pass
scope=[ "function"、"class"、"module"、"session "]
修改固定模块的作用域
分别为 function、class、module、session
对应 方法、类、文件、多个文件,默认值是 function
session:可以在多个文件使用
module:如果使用这个配置应用到用例中,会在文件中使用一次固定模块
class:如果一个类里有多个用例都调用了这个配置的固定模块,那么这个固定模块只会在class用例开始前执行一次
function:它的作用范围是每个测试用例之前运行一次
autouse=[ True、False ]
一般需要手动给用例添加固定模块,如果改为True,文件内的所有用例都会自动使用这个固定模块,但是不能给用例传参,如果固定模块有返回值,不建议使用这个方法
name="名称"
给固定模块修改名字
params=[ 列表数据 ]
参数化方法,给params数据,用例根据数据做不同响应
ids=[ 文本 ]
给每个数据进行标记
参数示例
from selenium import webdriver
import pytest
import time
# 设置两个参数给一个用例,这样一个用例会执行两次,然后把参数依次给到用例去处理
# 给 Info 固定模块的params参数使用
data = ["123","456"]
# params每传递一次参数,就按顺序把描述给到那个用例
# 给 Info 固定模块的ids参数使用
describe = ["first one text","first two text"]
# 自动配置到所有用例,但是由于有返回值,仍需要在用例使用固定模块参数
@pytest.fixture(autouse=True,name="start_test",params=data,ids=describe)
def Info(request):
print("开始测试,传递的参数为{}".format(request.param))
return request.param
@pytest.fixture()
def page():
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
yield driver
time.sleep(1)
driver.quit()
class Test_baidu_cese():
# 使用固定模块参数, Info固定模块因为 name 参数的原因被改为 start_test
def test_one(self, start_test, page):
# 获得这次用例的参数,第一次是"123",第二次是"456"
# 这样就一个用例运行了两次,获取到不同参数
page.find_element('id', 'kw').send_keys(start_test)
示例
如果说,我们希望用一个浏览器跑完所有用例,不用每次都退出创建新的浏览器,可以用下面的案例
from selenium import webdriver
import pytest
# 剥离webdriver的启动和退出
# 让其变成类级别固定模块
# 只在类中使用一次固定装置
# 配置scope为class
@pytest.fixture(scope="class")
def webdriver_fixtrue():
driver = webdriver.Chrome()
yield driver
driver.quit()
# 使用 webdriver_fixtrue 固定模块
@pytest.mark.usefixtures("webdriver_fixtrue")
class Test_baidu_cese():
# 在这个固定模块内调用webdriver_fixtrue固定模块
# 并且获取到返回值,返回webdriver_fixtrue给用例使用
@pytest.fixture(scope="function")
def page(self,webdriver_fixtrue):
webdriver_fixtrue.get("https://www.baidu.com/")
return webdriver_fixtrue
# 使用固定模块
def test_one(self, page):
page.find_element('id', 'kw').send_keys('123')
def test_two(self, page):
page.find_element('id', 'kw').send_keys('456')
公共文件
公共文件一般是用来放置固定模块的文件,这个文件内的固定模块可以被当前目录下所有用例文件检测到
文件名称是pytest系统写死的,只需要在命令下创建名为 conftest.py
文件即可使用
结构如下
project
├─ test_Loggin.py
├─ test_Create.py
├─ test_Delete.py
├─ test_Update.py
├─ test_Retrieve.py
├─ conftest.py <= 根目录下的公共文件
│
├─ OtherCases
│ ├─ test_one.py
│ ├─ test_two.py
│ └─ conftest.py <= OtherCases目录下的公共文件
│
└─ main.py
放置在 conftest.py
下的固定模块可以被同个目录下的用例文件使用
注意
文件名称是固定的,不能改动
只能被同目录下的用例文件检测到,不会传递到同目录下的文件夹内
测试用例文件中不需要手动import
pytest会自动查找
配置文件
如果想修改Pytest的默认设置,需要在项目根目录下添加 pytest.ini 文件
以下是文件内容,以及所有的设置示例,示例下方有各个条目的解释
# pytest.ini
[pytest]
addopts = --maxfail=2 -rf
markers =
smoke
loggin
cache_dir = ./路径
console_output_style = classic
doctest_encoding = 默认编码格式
doctest_optionflags = doctest 标志名称
empty_parameter_set_mark = skip 或 xfail 或 fail_at_collect
faulthandler_timeout=5
filterwarnings =
error
ignore::DeprecationWarning
junit_duration_report = call
junit_family = xunit2
junit_logging = system-out
junit_log_passing_tests = False
junit_suite_name = my_suite
log_auto_indent = False
log_cli = True
log_cli_date_format = %Y-%m-%d %H:%M:%S
log_cli_format = %(asctime)s %(levelname)s %(message)s
log_cli_level = INFO
log_date_format = %Y-%m-%d %H:%M:%S
log_file = logs/pytest-logs.txt
log_file_date_format = %Y-%m-%d %H:%M:%S
log_file_format = %(asctime)s %(levelname)s %(message)s
log_file_level = INFO
log_format = %(asctime)s %(levelname)s %(message)s
log_level = INFO
minversion = 3.0
norecursedirs = .svn _build tmp*
python_files = test_*.py check_*.py example_*.py
python_classes = *Suite
python_functions = *_test
pythonpath = src1 src2
required_plugins = pytest-django>=3.0.0,<4.0.0 pytest-html pytest-xdist>=1.0.0
testpaths = testing doc
usefixtures =
clean_db
xfail_strict = True
常规配置
addopts
配置每次启动测试所附带的运行参数,[参数列表]
cache_dir
设置缓存文件夹,用于记录用例信息上一次失败的用例,默认在根目录的.pytest
console_output_style
设置控制台输出样式:
classic: 经典的 pytest 输出
progress:类似于经典的 pytest 输出,但带有进度指示器
count:类似于进度,但显示已完成的测试数量而不是百分比
doctest_encoding
设置doctests默认编码格式,默认UTF-8
doctest_optionflags
doctest 标准模块中 的一个或多个 doctest 标志名称
empty_parameter_set_mark
参数为空的选择操作:
skip 跳过空参数的测试用例
xfail 标注空参数的用例失败
fail_at_collect 当收集到空参数的时候抛出异常
faulthandler_timeout
当测试用例的完成时间超过 X 秒时,则转储所有线程的回溯信息
filterwarnings
设置忽略的警告,并将所有其他警告转换为错误
junit_duration_report
配置如何将持续时间记录到JUnit XML报表中
total: (默认)报告持续时间,包括运行 setup / teardown 方法的时间
call: 报告持续时间,不包括运行 setup / teardown 方法的时间
junit_family
JUnit XML生成的格式
xunit1 默认值
xunit2 和Jekins更合适
junit_logging
配置捕捉到的输出是否写到 JUnit XML 中,有效值有:
log: 只写捕捉到的日志
system-out:写入标准输出内容
system-err::写入错误输出内容
out-err:写入标准输出和错误输出
all:写入所有,包括日志、标准输出、错误输出 no:不写入
junit_log_passing_tests
配置是否将成功用例的输出写入 JUnit XML 文件
junit_suite_name
设置根目录测试套的名称
日志配置
log_auto_indent
允许多行日志消息的选择性自动缩进
log_cli
在测试运行期间启用日志显示,进行实时日志记录,默认值为
False
log_cli_date_format
设置日志cli格式
log_cli_format
配置日志消息的格式
log_cli_level
设置日志的最低级别
log_date_format
设置日志格式
log_file
设置相对于当前项目路径的日志文件夹目录,里面存放的是日志文件
log_file_date_format
设置在日志文件夹中的日志文件格式
log_file_format
设置日志文件的格式
log_file_level
设置在日志文件夹中的日志文件的最低等级
log_format
设置日志文件的格式
log_level
设置日志文件的最低等级
用例配置
markers
用于将用例分组,例如
markers =
smoke: 冒烟用例
loggin: 登录用例
要设置用例的分组,需要在用例上添加 @pytest.mark.分组名
@pytest.mark.smoke def test_01(): pass @pytest.mark.loggin def test_01(): pass
运行时,在命令添加参数 -m smoke
pytest -m smoke : 只运行smoke组的用例
pytest -m smoke or loggin : 运行smoke 和 loggin 的用例
pytest -m not smoke : 运行所有用例,除了 smoke
minversion
设置运行测试最小 pytest 版本
norecursedirs
在 pytest 从文件里面找测试文件时,可以用这个参数来设置要忽略的文件夹
python_files
在 pytest 从文件里面找测试用例时,可以用这个参数来设置要查找的文件名
默认是以 test_ 为前缀 _test 为后缀
python_classes
在 pytest 从文件里面找测试用例时,可以用这个参数来设置要查找的类名
默认是以 Test_ 为前缀
python_functions
在 pytest 从文件里面找测试用例时,可以用这个参数来设置要查找的方法名
默认是以 test_ 为前缀
系统配置
pythonpath
类似于Python环境变量,设置的路径将包含在 Python 查找导入模块
required_plugins
设置要使用的插件
testpaths
在 pytest 从文件里面找测试文件时,可以用这个参数来设置要从哪个文件夹找测试文件,用来限制测试用例的搜索范围
usefixtures
usefixtures 是固定模块(fixture)用来标记用例,跟在代码中添加
@pytest.mark.usefixtures
功能相同。xfail_strict
如果设置为
True
,被标记为@pytest.mark.xfail
的用例,如果是测试通过,则会变成失败。通常我们会用来标记本来结果就是错误的用例,如果结果是错误的用例,但它成功了,就是失败用例
运行参数
在pytest中,可以用三种方式运行,第一种就是使用命令行,例如
# 意思是运行test_loggin.py文件里面的测试用例,-v是参数,意思是显示详细信息
pytest -v test_loggin.py
第二种方式就是用Python代码,pytest有一个main函数可以用来运行,例如
# 意思与上面一种方式一样
pytest.main(["-v","test_loggin.py"])
第三种方式是在配置文件中设置,配置文件的 addopts 可以用来配置运行参数
通常我们会把想长期改变的参数放在配置文件中,例如
[pytest]
addopts = -v -s
注意,每个参数间隔都有一个空格
通过修改配置文件,每次运行不管用python代码还是用命令行,都会带上这两个参数
格式:
#命令行运行
pytest [参数] [用例文件/文件夹路径] [用例文件/文件夹路径] [...]
#Python代码运行
pytest.main(["参数","用例文件/文件夹路径","用例文件/文件夹路径","..."])
#pytest.ini运行
[pytest]
addopts = [参数] [参数] [...]
以下是所有可用的参数
全局参数
-k [表达式]
通过表达式来指定用例来运行,可以模糊搜索,表达式用 and、or、not 连接
例如 -k test_loggin and test_smoke,意思是运行文件名带test_loggin或test_smoke的用例文件
或者-k not test_smoke,意思是除了名字带test_smoke的文件,其余用例文件全部运行
-m [分组]
在运行时挑出分组所在的用例运行,参考 [用例配置]
--markers
显示当前有什么分组
-x 或 --exitfirst
遇到失败时,全部用例停止
--fixtures 或 --funcargs
每次测试都显示固定模块(fixture)
--fixtures-per-test
显示每个用例用到的固定模块(fixture)
--pdb
在错误时,启用Python调试
--pdbcls=modulename:classname
指定Python调试器
--trace
在每次测试都启动Python调试
--capture=[ fd 或 sys 或 no ]
修改输出的捕获行为,fd是显示文件描述符,sys是显示stdout/stderr内存,no显示Python的print
-s
等同于上一条的 --capture=no 参数,
--runxfail
运行,且忽略被标记过 xfail 的用例
--lf 或 --last-failed
只运行上次运行失败的用例,如果没有上一次测试记录,则会全部运行
--ff 或 **--failed-first`
运行所有测试,但首先运行上一次失败的用例
--nf 或 --new-first
先运行新的用例,然后再运行其它的用例,通过文件时间判断
--cache-show
显示 .pytest_cache 文件内容,不会收集测试用例信息,用了这个命令不会执行测试用例
--cache-clear
在测试之前先清空 .pytest_cache 文件内容
--lfnf=[ all 或 none ] 或 --last-failed-no-failures=[ all 或 none ]
忽略所有用例的标记,运行所有用例,或不运行用例,根据 all 或 none 判断
--sw 或 --stepwise
测试失败就退出,而且在下一次测试失败用例时重新测试
--sw-skip 或 --stepwise-skip
忽略第一个失败的用例,第二个用例失败就停止所有测试
测试报告参数
--durations=[ 数字N ]
显示运行最慢的N个用例,填写0代表显示所有用例的运行时间
--durations-min=[ 数字N ]
获得运行时间大于N的用例,单位秒
-v 或 --verbose
显示用例的详细信息
--no-header
不显示标题信息
--no-summary
不显示摘要信息
-q 或 --quiet
简化输出信息
--verbosity=[数字]
设置显示等级
-r [ f 、E 、s 、x、X、p、P、a、w 、n]
默认值是 -r fE
可多选,例如 -r fEsxX
f: 显示失败的信息
E:显示错误的信息
s: 显示跳过的信息
x: 显示x失败的信息
X: 显示X通过的信息
p:显示通过的信息
P: 显示通过传递输出的信息
a: 显示除了通过之外的信息
w: 显示默认情况下警告信息
n: 用于重置列表
--disable-warnings 或 --disable-pytest-warnings
禁用所有警告信息
-l 或 --showlocals
在报错的回溯信息中显示局部变量,默认不显示
一般用于断言,断言会报错
--tb=[ auto、long、short、line、native、no ]
配置报错后回溯的信息怎么显示
auto:有多个用例失败的时候,只打印第一个和最后一个用例的报错回溯信息
long:显示最详细的报错回溯信息
short:只显示报错的位置
line: 只用一行输出错误信息
native:只显示Python标准库的回溯信息
no:不显示报错的回溯信息
--show-capture=[ no、stdout、stderr、log、all ]
设置失败的用例显示什么,默认全部显示
no:不显示信息
stdout: 标准输出信息
stderr: 标准错误信息
log: 日志信息
all: 显示所有信息
--full-trace
不裁剪任何报错回溯信息,默认会裁剪
--color=[ yes、no、auto ]
控制终端输出是否有颜色
--code-highlight=[ yes、no ]
控制终端输出的代码是否高亮显示
--pastebin=mode
发送失败用例的所有信息到 pastebin 服务(一个共享代码网站)
没什么用
--junit-xml=路径
指定 junit-xml 测试报告保存的路径
--junit-prefix=文本
在 junit-xml 测试报告中为类名添加前缀
异常处理参数
-W [Python的异常]
设置要显示的Python警告,内容填写Python的异常
--maxfail=[数字N]
在第N个失败用例时停止所有测试
--strict-config
在解析配置文件 pytest.ini 时,遇到警告就提示错误信息
--strict-markers
如果使用这个命令,在对用例使用分组,但没有在配置文件填写分组信息,会报错。
-c 文件路径
设置配置文件的路径,默认在项目根目录
--continue-on-collection-errors
即使用例发生错误,也强制执行测试
--rootdir=[ 文件夹路径 ]
设置测试用例的根目录,可以是相对路径和绝对路径
收集用例参数
在每次运行用例前,pytest都会在文件中找符合条件的测试文件,然后再测试
这一步叫收集用例,过程叫收集过程
--collect-only 或 --co
只收集用例、不执行用例
--pyargs
通过包执行测试用例
--ignore=[路径]
在收集过程中,忽略路径下的用例
--ignore-glob=[ 正则表达式 ]
在收集过程中,通过正则匹配的方式忽略用例,例如 *_01.py
这样就忽略所有后缀是01的py文件
--deselect=nodeid_prefix
在收集过程中,通过节点ID前缀的方式忽略用例。(允许多选)
--confcutdir=[文件夹路径]
只加载路径下的conftest.py文件
conftest.py文件通常用于给其它py文件做前置条件
这个文件可以被其它.py文件调用,是pytest系统写死的
--noconftest
不加载任何conftest.py文件
--keep-duplicates
在收集过程中,只收集重复的测试用例
--collect-in-virtualenv
在收集过程中,不忽略本地虚拟环境目录下的测试用例
--import-mode=[ prepend、append、importlib ]
在导入测试模块和conftest文件时 Prepend(预置)/append(追加) 到sys.path中,默认prepend(预置)
调试和配置信息
--basetemp=[ 文件夹路径 ]
设置临时目录的路径,这个目录会放置运行测试用例所产生的元数据
-V 或 --version
查看Pytest的版本
-h 或 --help
查看所有参数,就是这个文章的内容
-p 插件名称
用来加载插件,或禁止使用某插件
写法例如 -p doctest ,禁止插件的写法 -p no:doctest
--trace-config
查看已激活的插件
--debug=[ 调试信息文件名 ]
保存debug信息,默认的调试信息文件名是 pytestdebug.log
-o [配置文件信息] 或 --override-ini= [配置文件信息]
覆盖配置文件内的信息
--assert=[ plain、rewrite ]
plain:不执行任何断言
rewrite:重写测试模块中的assert语句
--setup-only
只设置固定模块(fixture),不执行测试
--setup-show
显示执行测试时固定模块(fixture)的设置
--setup-plan
显示哪些固定模块(fixture)和测试即将被执行,但不执行用例