安装
pip install pytest
用例设计原则
- 文件名 为test_*.py或*_test.py
- test_* 为测试函数名
- Test* 为测试类名
- test_* 为测试方法名
用例执行
- <font color=red>执行目录下的所有文件</font>
pytest dirname/
pytest test_mod.py
pytest test_mod.py::TestClass::test_method
pytest -k "MyClass"
- <font color=red>按照标记执行</font>
@pytest.mark.slow
def test_slow():
pass
@pytest.mark.fast
def test_fast():
pass
>>>pytest -m "slow and fast"
@pytest.mark.skip(reason="mark as skip")
def test_skip():
pass
@pytest.mark.skipif(skip_flag=False, reason="skip determined by the flag")
def test_skip_if():
pass
pytest -x
pytest --maxfail=n
- <font color=red>脚本调试使用</font>
pytest.main()
pytest.main(['test_mod.py', '-v'])
用例编写
assert a == b
assert a != b
assert a >= b
assert b <= b
assert a in b
assert a not in b
assert a is b
assert a is not b
assert True
assert False
import pytest
class TestClass:
def setup_class(self):
print("setup_class:类中所有用例执行之前")
def teardown_class(self):
print("teardown_class:类中所有用例执行之前")
def setup_method(self):
print("setup_method: 每个用例开始前执行")
def teardown_method(self):
print("teardown_method: 每个用例结束后执行")
def setup(self):
print("setup: 每个用例开始前执行")
def teardown(self):
print("teardown: 每个用例结束后执行")
def test_one(self):
print("执行第一个用例")
def test_two(self):
print("执行第二个用例")
def setup_module():
print("setup_module:整个.py模块只执行一次")
def teardown_module():
print("teardown_module:整个.py模块只执行一次")
def setup_function():
print("setup_function:每个方法用例开始前都会执行")
def teardown_function():
print("teardown_function:每个方法用例结束前都会执行")
- <font color=red>参数化 pytest.mark.parametrize(argnames, args)</font>
@pytest.mark.parametrize('text', ['test1','test2','test3'])
def test_one(text):
print(text)
@pytest.mark.parametrize(['username', 'pwd'], [('a', 1), ('b', 2), ('c', 3)])
def test_two(username, pwd):
print(username, pwd)
Fixture
import pytest
@pytest.fixture()
def get_url():
return "http://www.baidu.com"
def test_web(get_url):
print(get_url)
if __name__ == '__main__':
pytest.main()
- 作用域
- session: 会话级,一次测试只执行一次,所有被找到的函数和方法都可用
- module: 模块级,每个模块执行一次,模块内函数和方法都可使用
- function: 函数级,每个测试函数都会执行一次固件
- class: 类级别,每个测试类执行一次,所有方法都可以使用
#./conftest.py
@pytest.fixture(scope="class")
def text():
print("开始执行")
yield 'test'
print("执行完毕")
#./test_sample.py
@pytest.mark.usefixtures('text')
class TestClass:
def test_one(self):
print(text)
#./conftest.py
@pytest.fixture(scope='module', params=['test1', 'test2'])
def text(request):
print('开始执行')
yield request.param
print('执行完毕')
#./ test_sample.py
def test_one(text):
print(text)
- 配置文件
- 所有的fixture放在conftest.py文件中,自动发现,统一管理
生成报告
- <font color=red>html报告、顺序执行、失败重试</font>
pip install pytest-html # 生成html报告
pip install pytest-ordering # 按照顺序执行用例
pip install pytest-rerunfailures # 失败重试
pytest test_mod.py --html=./report.html
# pytest.mark.run(order=1)
# pytest.mark.run(order=2)
pytest test_mod.py # 按照mark标记的order顺序执行
pytest test_mod.py --reruns 3 # 失败重试3次
pytest --junitxml=report.xml
# install java
# install allure
pip install allure-pytest
pytest casedir/ --alluredir ./report
allure serve report