当前位置: 首页>后端>正文

Pytest使用

安装

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

  • 第一个(N个)失败后停止测试
pytest -x

pytest --maxfail=n
  • <font color=red>脚本调试使用</font>
pytest.main()

pytest.main(['test_mod.py', '-v'])

用例编写

  • 断言 assert
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

  • setup和teardown
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次

  • xml报告
pytest --junitxml=report.xml
  • allure report
# install java
# install allure

pip install allure-pytest

pytest casedir/ --alluredir ./report

allure serve report

https://www.xamrdz.com/backend/3qb1927802.html

相关文章: