Pytest編寫測試用例(二)


       在前面對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里面,第一個參數也就是測試函數的請求參數,需要一一對應,第二個請求參數是

是在里面里面的元組,也是需要與第一個請求參數,這樣就是有幾組請求參數,也就意味着有幾個測試用例,在測試用例的函數中,也

是有參數的,也是與上面的需要一一的對應。在某些特殊的場景下,這個功能特別的厲害和強大,比如剛才寫的函數來測試該函數的

功能,執行該測試代碼,見執行后的結果信息:

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

 


免責聲明!

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



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