🍅 點擊文末小卡片,免費獲取軟件測試全套資料,資料在手,漲薪更快?
小伙伴們大家好呀,今天筆者會給大家講解一下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 == 1def func1():print('我不是一個測試用例')assert 1 == 1
# test_測試模塊2.py
class TestClass1(object):def test_class_func1(self):print('\n 我是一個類里面的測試用例 in test_class_func1')assert 1 == 1def class_func1(self):print('我是類里面的一個普通函數!')
# test_測試用例1.pyclass TestClass2(object):def test_class_func2(self):print('\n 我是一個類里面的測試用例 in test_class_func2',)assert 1 == 1def class_func2(self):print('我是類里面的一個普通函數!')def test_testFunc2():print('\n我是一個測試用例 in test_testFunc2!')assert 1 == 1def func2():print('我不是一個測試用例')assert 1 == 1
# 測試用例.pydef test_testFunc3():print('\n我是一個測試用例! in 測試用例.py')assert 1 == 1def func3():print('我不是一個測試用例')assert 1 == 1
# test_測試模塊3.pydef test_testFunc4():print('\n我是一個測試用例! in test_testFunc4')assert 1 == 1def func4():print('我不是一個測試用例')assert 1 == 1class TestClass3(object):def test_class_func3(self):print('\n 我是一個類里面的測試用例 in test_class_func3')assert 1 == 1def class_func3(self):print('我是類里面的一個普通函數!')
# 測試用例2.pydef test_testFunc5():print('\n我是一個測試用例! in test_testFunc5')assert 1 == 1def 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 itemstest_測試模塊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條呢?綜合以上的代碼結構和我們的執行結果對比,我們應該能發現這樣的規律
Pytest會從我們當前運行的目錄開始查找所有目錄,查找以test_開頭的文件且文件中所有以test_開頭的函數和以Test開頭的類和類里面以test_開頭的函數為測試用例。這就是為什么上面只運行了6條測試用例!
三、Pytest運行指定測試用例
我們仍然使用上面的項目作為演示(cdm切換到項目的根目錄)
3.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 ===========================
# 這樣就會只搜索和指定指定目錄下面所有的用
3.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.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 ===========================
# 運行指定的測試類中的所有測試用
3.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 目錄/文件::函數名
搜索用例規則也是我們命名用例文件,測試類,測試函數的規則;執行指定測試用例記住規則即可。
最后感謝每一個認真閱讀我文章的人,禮尚往來總是要有的,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走:
這些資料,對于做【軟件測試】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你!凡事要趁早,特別是技術行業,一定要提升技術功底。