前言
上篇文章相信大家已经了解了 pytest 在 cmd 下结合各种命令行参数如何运行测试用例, 并输出我们想要看到的信息. 那么今天会讲解一下 pytest 是如何收集我们写好的用例? 我们又有哪些方式来运行单个用例或者批量运行用例呢? 下面将为大家一一解答!
pytest 收集用例原理分析
首先我们按照如下目录结构新建我们的项目
[pyttest 搜索测试用例的规则]
|[测试用例目录 1]
| |__init__.py
| |test_测试模块 1.py
| |test_测试模块 2.py
|[测试用例目录 2]
| |__init__.py
| |test_测试用例 1.py
| | 测试用例. py
|test_测试模块. py
| 测试用例 2.py
代码实例
- # test_测试模块 1.py
- def test_testFunc1():
- print('\n 我是一个测试用例! in test_testFunc1')
- assert 1 == 1
- def func1():
- print('我不是一个测试用例')
- assert 1 == 1
- # test_测试模块 2.py
- class TestClass1(object):
- def test_class_func1(self):
- print('\n 我是一个类里面的测试用例 in test_class_func1')
- assert 1 == 1
- def class_func1(self):
- print('我是类里面的一个普通函数!')
- # test_测试用例 1.py
- class TestClass2(object):
- def test_class_func2(self):
- print('\n 我是一个类里面的测试用例 in test_class_func2',)
- assert 1 == 1
- def class_func2(self):
- print('我是类里面的一个普通函数!')
- def test_testFunc2():
- print('\n 我是一个测试用例 in test_testFunc2!')
- assert 1 == 1
- def func2():
- print('我不是一个测试用例')
- assert 1 == 1
- # 测试用例. py
- def test_testFunc3():
- print('\n 我是一个测试用例! in 测试用例. py')
- assert 1 == 1
- def func3():
- print('我不是一个测试用例')
- assert 1 == 1
- # test_测试模块 3.py
- def test_testFunc4():
- print('\n 我是一个测试用例! in test_testFunc4')
- assert 1 == 1
- def func4():
- print('我不是一个测试用例')
- assert 1 == 1
- class TestClass3(object):
- def test_class_func3(self):
- print('\n 我是一个类里面的测试用例 in test_class_func3')
- assert 1 == 1
- def class_func3(self):
- print('我是类里面的一个普通函数!')
- # 测试用例 2.py
- def test_testFunc5():
- print('\n 我是一个测试用例! in test_testFunc5')
- assert 1 == 1
- def func5():
- print('我不是一个测试用例')
- assert 1 == 1
下面我们使用 cmd 命令来执行一下这个项目, 看一下究竟会有多少条用例是有效的用例? 打开 cmd 切换到项目的根目录执行命令 pytest -v
D:\pytest 搜索测试用例规则 > pytest -v
- ============================= test session starts =============================
- platform win32 -- Python 3.6.4, pytest-3.8.0, py-1.6.0, pluggy-0.7.1 -- c:\python36\python.exe
- cachedir: .pytest_cache
- metadata: {
- 'Python': '3.6.4', 'Platform': 'Windows-10-10.0.17134-SP0', 'Packages': {
- 'pytest': '3.8.0', 'py': '1.6.0', 'pluggy': '0.7.1'
- }, 'Plugins': {
- 'metadata': '1.8.0', 'html': '1.20.0', 'allure-adaptor': '1.7.10'
- }, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_181'
- }
rootdir: D:\pytest 搜索测试用例规则, inifile:
- plugins: metadata-1.8.0, HTML-1.20.0, allure-adaptor-1.7.10
- collected 6 items
test_测试模块 3.py::test_testFunc4 PASSED [ 16%]
test_测试模块 3.py::TestClass3::test_class_func3 PASSED [ 33%]
测试用例目录 1/test_测试模块 1.py::test_testFunc1 PASSED [ 50%]
测试用例目录 1/test_测试模块 2.py::TestClass1::test_class_func1 PASSED [ 66%]
测试用例目录 2/test_测试用例 1.py::TestClass2::test_class_func2 PASSED [ 83%]
测试用例目录 2/test_测试用例 1.py::test_testFunc2 PASSED [100%]
========================== 6 passed in 0.59 seconds ===========================
运行结果可以看到一共有 6 条用例 passed, 且详细的列出了是哪 6 条, 那么按照我们上面编写的用例其实并不止 6 条, 那么为什么会只运行了 6 条呢? 综合以上的代码结构和我们的执行结果对比, 我们应该能发现这样的规律
pytets 会从我们当前运行的目录开始查找所有目录, 查找以 test_开头的文件且文件中所有以 test_开头的函数和以 Test 开头的类和类里面以 test_开头的函数为测试用例. 这就是为什么上面之运行了 6 条测试用例!
pytest 运行指定测试用例
我们仍然使用上面的项目作为演示 (cdm 切换到项目的根目录)
1. 运行指定目录下的所有用例
我们指定运行测试用例目录 1 里面的所有用例 (pytest -v 测试用例目录 1)
D:\pytest 搜索测试用例规则 > pytest -v 测试用例目录 1
- ============================= test session starts =============================
- platform win32 -- Python 3.6.4, pytest-3.8.0, py-1.6.0, pluggy-0.7.1 -- c:\python36\python.exe
- cachedir: .pytest_cache
- metadata: {
- 'Python': '3.6.4', 'Platform': 'Windows-10-10.0.17134-SP0', 'Packages': {
- 'pytest': '3.8.0', 'py': '1.6.0', 'pluggy': '0.7.1'
- }, 'Plugins': {
- 'metadata': '1.8.0', 'html': '1.20.0', 'allure-adaptor': '1.7.10'
- }, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_181'
- }
rootdir: D:\pytest 搜索测试用例规则, inifile:
- plugins: metadata-1.8.0, HTML-1.20.0, allure-adaptor-1.7.10
- collected 2 items
测试用例目录 1/test_测试模块 1.py::test_testFunc1 PASSED [ 50%]
测试用例目录 1/test_测试模块 2.py::TestClass1::test_class_func1 PASSED [100%]
- ========================== 2 passed in 0.05 seconds ===========================
- # 这样就会只搜索和指定指定目录下面所有的用
2. 运行指定文件中的所有用例
我们指定运行 test_测试模块 1.py(pytest -v 测试用例目录 1/test_测试模块 1.py)
D:\pytest 搜索测试用例规则 > pytest -v 测试用例目录 1/test_测试模块 1.py
- ============================= test session starts =============================
- platform win32 -- Python 3.6.4, pytest-3.8.0, py-1.6.0, pluggy-0.7.1 -- c:\python36\python.exe
- cachedir: .pytest_cache
- metadata: {
- 'Python': '3.6.4', 'Platform': 'Windows-10-10.0.17134-SP0', 'Packages': {
- 'pytest': '3.8.0', 'py': '1.6.0', 'pluggy': '0.7.1'
- }, 'Plugins': {
- 'metadata': '1.8.0', 'html': '1.20.0', 'allure-adaptor': '1.7.10'
- }, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_181'
- }
rootdir: D:\pytest 搜索测试用例规则, inifile:
- plugins: metadata-1.8.0, HTML-1.20.0, allure-adaptor-1.7.10
- collected 1 item
测试用例目录 1/test_测试模块 1.py::test_testFunc1 PASSED [100%]
- ========================== 1 passed in 0.09 seconds ===========================
- # 运行指定文件下的所有用例
3. 运行指定文件中的测试类
我们指定运行 test_测试模块 2.py 中的测试类 Testclass1(pytest -v 测试用例目录 1/test_测试模块 2.py::TestClass1)
D:\pytest 搜索测试用例规则 > pytest -v 测试用例目录 1/test_测试模块 2.py::TestClass1
- ============================= test session starts =============================
- platform win32 -- Python 3.6.4, pytest-3.8.0, py-1.6.0, pluggy-0.7.1 -- c:\python36\python.exe
- cachedir: .pytest_cache
- metadata: {
- 'Python': '3.6.4', 'Platform': 'Windows-10-10.0.17134-SP0', 'Packages': {
- 'pytest': '3.8.0', 'py': '1.6.0', 'pluggy': '0.7.1'
- }, 'Plugins': {
- 'metadata': '1.8.0', 'html': '1.20.0', 'allure-adaptor': '1.7.10'
- }, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_181'
- }
rootdir: D:\pytest 搜索测试用例规则, inifile:
- plugins: metadata-1.8.0, HTML-1.20.0, allure-adaptor-1.7.10
- collected 1 item
测试用例目录 1/test_测试模块 2.py::TestClass1::test_class_func1 PASSED [100%]
- ========================== 1 passed in 0.05 seconds ===========================
- # 运行指定的测试类中的所有测试用
4. 运行指定的测试用例函数
我们指定运行 test_testFunc1(pytest -v 测试用例目录 1/test_测试模块 1.py::test_testFunc1)
D:\pytest 搜索测试用例规则 > pytest -v 测试用例目录 1/test_测试模块 1.py::test_testFunc1
- ============================= test session starts =============================
- platform win32 -- Python 3.6.4, pytest-3.8.0, py-1.6.0, pluggy-0.7.1 -- c:\python36\python.exe
- cachedir: .pytest_cache
- metadata: {
- 'Python': '3.6.4', 'Platform': 'Windows-10-10.0.17134-SP0', 'Packages': {
- 'pytest': '3.8.0', 'py': '1.6.0', 'pluggy': '0.7.1'
- }, 'Plugins': {
- 'metadata': '1.8.0', 'html': '1.20.0', 'allure-adaptor': '1.7.10'
- }, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_181'
- }
rootdir: D:\pytest 搜索测试用例规则, inifile:
- plugins: metadata-1.8.0, HTML-1.20.0, allure-adaptor-1.7.10
- collected 1 item
测试用例目录 1/test_测试模块 1.py::test_testFunc1 PASSED [100%]
========================== 1 passed in 0.03 seconds ===========================
总结
收集用例规则: 搜索所有以 test_开头的测试文件, 以 Test 开头的测试类, 以 test_开头的测试函数
执行用例规则: 从 - v 参数输出的执行信息我们就应该能发现, 运行指定的目录下用例 使用命令 pytest 目录 / 目录 即可; 运行指定文件使用 pytest 目录 / 文件 即可; 运行指定类或者函数 使用命令 pytest 目录 / 文件:: 类名:: 函数名 或者 pytest 目录 / 文件:: 函数名
搜索用例规则也是我们命名用例文件, 测试类, 测试函数的规则; 执行指定测试用例记住规则即可
来源: https://www.cnblogs.com/linuxchao/p/linuxchao-pytest-3.html