在前面對Pytest做了大概的概述,本節中主要總結Pytest在編寫測試用例方面的的知識體系。
在實際的工作中,並不是所有的測試用例都是需要執行的,某些測試用例不想被執行,可以添加
一個忽略執行,這地方就會使用到裝飾器,如果對裝飾器不熟悉的同學可以看看我的函數知識體系
里面對裝飾器的總結和概述。見如下的案例代碼:
#!/usr/bin/env python # -*-coding:utf-8 -*- import pytest @pytest.mark.login def test_login_001(): pass @pytest.mark.login def test_login_002(): pass @pytest.mark.skip(reason='忽略執行該測試用例') def test_login_003(): pass
執行命令pytest -rs,就能夠顯示出忽略執行的測試用例的詳細信息,見如下的截圖信息:

如果參數沒有-rs,就不會顯示出詳細的忽略執行的信息,見截圖:

對測試用例進行分組執行,使用到的命令會有-m,也會有-k,見案例的源代碼:
#!/usr/bin/env python # -*-coding:utf-8 -*- import pytest @pytest.mark.login def test_login_001(): pass @pytest.mark.login def test_login_002(): pass @pytest.mark.user def test_user_001(): pass @pytest.mark.user def test_user_002(): pass
先使用-k測試搜索的方式來執行,執行的命令為:pytest -k "login or user",見執行結果輸出信息:

這里我們使用-m的命令來執行,執行的命令為:pytest -m login

可以看到只會執行login分組的測試用例,而user分組的測試用例並不會被執行。當然有人可能會有疑問,想執行多個分組的怎么
辦了?簡單,實用-k測試搜索的方式進行。
下面來看測試用例的執行結果,測試子集的執行,先來看目前項目的結構目錄:

這里執行tests包下所有的測試用例,執行的命令為:pytest tests/ --tb=no,見執行的結果截圖:

當然-v 顯示出詳細的信息,--duration顯示出測試用例執行的耗時時間從長到短的排序,見如下的結果截圖信息:

在前面的案例代碼中,都是關於函數式的編程方式,這里主要介紹面向對象的編程方式的應用,廢話還是不多說,直接
上案例的代碼:
#!/usr/bin/env python # -*-coding:utf-8 -*- import pytest class TestXunit(object): def test_001(self): pass def test_002(self): pass
先單獨執行該模塊里面所有的測試用例,見執行的結果截圖信息:

下來想執行一個測試類里面的具體測試用例,比如執行test_001的測試用例,執行的命令為:pytest -v 測試模塊::測試類::測試用例,
見如下的結果截圖信息:

在UI自動化測試中,selenium是一個主流的測試框架,在pytest也是支持對selenium的操作,需要安裝第三方的庫,安裝
的命令為:
pip install pytest-selenium
在這里特別是強調,在一個測試函數或者是一個測試方法中,selenium是固定參數,指的是driver,對selenium框架熟悉的
同學知道,要操作瀏覽器,首先需要對webdriver進行實例化后,可以對瀏覽器進行操作。還是先來看簡單的案例應用,打開
百度,斷言百度的title,見案例的代碼:
#!/usr/bin/env python # -*-coding:utf-8 -*- import pytest def test_baidu_title(selenium): selenium.get('http://www.baidu.com') assert selenium.title=='百度一下,你就知道'
在執行命令的時候,需要指定驅動driver以及要執行的瀏覽器,命令為:
pytest 測試模塊 --driver Chrome(指定測試的瀏覽器),見執行結果的截圖信息:

瀏覽器會自動打開,然后做業務操作,然后自動關閉,所以中間省去了打開瀏覽器和關閉瀏覽器的過程,編寫測試類,完善下
這部分的測試場景,見案例的代碼:
#!/usr/bin/env python # -*-coding:utf-8 -*- import pytest class TestSelenium(object): def test_baidu_title(self,selenium): selenium.get('http://www.baidu.com') assert selenium.title == '百度一下,你就知道' def test_baidu_url(self,selenium): selenium.get('http://www.baidu.com') assert selenium.current_url=='https://www.baidu.com/' def test_baidu_so(self,selenium): '''獲取搜索的關鍵字然后斷言''' selenium.get('http://www.baidu.com') so=selenium.find_element_by_id('kw') so.send_keys('無涯課堂') assert so.get_attribute('value')=='無涯課堂'
執行的命令和前面的一樣,其實使用pytest-selenium完全可以頁面對象設計模式,把我很早期的代碼
做一個簡單的修改就可以了,這里解釋了,后面寫文章解釋。見執行如上的代碼后,輸出的結果信息截圖:

這里特別的強調,都多少個測試用例,瀏覽器打開關閉多少次。這個庫很有意思的,后面我會結合框架寫一套代碼
讓大家玩。
還有一種一種需求是按測試名稱來執行的,也就是依據名稱來指定測試集合,還是以具體的案例為實例來說明這
部分的應用,見案例源碼:
#!/usr/bin/env python # -*-coding:utf-8 -*- import pytest def test_api_001(): pass def test_api_002(): pass
這里使用到的命令是-k,它可以測試搜索到api的測試用例並且執行,見執行命令后輸出的結果信息:

就會找到_api的測試用例並且會被執行。-k這個命令參數感覺特別的好使用。
下來來看參數化的部分,學習過ddt框架的同學可能知道,ddt它在相同的測試步驟中,可以實現一個測試用例的代碼
依據請求參數的不同測試多個測試場景,關於這部分我在UI里面講的也是比較多,在接口里面講的基本很少,可以說是
沒有。這里主要來看pytest中參數化的應用,比如有個函數,是兩個數相加,需要測試的是兩個數相加后的結果信息,還
是直接上代碼,見案例源碼:
#!/usr/bin/env python # -*-coding:utf-8 -*- import pytest def add(a,b): return a+b @pytest.mark.parametrize('a,b,result',[ (1,1,2), (2,2,4), (3,3,6), (4,4,8), (5,5,10)]) def test_add(a,b,result): assert add(a,b)==result
首先我來解釋下上面的代碼,裝飾器parameterize里面,第一個參數也就是測試函數的請求參數,需要一一對應,第二個請求參數是
是在里面里面的元組,也是需要與第一個請求參數,這樣就是有幾組請求參數,也就意味着有幾個測試用例,在測試用例的函數中,也
是有參數的,也是與上面的需要一一的對應。在某些特殊的場景下,這個功能特別的厲害和強大,比如剛才寫的函數來測試該函數的
功能,執行該測試代碼,見執行后的結果信息:

如您對我寫的內容感興趣,可關注我的公眾號和購買我的視頻課程,謝謝您!


