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_
开头的用例
2、 在测试文件中查找Test
开头的类,以及类中以test
开头的方法,查找测试文件中test
开头的函数。
tips: 测试类的不应该有构造函数。
3、执行指定文件中的用例pytest test_case/test_add.py::test_add_2num
-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范围。
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()