pytest和自带的unittest对比

  • unittest
    1、是python集成的,使用方便,也更广泛。
    2、可以使用@ddt参数化
    3、最多针对(模块)类级别的setup/teardown

  • pytest
    1、支持参数化,但是没有unittest灵活
    2、用例失败自动截图,pytest-html + conftest.py
    3、全局的setup/teardown conftest.py
    4、用例失败重跑,pytest-rerunfailures 重跑的插件

pytest使用

安装

默认源安装:
pip install pytest
用国内清华大学的源:
pip install pytest -i https://pypi.tuna.tsinghua.edu.cn/simple
参考:
下载安装慢,使用使用国内清华大学的源

pytest用例

# AddFunc.py
class AddFunc:

    def __init__(self,a,b,*args):
        self.a = a
        self.b = b
        self.other = args

    def add(self):
        sum_a = self.a + self.b
        if self.other:
            for o in self.other:
                sum_a += o
        return sum_a
# test_add.py
from com.**.** import AddFunc

def test_add_2num():
    a = AddFunc.AddFunc(1,2)
    result = a.add()
    assert result == 3


def test_add_3num():
    a = AddFunc.AddFunc(1,2,3)
    result = a.add()
    assert result == 6


def test_add_4num():
    a = AddFunc.AddFunc(1,2,3,5)
    result = a.add()
    assert result == 11

pytest命令

1、 pytest默认查找当前路径下(递归查)所有test_*.py*_test.py文件中所有的test_开头的用例
【pytest】pytest使用及conftest.py使用_python

2、 在测试文件中查找Test开头的类,以及类中以test开头的方法,查找测试文件中test开头的函数。
tips: 测试类的不应该有构造函数。
3、执行指定文件中的用例pytest test_case/test_add.py::test_add_2num
【pytest】pytest使用及conftest.py使用_构造函数_02

-s: 显示程序中的print/logging输出
-v: 丰富信息模式, 输出更详细的用例执行信息
-q: 安静模式, 不输出环境信息
-k:关键字模糊匹配,用and区分:匹配范围(文件名、类名、函数名)

4、 直接使用python命令python run.py

# run.py
if __name__ == '__main__':
    pytest.main(['-s', '-v']) #执行文件所在目录下的所有用例

fixture及conftest.py使用

  • 有独立的命名,并通过声明它们从测试函数、模块、类或整个项目中的使用来激活。
  • 按模块化的方式实现,每个fixture都可以互相调用。
  • fixture的范围从简单的单元扩展到复杂的功能测试,允许根据配置和组件选项对fixture和测试用例进行参数化,或者跨函数function、类class、模块module或整个测试会话session范围。

fixture使用
conftest使用

import pytest
from selenium import webdriver


@pytest.fixture(scope="session", autouse=True)
def browser():
    '''
    开启浏览器
    定义全局浏览器驱动
    :return:
    '''
    global driver
    driver = webdriver.Chrome()
    driver.maximize_window()
    return driver


@pytest.fixture(scope="session", autouse=True)
def closebrowser():
    print("关闭浏览器")
    yield  # 执行到这需要暂停
    driver.quit()