35 web自動化 pytest框架詳述


目錄

1.編寫測試用例 web_cases.xlsx

2.框架搭建

3.自動化用例實現

4.用例篩選

 

一、流程

首先,在實戰之前,回顧好selenium的基礎知識。77節

只要是沒有現成封裝的方法可以使用,都可以通過發送JS代碼的方式進行操作。

 

1.編寫測試用例 web_cases.xlsx

2.框架搭建

    須知:在接口自動化測試中,已經有現成的框架,可以直接拿來用。

   ①common  通用模塊,不以項目為轉移的

  可以直接將common目錄直接拷貝到web自動化框架中來,(可以用,不代表一定要用,比如其中,MySQL_hanlder、request_handler不需要,web自動化中,不需要這2方面的操作,需要用的時候,可以直接復制過來用)

   ②config 配置文件

  可以直接拷貝模塊,但是內容需要根據項目情況進行修改(比如,路徑、logger不需要修改,   修改賬號)

   ③data、libs、logs、middware、reports、testcases、run.py同理

框架的搭建,基本上跟接口的框架類似

 

3.自動化用例實現(web自動化測試中,登錄成功、登錄錯誤的步驟是不一樣的,要分開寫)

編寫測試用例腳本,根據web_testcases.xlsx文件進行編寫。

舉例:登錄失敗用例

 步驟如下:

1.打開瀏覽器
2.訪問登錄頁面
3.元素定位+元素操作,輸入用戶名和密碼,點擊登錄
4.通過獲取頁面內容得到實際結果,進行斷言

根據上述步驟,編寫web自動化測試腳本(需要登錄的web頁面如下)

 

 手機號為空時,顯示顯示“請輸入手機號”,作為斷言

 

代碼實現test_login.py:

"""登錄功能的測試用例"""

import unittest
from middware.handler import HandlerMiddle
from config.config import Wait_time

class TestLogin(unittest.TestCase):
    """登錄功能的測試類"""

    def test_login_error(self):
        """測試步驟
        1.打開瀏覽器
        2.訪問登錄頁面
        3.元素定位+元素操作,輸入用戶名和密碼,點擊登錄
        4.通過獲取頁面內容得到實際結果,進行斷言
        :return:
        """

        from selenium import webdriver

        #1.打開瀏覽器
        driver = webdriver.Chrome()
        #設置隱性等待 等待的時間就可以放在config中,直接參數調用
        ##方法一:放在yaml中
        wait_time = HandlerMiddle.yaml_data["selenium"]["wait_time"]
        ##方法二、放在config.py中
        #wait_time = Wait_time
        driver.implicitly_wait(wait_time)

        #2.訪問登錄頁面
        url = "http://120.78.128.25:8765/Index/login.html"
        driver.get(url)

        #3.元素定位+元素操作,輸入用戶名和密碼,點擊登錄
        driver.find_element_by_name("phone").send_keys("") #定位輸入手機號為空
        driver.find_element_by_name("password").send_keys("")#定位輸入的密碼為空
        driver.find_element_by_class_name("btn-special").click()

        #4.通過獲取頁面內容得到實際結果,進行斷言
        #實際結果是在頁面上的提示,再次進行定位
        actual_result = driver.find_element_by_class_name("form-error-info").text

        #斷言
        self.assertTrue(actual_result == "請輸入手機號")

上面代碼實際結果中的text,是webelement對象直接調用的webelement.py文件中的text屬性。

源碼如下:

@property
def text(self):
"""The text of the element."""
  return self._execute(Command.GET_ELEMENT_TEXT)['value']
Command.GET_ELEMENT_TEXT,是Command類調用的類屬性(GET_ELEMENT_TEXT = "getElementText")

總結:自動化用例,是selenium基礎操作的組合,根據用例設置,操作瀏覽器和頁面。

 

78節

上面是異常用例的自動化實現,下面進行正常用例的實現。

一般情況下:步驟不同,寫不同的測試用例的函數(根據cases.xlsx測試用例的步驟編寫)。

正常用例,以登錄來說,登錄成功,會跳轉到登錄成功的頁面。與異常用例不同的是,獲取實際結果跟斷言

首先看下登錄成功后,定位“我的賬戶”,通過Xpath進行定位查找,//a[@href="/Member/index.html"]

 

 

代碼實現:

下面的斷言,賬戶信息,用包含關系in:寫關鍵字或者全稱都OK,(用 ==的話,要注意查看actual_result是否與預期結果一致,這里是預期結果是寫死的,后面再參數化)

    def test_login_success(self):
        """登錄成功測試用例
        1.打開瀏覽器
        2.訪問登錄頁面
        3.元素定位+元素操作,輸入用戶名和密碼,點擊登錄
        4.通過獲取頁面內容得到實際結果,進行斷言
        :return:
        """
        from selenium import webdriver
        #1.打開瀏覽器
        driver = webdriver.Chrome()

        #設置隱性等待時間
        wait_time  = HandlerMiddle.yaml_data["selenium"]["wait_time"]
        driver.implicitly_wait(wait_time)

        #2.訪問登錄頁面
        url="http://120.78.128.25:8765/Index/login.html"
        driver.get(url)

        #3.元素定位+元素操作,輸入用戶名和密碼,點擊登錄
        driver.find_element_by_name("phone").send_keys("159********")
        driver.find_element_by_name("password").send_keys("15******")
        driver.find_element_by_class_name("btn-special").click()

        #4.獲取實際結果,進行斷言
        actual_result = driver.find_element_by_xpath("//a[@href='/Member/index.html']").text
        print(type(actual_result))
        self.assertTrue("我的帳戶[小蜜蜂177872141]" in actual_result)

 

4.用例篩選   ---引入pytest

背景:為什么進行用例篩選?

雖然實現了異常用例,但是用的比較少,因為在web自動化測試中,大多數情況下都是正向測試,主流程測試、回歸測試、冒煙測試;跑主流程,比如登錄成功。

所以在編寫web自動化測試用例的時候,可以將用例全部編寫,但是測試的時候,要進行用例篩選,只跑成功的用例。

unittest框架:將成功的用例,手動一個個添加到測試集testsuite中:suite.addTests(),比較麻煩    (接口自動化中用的是discover,自動發現全部的測試用例,這里就無法實現篩選了,所以web不能用discover)

 

下面引入pytest 框架

安裝pytest: pip install pytest 

pytest在web自動化方面更加智能,篩選用例方便 ------(pytest可以用於api,web,app自動化)

語法:(項目路徑下新建個pytest.ini文件,注冊標簽名)

1.在篩選的方法(用例)上,加“標簽”:@pytest.mark.標簽名

2.終端項目路徑下運行:pytest -m "標簽名"

 

下面運行登錄成功的用例結果:一共3個用例,只收集了成功的2個用例。

 運行結果后謎案,有warning,打的mark標簽,pytest無法識別,並給出細節查看鏈接,

 

 點擊鏈接查看:需要在pytest.ini文件中,把標簽添加上去,就不會有warning信息了。

 

 在項目路徑下新建一個普通文件,命名為pytest.ini,將markers提前編寫好,就不會出warning了

擴展:pytest.ini文件

pytest.ini文件是pytest的主配置文件,可以改變pytest的運行方式,它是一個固定的文件,pytest.ini文件讀取配置信息,按指定的方式去運行。

pytest.ini的位置:一般放在項目工程的根目錄(即當前項目的頂級文件夾下)

 

總結:標記功能的步驟

①先注冊:在ini文件中,先注冊mark的 名字

②打標簽:測試用例函數上面@property.mark.標簽名

③運行指定的標簽用例:pytest -m "標簽名"

 

pytest模塊規則:

①自動智能發現用例:模塊名以test開頭、結尾(否則不會當做是測試用例)-----發現用例規則

②測試類,不能有__init__(self)初始化的方法-----測試用例的類不需要初始化

③方法(函數),必須以test_開頭,類必須時Test

④pytest測試用例函數可以脫離類,可以直接使用函數的形式(測試用例的py文件直接寫為函數)------unittest中無此用法

⑤類可以不繼承unittest.TestSuite

(修改規則,78節50min),了解規則可以修改即可

 

總結:pytest的優點

①靈活的篩選用例

②不需要手動加載用例(不需要導入加載器,運行器),不需要手動添加,手動運行,直接一行運行代碼即可。

 ③pytest可以兼容unit test(unit test不能兼容pytest)

 

執行測試:

1.可以在pycharm中直接右鍵,以pytest方式運行,但是這個pycharm解釋器的特有功能,不建議使用。可以在pycharm的終端中運行

    -----如果的別人需要運行自己的自動化代碼,拷貝代碼到本機,可以直接在terminal中,cd到該項目的根目錄下,運行

2.運行 pytest  testcase -sv    表示運行testcase目錄下的所有的測試用例

   ---- 加上testcase目錄,比較安全,萬一別的目錄中的函數有test_開頭,會被pytest檢測到當作用例執行了

   ----  -s 可以把用例中的print信息顯示出來

   ---- -v 顯示詳細的測試結果在terminal    (可以組合表示為-sv)

   ---- 生成測試報告  --html=report.html --self-contained-html      (其中,如果不加--self-contained-html  ,會自動生成一個目錄,不需要該目錄就加上該這cmd)

 


免責聲明!

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



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