1.分类
2.主要作用
1.基于python的单元测试框架,它可以和selenium,requests,appium结合实现自动化测试。
2.实现用例跳过skip和reruns失败用例重跑。
3.它可以结合allure-pytest插件生成allure报告。
4.很方便和jenkins实现持续集成。
5.有很多强大的插件:
放到一个requirements.txt的文档中,如:
pytest
pytest-html
pytest-xdist
pytest-ordering
pytest-rerunfailures
allure-pytest
然后通过:pip install -r requirements.txt
1.模块名必须以test_开头或者_test结尾。
2.测试类必须以Test开头,并且不能带有init方法。
3.测试用例必须以test_开头。
命令规范:
常见参数:
-v
:输出更加详细的信息。比如文件和用例名称等。
-s
:输出调试信息。打印信息等。
可以合并成:-vs
--reruns 2
:失败重跑N次
-x
:出现1个失败就停止测试。
--maxfail=2
出现N个失败就终止测试。
--html=report.html
生成html的测试报告
-n:
多线程。
-k:
运行测试用例名称中包含指定字符串的用例。
指定字符串运行测试用例:
import pytest
if __name__ == "__main__":
pytest.main(['-vs','--reruns=2','-k','01'])
指定模块运行测试用例:
pytest.main(['-vs','testcases/test_01.py'])
指定文件夹运行测试用例:
pytest.main(['-vs','testcases/'])
通过node id的方式运行测试用例
pytest.main(['-vs','testcases/test_02.py::Test02::test_02'])
先切换到要执行的项目根目录下,然后执行pytest
命令
pytest
pytest -vs testcases/test_02.py::Test02::test_01
注:不管是命令行还是主函数都会读取这个配置文件
特别提示:此文件中最好不要出现中文, 如果有中文的情况下,比如使用notpad++改成GBK的编码。
pytest.ini 文件内容:
[pytest]
addopts = -vs -m smoke
testpaths = testcases/
python_files = test_*.py
python_classes = Test*
python_functions = test_*
markers =
smoke: smoke testcases
product: product testcases
用例里面加标记:
执行的时候通过-m
参数指定标记:addopts = ‐vs ‐m smoke
import pytest
class Test02:
@pytest.mark.smoke
def test_01(self):
print("Test02--test01")
@pytest.mark.product
def test_02(self):
print("Test02--test02")
raise Exception("自定义异常Test02--test02")
默认顺序是从上到下
改变默认用例的执行顺序:在用例上加标记:@pytest.mark.run(order=1)
import pytest
class Test02:
@pytest.mark.run(order=2)
@pytest.mark.smoke
def test_01(self):
print("Test02--test01")
@pytest.mark.run(order=1)
@pytest.mark.smoke
def test_02(self):
print("Test02--test02")
raise Exception("自定义异常Test02--test02")
注意:有order装饰器的优先,相同的从上到下,然后再是没有装饰器的,负数不起作用。
@pytest.mark.skip()
@pytest.mark.skip(reason="粒度不需要")
@pytest.mark.run(order=2)
@pytest.mark.smoke
def test_01(self):
print("Test02--test01")
@pytest.mark.skipif()
version = 3
@pytest.mark.skipif(version > 2, reason="以后的版本都不执行")
@pytest.mark.run(order=1)
@pytest.mark.smoke
def test_02(self):
print("Test02--test02")
raise Exception("自定义异常Test02--test02")
import pytest
def setup_module(self):
print("在每个模块之前执行")
def teardown_module(self):
print("在每个模块之后执行")
class Test03:
@pytest.mark.smoke
def test_duo_class(self):
print("多个类的情况")
class Test02:
def setup_class(self):
print("在每个类之前执行,应用举例:创建日志对象(若创建多个日志对象,会导致日志出现重复),创建数据库链接")
def teardown_class(self):
print("在每个类之后执行,应用举例:销毁日志对象(,关闭数据库链接")
def setup(self):
print("在每个用例之前执行,应用举例:日志开始")
def teardown(self):
print("在每个用例之后执行,应用举例:日志结束")
@pytest.mark.run(order=2)
@pytest.mark.smoke
def test_01(self):
print("Test02--test01")
@pytest.mark.smoke
def test_02(self):
print("Test02--test02")
raise Exception("自定义异常Test02--test02")