网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
-v: 详细信息
-k: 运行指定包含某个字符串的测试函数
pytest.main([“-k”,“hello”]) -> 执行测试函数名中带有hello字符串的用例 (同样也可以指定类名,会执行类中所有测试方法)
pytest.main([“-k”,“类名 and not 方法名”])
-q: 简化输出
-x: 只要出现一条失败的用例都会退出
–maxfail: 用例失败个数达到阀值停止运行
pytest.main([“–maxfail=2”]) -> 超过2条运行失败,后续用例就会停止运行
-m: 指定带有标识的用例
pytest.main([“-m”,“smoke”]) -> 执行有 @pytest.mark.smoke 这个标记的测试用例
–durations: 查看最慢的n个用例
pytest.main([“–durations=10”]) 查看最慢10个用例
-p no:doctest 关闭插件,比如关闭doctest
pytest断言
语法:assert expression, errorMsg
assert a % 2 == 0, “value was odd, should be even”
预期异常的断言 pytest.raise() 递归超时
pytest参数化
1、@pytest.mark.parametrize(" 变量名… ", 数据)
2、metafunc.parametrize()
1 def pytest_generate_tests(metafunc):
2 idlist = []
3 argvalues = []
4 # metafunc.cls就是Test_Case类
5 for scenario in metafunc.cls.scenarios:
6 idlist.append(scenario[0])
7 items = scenario[1].items()
8 argnames = [x[0] for x in items] #
9 argvalues.append([x[1] for x in items])
10 # 给metafunc也就是Test_Case类下的方法全部带上这个parametrize
11 metafunc.parametrize(argnames, argvalues, ids=idlist, scope="class")
12
13
14 scenario1 = ("basic", {"attribute": "value"})
15 scenario2 = ("advanced", {"attribute": "value2"})
16
17
18 class Test_Case:
19 scenarios = [scenario1, scenario2]
20
21 def test_demo1(self, attribute):
22 assert isinstance(attribute, str)
23
24 def test_demo2(self, attribute):
25 assert isinstance(attribute, str)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
testcases/test_case01.py::Test_Case::test_demo1[basic] PASSED
testcases/test_case01.py::Test_Case::test_demo2[basic] PASSED
testcases/test_case01.py::Test_Case::test_demo1[advanced] PASSED
testcases/test_case01.py::Test_Case::test_demo2[advanced] PASSED
3、@pytest.mark.parametrize(" 方法名", 数据, indirect=True) 将数据先传递给“方法名”对应的夹具函数进行处理,并且夹具函数接收一个参数request
1 @pytest.fixture
2 def fixt(request): # 这里需要带有参数request,request.param可以拿到["a", "b"]
3 return request.param * 3
4
5 @pytest.mark.parametrize("fixt", ["a", "b"], indirect=True) #indirect=True,会将数据["a", "b"]传递给fixt函数进行处理
6 def test_indirect(fixt):
7 assert len(fixt) == 3
pytest 生成测试报告
allure报告
1、安装jdk1.8才可以运行
2、解压Allure压缩包
3、配置Allure到环境变量 将allure下的bin配置到环境变量path中
生成allure报告: allure generate ./result/ -o ./report/ --clean
pytest.main([“–alluredir”, “./result”])
pytest traceback输出 作为了解即可 就是显示报错信息的详细程度不同
pytest --showlocals
pytest -l
pytest --tb=auto 默认这种
pytest --tb==line …
pytest pdb调试模式
pytest --pdb # 每次遇到失败都会进到调试 pdb
pytest -x --pdb # 第一次遇到失败进入pdb,结束测试执行
pytest --pdb --maxfail=3 # 只有钱三次失败跳转到pdb
进入pdb 交互调试常用命令
1、p : 输出变量expr的值
2、l : 列出错误,显示出错的代码
3、a : 打印当前函数的所有参数和变量
4、u : 移动到堆栈的上一层
5、d: 移动到堆栈的下一层
6、q : 退出pdb
pytest fixture夹具
1、@pytest.mark.usefixtures(xxx)
1、fixture函数没法传递返回值给测试用例
2、叠加使用usefixtures 叠加执行顺序 -> 先执行放下方,后执行放上方
2、fixture
autouse = True 测试用例自动使用该fixture函数
scope 指定作用域
params 指定传入的数据
案例演示 用于做数据驱动前 做数据处理
pytest 跳过测试用例
-
无条件跳过模块中的所有测试:pytestmark = pytest.mark.skip(“all tests still WIP”)
-
根据某些条件跳过模块中的所有测试:pytestmark = pytest.mark.skipif(sys.platform == “win32”,reason=“tests for linux only”)
-
如果缺少某些导入,则跳过模块中的所有测试:pexpect = pytest.importorskip(“pexpect”)
当使用参数化时,可以对单个测试实例应用诸如skip和xfail之类的标记
pytest 与 unittest 对比
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
2079)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!