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"])

以上就是前置后置的功能实现方式,一般用于一个功能在开始测试前的操作

四个前置后置的运行是有先后顺序的,如下

  1. **setup_class()**类级
  2. setup() 函数级
  3. **teardown()**函数级
  4. **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.pyopen in new window

文件即可使用

结构如下

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.pyopen in new window

下的固定模块可以被同个目录下的用例文件使用

注意

文件名称是固定的,不能改动

只能被同目录下的用例文件检测到,不会传递到同目录下的文件夹内

[不同目录可以有自己的conftest.pyopen in new window]

一个项目中可以有多个conftest.pyopen in new window

测试用例文件中不需要手动import

conftest.pyopen in new window

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)和测试即将被执行,但不执行用例