Pytest之收集用例規則與運行指定用例


前言

上篇文章相信大家已經了解了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條呢?綜合以上的代碼結構和我們的執行結果對比,我們應該能發現這樣的規律

Pytest會從我們當前運行的目錄開始查找所有目錄,查找以test_開頭的文件且文件中所有以test_開頭的函數和以Test開頭的類和類里面以test_開頭的函數為測試用例。這就是為什么上面之運行了6條測試用例!

Pytest運行指定測試用例

我們仍然使用上面的項目作為演示(cdm切換到項目的根目錄)

運行指定目錄下的所有用例

我們指定運行測試用例目錄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 ===========================
# 這樣就會只搜索和指定指定目錄下面所有的用

運行指定文件中的所有用例

我們指定運行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 ===========================
# 運行指定文件下的所有用例

運行指定文件中的測試類

我們指定運行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 ===========================
# 運行指定的測試類中的所有測試用

運行指定的測試用例函數

我們指定運行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 目錄/文件::函數名

搜索用例規則也是我們命名用例文件,測試類,測試函數的規則;執行指定測試用例記住規則即可


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM