Pytest基本用法
发布网友
发布时间:2023-04-11 10:58
我来回答
共1个回答
热心网友
时间:2023-05-24 01:14
1、pytest的规则:
①pytest支持 pip安装。
> pip install pytest
②即测试文件和测试函数必须以“test”开头。这也是在执行
“pytest”命令时并没有指定测试文件也可以执行 test_sample.py文件的原因,因为该文件名
以“test”开头。
③通过 main()方法执行测试用例呢?当然可以,pytest同样提供了
main()方法。
import pytest
def inc(x):
return x + 1
def test_answer():
assert inc(3) == 5
if __name__ == '__main__':
pytest.main()
2、基本用法:
①Fixture通常用来对测试方法、测试函数、测试类和整个测试文件进行初始化或还原测试环境。
主要用到模块级别和函数级别的 Fixture。
setup_mole/teardown_mole:在当前文件中,在所有测试用例执行之前与之后
执行。
setup_function/teardown_function:在每个测试函数之前与之后执行。
setup/teardown:在每个测试函数之前与之后执行。这两个方法同样可以作用于
类方法
主要用到类级别和方法级别的 Fixture。
setup_class/teardown_class:在当前测试类的开始与结束时执行。
setup_method/teardown_method:在每个测试方法开始与结束时执行。
setup/teardown:在每个测试方法开始与结束时执行,同样可以作用于测试函数。
运行结果
②pytest是支持使用测试类的,同样必须以“Test”开头,注意首字母大写。
③调用顺序如下:setup_mole>setup_class>setup_function>setup_method>setup>teardown>teardown_method>teardown_function>teardown_class>teardown_mole
#coding:utf-8
import pytest
def multiply(a,b):
return a*b
#-------------------Fixture------------
def setup_mole(mole):
print("\nsetup_mole,只执行一次,当有多个测试类的时候使用")
def teardown_mole(mole):
print("\nteardown_mole,只执行一次,当有多个测试类的时候使用")
def setup_function(function):
print("\nsetup_function,在每个测试函数之前执行。")
def teardown_function(function):
print("\nteardown_function,在每个测试函数之后执行。")
def setup():
print("setup------每个测试方式都执行一次----------->")
def teardown():
print("teardown-----每个测试方式都执行一次--------->")
def test_multiply_3_4():
print('test_numbers_3_4')
assert multiply(3,4) == 12
def test_multiply_2_3():
print('test_strings_2_3')
assert multiply(2,3) == 6
class TestPytest1(object):
@classmethod
def setup_class(cls):
print("\nsetup_class,只执行一次")
@classmethod
def teardown_class(cls):
print("\nteardown_class,只执行一次")
def setup_method(self):
print("\nsetup_method,每个测试方法都执行一次")
def teardown_method(self):
print("\nteardown_method,每个测试方式都执行一次")
def setup(self):
print("setup-----每个测试方式都执行一次------------>>")
def teardown(self):
print("teardown----每个测试方式都执行一次---------->>")
def test_numbers_5_6(self):
print('test_numbers_5_6')
assert multiply(5,6) == 30
def test_numbers_6_6(self):
print('test_numbers_6_6')
assert multiply(6,6) == 36
if __name__ == "__main__":
pytest.main()
3、参数化:
当一组测试用例有固定的测试数据时,就可以通过参数化的方式简化测试用例的编写。
pytest本身是支持参数化的,不需要额外安装插件。
#pytest参数化
@pytest.mark.parametrize(
"base,exponent,expected",
[(2,2,4),
(2,3,8),
(1,9,1),
(0,9,0)],
ids=["case1","case2","case3","case4"]
)
def test_pow(base,exponent,expected):
assert math.pow(base,exponent) == expected
if __name__ == "__main__":
pytest.main()
4、运行测试:
“-s”参数用于关闭捕捉,从而从控制台输出打印信息;
“-v”参数用于增加测试用例冗长,打印详细的日志信息,方便定位问题。
1.运行名称中包含某字符串的测试用例
> pytest -k add test_assert.py
test_assert.py文件中,我们写了很多测试用例,其中有 4条是关于 add()功能的,并且在测试用例的名称上包含了“add”字符串,因此这里可以通过“-k”来指定在名称中包含“add”的测试用例。
pytest -k "类名"
pytest -k '方法名'
pytest -k ’类名 and not 方法名‘#运行类里面所有的方法,不包含某个方法
2.减少测试的运行冗长
> pytest -q test_assert.py
“-q”用来减少测试运行的冗长;也可以使用“--quiet”代替。
3.如果出现一条测试用例失败,则退出测试
> pytest -x test_fail.py
这在测试用例的调试阶段是有用的,当出现一条失败的测试用例时,应该先通过调试让这条测试用例运行通过,而不是继续执行后面的测试用例。
4.用例失败个数达到阈值停止运行。具体用法:
>pytest --maxfail=[num]
5.运行测试目录
> pytest ./test_dir
测试目录既可以指定相对路径(如 ./test_dir),也可以指定绝对路(D:\pytest\test_dir)
6.指定特定类或方法执行
> pytest test_fixtures_02.py::TestMultiply::test_numbers_5_6
这里指定运行 test_fixtures_02.py文件中 TestMultiply类下的 test_numbers_5_6()方法,文件名、类名和方法名之间用“::”符号分隔。
7.通过 main()方法运行测试
import pytest
if __name__ == '__main__':
pytest.main(['-s', './test_dir'])
创建 run_tests.py文件,在文件中通过数组指定参数,每个参数为数组中的一个元素。